打乱花费太多时间完成的最后一项任务



在此输入图像描述我有大约80GB的数据,一切都很顺利,直到最后一个洗牌任务出现,所有任务都在30分钟内完成,但最后一个任务需要2个多小时才能完成。在此处输入图像描述联接:(左联接(连接3个表,其中一个表的数据相对较小(2MB(,对于该设置广播变量,即使我删除了第三个表,它也没有解决我的问题。

下面是配置的参数。

spark.conf.set("spark.sql.autoBroadcastJoinThreshold", "904857600")
spark.conf.set("spark.cleaner.referenceTracking.blocking", "false")
spark.conf.set("spark.cleaner.periodicGC.interval", "5min")
spark.conf.set("spark.default.parallelism","6000")
spark.conf.set("spark.sql.shuffle.partitions","2000")
spark.conf.set("spark.serializer", "org.apache.spark.serializer.KryoSerializer")

您正遭受数据倾斜的困扰。从本质上讲,大部分工作由一个节点完成,而不是分布在多个节点上。这就是为什么我想要澄清工作或[任务/阶段]。

您应该考虑在联接键中添加salt,以帮助在多个节点之间分配工作。它将需要更多的洗牌,但它将吸取对一个节点完成所有工作的影响。

  1. 向联接中的所有列添加盐

  2. 做你的3路加入,包括盐柱。

  3. 然后通过执行第二组操作,从查询中删除salt。

这样可以更好地分配工作。

相关内容