在分组中由YARN杀死的火花容器

时间:2017-02-15 20:22:07

标签: apache-spark yarn

我有一个从Hbase中提取的数据集,这是一个很长的宽表格形式,即rowKeycolumnQualifiervalue列。为了获得一种枢轴形式,我需要将rowKey(字符串UUID)分组到一个集合中,并从集合中创建一个对象。问题是只有我能够执行的group-by才能计算组中元素的数量;由于超出YARN容器限制的内存溢出导致容器被杀死,因此其他分组失败。我确实对内存大小进行了大量实验,包括开销,分区有和没有分类等。我甚至进入了大量的分区,即大约10 000,但是工作就死了。我尝试了DataFrame groupBycollect_list,以及数据集grouByKeymapGroups

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

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

1 个答案:

答案 0 :(得分:1)

你可能正在遇到可怕的groupByKey洗牌。请阅读avoiding groupByKey上的这篇Databricks文章,其中详细介绍了这两个函数之间的潜在差异。

如果你不想阅读这篇文章,那么简短的故事是这样的:尽管groupByKeyreduceByKey产生了相同的结果,groupByKey实例化了一整套ALL数据, reduceByKey尝试通过先减少数据来最小化数据混乱。有点像MapReduce Combiners,如果你熟悉这个概念的话。