首页 > 解决方案 > Apache Spark、范围连接、数据倾斜和性能

问题描述

我有以下 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

DataFrame 中的几乎所有t1.field1字段都具有相同的值( )。t1null

目前,Spark 集群在单个任务上挂起超过 10 分钟,以便执行此连接,并且由于数据倾斜。此时只有一名工人和该工人的一项任务在工作。所有其他 9 名工人都处于空闲状态。如何改进此连接以便将负载从这一特定任务分配到整个 Spark 集群?

标签: scalaapache-sparkapache-spark-sql

解决方案


我假设你正在做内部连接。

可以按照以下步骤来优化连接 - 1. 在连接之前,我们可以根据最小或最大的 start_date、event_date、end_date 过滤掉 t1 和 t2。它将减少行数。

  1. 检查 t2 数据集是否有 field1 的空值,如果没有,则可以根据 notNull 条件过滤加入 t1 数据集。它将减小 t1 大小

  2. 如果您的工作获得的执行者数量少于可用的执行者,那么您的分区数量就会减少。只需对数据集重新分区,设置一个最佳数字,这样就不会出现大量分区,反之亦然。

  3. 您可以通过查看任务执行时间来检查分区是否正确(无偏斜),它应该是相似的。

  4. 检查较小的数据集是否可以放入执行器内存中,可以使用广播连接。

您可能想阅读 - https://github.com/vaquarkhan/Apache-Kafka-poc-and-notes/wiki/Apache-Spark-Join-guidelines-and-Performance-tuning


推荐阅读