使用 Spark Dataset/DataFrame 连接时,我面临长时间运行并因 OOM 作业而失败。
这是输入:
- 约 10 个不同大小的数据集,大部分都很大(>1 TB)
- 所有左连接到一个基础数据集
- 一些连接键是
null
经过一些分析,我发现作业失败和缓慢的原因是null
倾斜键:当左侧有数百万条带有连接键的记录时null
.
我采取了一些蛮力方法来解决这个问题,在这里我想分享一下。
如果您有更好的或任何内置的解决方案(对于常规 Apache Spark),请分享。
我不久前也遇到过同样的问题,但在进行一些性能测试后我选择了另一种方法。这取决于您的数据,数据会告诉您解决此连接问题的更好算法是什么。
就我而言,连接左侧有超过 30% 的数据为 null,并且数据采用 parquet 格式。鉴于此,我最好执行filter
当该键为空且该键不为空时,仅当不为空时才加入,然后将两个数据合并。
val data = ...
val notJoinable = data.filter('keyToJoin.isNull)
val joinable = data.filter('keyToJoin.isNotNull)
joinable.join(...) union notJoinable
它也避免了热点。如果我使用你的方法(负数/无论什么不是“可连接”值),spark将洗牌所有这些数据,这是大量数据(超过30%)。
只是想向您展示解决问题的另一种方法,
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)