在spark的shuffle进程中,什么决定了shuffle write任务和shuffle read任务的数量?

6tqwzwtp  于 2021-05-29  发布在  Spark
关注(0)|答案(0)|浏览(521)

我知道spark的shuffle过程包括两个阶段:shuffle write和shuffle read。作为我自己,我认为shuffle write任务的数量是由最后一个rdd的分区数决定的,这个分区对应于一个任务。同时,我也不认为shuffle会改变rdd的分区号,除非指定了分区号,比如reducebykey(1000)或者repartition(1000),否则新阶段rdd的分区号应该等于最后一阶段rdd的分区号。但我最近看到的东西似乎和我预想的不太一样。
对于shuffle write任务的数量,我还没有找到一个明确的解释,但我自己的想法是,它是由最后一个rdd在最后一个阶段的分区数决定的;
关于shuffle read task,有这样一种说法,如果没有设置参数spark.default.parallelism,那么新stage的分区号是由上一个stage中最后一个rdd的较大分区号决定的(例如:导致join操作符的stage被分割),分区号应该等于task,所以我知道,洗牌写任务的数量是由最后一个RDD的较大分区数决定的;但是如果设置了参数spark.default.parallelism,那么新阶段的分区数由参数决定,据我所知,shuffle write任务的数量也由参数决定。
我不太清楚这种理解有什么问题,所以我想问一个更了解是什么决定了这两项任务的数量的人。谢谢你的回答~
考虑这一点的原因是,有人提出了一种数据倾斜的解决方案,即增加无序读取任务的数量,以减少每个任务处理的数据的大小。然而,该方案仅适用于大多数密钥对应于大量数据的情况。在只有少数几个键的情况下,由于仍有大量的数据经过一两个任务的处理,效果有限甚至不存在,这并不能从根本上缓解数据倾斜的影响。

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题