Spark任务并行度分析

本文探讨了Spark应用中并行度的优化策略,详细分析了影响并行度的关键因素,包括RDD分区数、计算场景下的分区数设定、以及如何通过repartition和coalesce调整分区数。同时,文章提供了最佳实践,指导如何根据CPU核心数合理设置分区数,以及如何观察和调整任务执行时间以提高效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

优化 Spark 应用的一个主要手段就是合理设置任务执行的并行度,尽可能的利用集群资源
,从而提高执行效率。而影响 spark 并行度的因素主要有如下几个:

RDD 的分区数(Partition )

Spark 应用默认会为每一个 RDD 分区创建一个 Task, 所以输入 RDD 的分区数直接影响待
分配的 Task 总数,Task 任务数如果少于分配的计算资源(cores ),则可能造成部分资
源没有充分得到利用。

不同计算场景下的分区数

  • 文件输入类的如 textFile 等操作,默认的分区数 = 输入文件的大小 /
    dfs.block.size, 意思是 Spark 默认会尽可能确保一个分区仅包含一个 HDFS BLOCK 的
    数据,增加 dfs.block.size 可以降低分区数 / Task 数(但是增加了每个任务的处理
    数据量),反之则相反。textFile 也支持附带一个分区数量的参数,手工指定分区数。
  • 涉及 shuffle 的操作(join,reduceByKey 等),默认的分区数为父级 RDD 的最大分区
    数。也可以设置 spark.default.parallelism 参数来指定默认的分区数
  • 手工指定分区数,不管是什么操作,都可以通过 repartition 来对 RDD 重新进行分区,
    增加或减少分区数。如果仅仅是减少分区数,建议使用 coalesce 操作替代。

分区数的最佳实践

  • Spark 建议每个 CPU CORE 分配 2-3 个任务,意味着最佳分区数 =2 excutorNum in
    Cluster available cores per Excutor
  • 观察每个 Task 在 Excutor 中的执行时间,如果时间很短(小于 1S),说明每个 Task
    的计算量太小了,此时应通过设置降低 Task 数量,提高单个 Task 的计算量; 否则用
    于任务切换和序列化的开销将大大增加。

计算资源的分配

Spark 一次能并行处理的任务由两个方面决定:

  • 集群中 excutor 的数量:由于 Driver 不负责具体的任务执行,所以并行度仅与集群中
    Excutor 数量相关;
  • 每个 Excutor 中可用的 CPU CORE 数量,该数量由配置参数 spark.executor.cores 决
    定,该参数在 Yarn 模式默认是 1,在 standalong 模式下默认是本机的所有可用
    core;

参考资料

http://www.bigsynapse.com/spark-input-output

http://spark.apache.org/docs/1.6.0/programming-guide.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值