spark full outer join目前存在一个问题,那就是在数据倾斜的时候,会导致Execuotr OOM:具体的问题描述,可以见SPARK-24985,
转述一下就是:
SortMergeJoinExec类以下代码块的处理:
doExecute
||
\/
case FullOuter =>
val leftNullRow = new GenericInternalRow(left.output.length)
val rightNullRow = new GenericInternalRow(right.output.length)
val smjScanner = new SortMergeFullOuterJoinScanner(
leftKeyGenerator = createLeftKeyGenerator(),
rightKeyGenerator = createRightKeyGenerator(),
keyOrdering,
leftIter = RowIterator.fromScala(leftIter),
rightIter = RowIterator.fromScala(rightIter),
boundCondition,
leftNullRow,
rightNullRow)
new FullOuterIterator(
smjScanner,
resultProj,
numOutputRows).toScala
其中SortMergeFullOuterJoinScanner在迭代的时候对左右两边匹配的数据保存在内存中,这个内存是没有边界的,具体的处理方法如下:
private def findMatchingRows(matchingKey: InternalRow): Un

Spark在执行FullOuterJoin时,遇到数据倾斜可能导致Executor内存溢出(OOM)。问题主要出在SortMergeFullOuterJoinScanner类中,它在内存中存储匹配的左右两侧数据,而没有设定内存限制。当匹配数据量过大时,会消耗过多内存,引发OOM。解决方案可能涉及优化数据分布或调整Join策略。
最低0.47元/天 解锁文章
2094

被折叠的 条评论
为什么被折叠?



