在 group by 期间被 YARN 杀死的 Spark 容器

Spark containers killed by YARN during group by

我有一个从 Hbase 中提取的数据集,它是宽 table 的长形式,即有 rowKeycolumnQualifiervalue 列。要获得一种形式的数据透视表,我需要按 rowKey(一个字符串 UUID)分组到一个集合中,并从该集合中创建一个对象。问题是我设法执行的唯一分组依据是计算组中元素的数量;由于内存溢出超出 YARN 容器限制而导致容器被杀死,因此其他 group-bys 失败。我确实对内存大小进行了很多实验,包括开销、带排序和不带排序的分区等。我什至进入了大量分区,即大约 10 000,但工作同样结束。我尝试了 DataFrame groupBycollect_list,以及 Dataset grouByKeymapGroups

该代码适用于小型数据集,但不适用于较大的数据集。 Parquet 文件中的数据集约为 500 GB。数据没有倾斜,因为 group by 中最大的组只有 50 个元素。因此,据我所知,分区应该很容易适合内存,因为每个 rowKey 的聚合数据并不是很大。数据键值多为字符串,长度不多

我使用的是 Spark 2.0.2;上面的计算都是用 Scala 完成的。

您可能 运行 进入可怕的 groupByKey 洗牌。请阅读 avoiding groupByKey 上的这篇 Databricks 文章,其中详细介绍了这两个函数之间的根本区别。

如果您不想阅读这篇文章,那么简短的故事是这样的:虽然 groupByKeyreduceByKey 产生相同的结果,但 groupByKey 实例化了所有数据的洗牌,而 reduceByKey 尝试通过先减少来最小化数据混洗。有点像 MapReduce Combiners,如果你熟悉这个概念的话。