【发布时间】:2021-09-26 22:47:08
【问题描述】:
我想问一下我在 spark 工作中遇到的数据倾斜问题。 我知道如果你的数据有偏差,最佳实践技巧之一就是做盐腌技术。 在我的 Spark 工作中,我必须在两个数据帧之间进行连接(其中一个大小约为 5 GB)。
此外,我通常通过数字和用于连接的字段重新分区,以便在连接之前尽可能多地控制分区。因此,我将使用 shuffle 的连接转换为具有窄依赖关系的映射连接。
df.repartition(numRep, colJoin: _*).sortWithinPartitions(colJoin: _*)
场景是:
- 我有 24 个执行器,每个执行器有 4 个核心
- 我将 shufflePartitions 设置为 96
- 我避免用
spark.conf.set("spark.sql.autoBroadcastJoinThreshold", -1)自动广播 - 连接前的重新分区数为 192 (2*96)(线程的两倍)。因此,我每个执行程序有 8 个任务/分区
问题是在加盐之后,我还没有数据倾斜,连接需要很长时间。
所以,我的问题是:我该怎么办?增加腌制次数?腌制两次或更多次?增加重新分区的数量?有什么函数可以知道哪个分区的数据偏斜吗?
【问题讨论】:
标签: scala performance apache-spark optimization