我有以下 Apache Spark SQL 连接谓词:
t1.field1 = t2.field1 and t2.start_date <= t1.event_date and t1.event_date < t2.end_date
数据:
t1 DataFrame have over 50 millions rows
t2 DataFrame have over 2 millions rows
t1
DataFrame 中的几乎所有 t1.field1
字段都具有相同的值(null
)。
现在,Spark 集群在单个任务上挂起超过 10 分钟,以便执行此连接并且由于数据倾斜。此时只有一名 worker 和该 worker 的一项任务在工作。所有其他 9 名 worker 都处于闲置状态。如何改进此连接以便将负载从这个特定任务分配到整个 Spark 集群?
最佳答案
我假设您正在进行内部联接。
可以按照以下步骤来优化连接 - 1.加入前我们可以根据最小或最大的start_date、event_date、end_date过滤掉t1和t2。它将减少行数。
检查 t2 数据集的 field1 是否有空值,如果没有,可以在加入 t1 数据集之前根据 notNull 条件进行过滤。它将减小 t1 大小
如果您的作业只获得比可用执行器少的执行器,那么您的分区数量就会减少。只需对数据集进行重新分区,设置一个最佳数量,这样你就不会得到大量的分区,反之亦然。
您可以通过查看任务执行时间来检查分区是否正确发生(没有偏斜),它应该是相似的。
检查较小的数据集是否适合执行程序内存,可以使用 broadcast_join。
关于scala - Apache Spark、范围连接、数据倾斜和性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55460923/