优化 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
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/15728.html