scala - 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
字段都具有相同的值( )。t1
null
目前,Spark 集群在单个任务上挂起超过 10 分钟,以便执行此连接,并且由于数据倾斜。此时只有一名工人和该工人的一项任务在工作。所有其他 9 名工人都处于空闲状态。如何改进此连接以便将负载从这一特定任务分配到整个 Spark 集群?
解决方案
我假设你正在做内部连接。
可以按照以下步骤来优化连接 - 1. 在连接之前,我们可以根据最小或最大的 start_date、event_date、end_date 过滤掉 t1 和 t2。它将减少行数。
检查 t2 数据集是否有 field1 的空值,如果没有,则可以根据 notNull 条件过滤加入 t1 数据集。它将减小 t1 大小
如果您的工作获得的执行者数量少于可用的执行者,那么您的分区数量就会减少。只需对数据集重新分区,设置一个最佳数字,这样就不会出现大量分区,反之亦然。
您可以通过查看任务执行时间来检查分区是否正确(无偏斜),它应该是相似的。
检查较小的数据集是否可以放入执行器内存中,可以使用广播连接。
推荐阅读
- spring - 如何使用不明确的 pom 启用 log4j2?
- javascript - javascript Uncaught TypeError for map
- dart - 如何修复 Flutter 本地身份验证的平台异常错误“auth_in_progress”?
- python - 需要帮助使用 bs4 和 python 从幻灯片中抓取图像
- php - Symfony 检查输入数据是否唯一
- ubuntu - 如何查看 cron 修改时间?
- django - 在模板的表单操作中使用子流程
- javascript - 显示图像而不是使用 javascript 下载
- awk - 将文本文件与 awk 中的所有字段混合
- reactjs - redux-form 未触及字段验证在提交时失败