资源利用角度
- 基本概念:
这里先简单介绍一下partition与core的概念。
core为最小的计算单元,partition为最小的文件对象,一个core处理一个partition
cores = num-executors * executor-cores
输入RDD的partition数目取决于上游文件在hdfs上的part数目
- 原因:
在计算过程中如果分区数太小不能充分利用计算资源
分区数太多则会很多小tasks, 会增加管理任务的开销(1000分区以下不太有感觉,但是如果part数上万的话就会非常慢)
- 建议:
在执行action计算的时候partition的数目为cores数目的3~4倍比较好。
如果cores的数目与partitions的数目一样多,执行过程中任务挂掉重启或者有数据倾斜的情况下任务最终的完成时间会较长。而设成3~4倍话相对来说会使得数据更加均匀,能够更好的平衡最快task与最慢task。
- 操作:
使用coalesce()与reparation()方法,在计算流程中手工调整partition的数目,同时注意spark.sql.shuffle.partitions这个参数的配置,它代表这咱在shuffle之后的输出数目。
[coalesce()与reparation的区别 ]:(https://medium.com/@mrpowers/managing-spark-partitions-with-coalesce-and-repartition-4050c57ad5c4)