我有一个从Hbase中提取的数据集,这是一个很长的宽表格形式,即rowKey
,columnQualifier
和value
列。为了获得一种枢轴形式,我需要将rowKey
(字符串UUID)分组到一个集合中,并从集合中创建一个对象。问题是只有我能够执行的group-by才能计算组中元素的数量;由于超出YARN容器限制的内存溢出导致容器被杀死,因此其他分组失败。我确实对内存大小进行了大量实验,包括开销,分区有和没有分类等。我甚至进入了大量的分区,即大约10 000,但是工作就死了。我尝试了DataFrame groupBy
和collect_list
,以及数据集grouByKey
和mapGroups
。
代码适用于小型数据集,但不适用于较大的数据集。 Parquet文件中的数据集大约为500 GB。数据没有偏差,因为group by中的最大组只有50个元素。因此,众所周知,分区应该很容易适合内存,因为每rowKey
的聚合数据不是很大。数据键和值主要是字符串,并且没有多长时间。
我正在使用Spark 2.0.2;上面的计算都是Scala完成的。
答案 0 :(得分:1)
你可能正在遇到可怕的groupByKey
洗牌。请阅读avoiding groupByKey上的这篇Databricks文章,其中详细介绍了这两个函数之间的潜在差异。
如果你不想阅读这篇文章,那么简短的故事是这样的:尽管groupByKey
和reduceByKey
产生了相同的结果,groupByKey
实例化了一整套ALL数据, reduceByKey
尝试通过先减少数据来最小化数据混乱。有点像MapReduce Combiners
,如果你熟悉这个概念的话。