Apache spark 引发群情激愤

Apache spark 引发群情激愤,apache-spark,Apache Spark,我在一个相当小的数据集上做了一个简单的groupBy(HDFS中有80个文件,总共很少Gig)。我在一个纱线集群中的8台低内存机器上运行Spark,即沿着以下路线运行: spark提交--主纱线客户机——num executors 8——executor memory 3000m——executor cores 1 数据集由长度为500-2000的字符串组成 我正在尝试执行一个简单的groupByKey(请参见下文),但它失败了,出现了java.lang.OutOfMemoryError:GC开

我在一个相当小的数据集上做了一个简单的groupBy(HDFS中有80个文件,总共很少Gig)。我在一个纱线集群中的8台低内存机器上运行Spark,即沿着以下路线运行:

spark提交--主纱线客户机——num executors 8——executor memory 3000m——executor cores 1

数据集由长度为500-2000的字符串组成

我正在尝试执行一个简单的
groupByKey
(请参见下文),但它失败了,出现了
java.lang.OutOfMemoryError:GC开销限制超出了
异常

val keyvals = sc.newAPIHadoopFile("hdfs://...")
  .map( someobj.produceKeyValTuple )
keyvals.groupByKey().count()
我可以使用
reduceByKey
毫无问题地计算组大小,确保问题不是由单个过大的组或过多的组引起的:

keyvals.map(s => (s._1, 1)).reduceByKey((a,b) => a+b).collect().foreach(println)
// produces:
//  (key1,139368)
//  (key2,35335)
//  (key3,392744)
//  ...
//  (key13,197941)
我尝试过重新格式化、改组和提高groupBy并行度:

keyvals.groupByKey(24).count // fails
keyvals.groupByKey(3000).count // fails
keyvals.coalesce(24, true).groupByKey(24).count // fails
keyvals.coalesce(3000, true).groupByKey(3000).count // fails
keyvals.coalesce(24, false).groupByKey(24).count // fails
keyvals.coalesce(3000, false).groupByKey(3000).count // fails
我尝试过使用
spark.default.parallelism
,将
spark.shuffle.memoryFraction
增加到
0.8
,同时将
spark.storage.memoryFraction
降低到
0.1

失败阶段(计数)将在3000的任务2999上失败


我似乎找不到任何证据表明groupBy不应该仅仅溢出到磁盘,而应该将内容保存在内存中,但我就是无法让它正常工作,即使是在相当小的数据集上。显然情况并非如此,我一定是做错了什么,但我不知道从哪里开始调试它

Patrick Wendell透露了groupBy操作符的一些细节。外卖信息如下:

在一个分区内,事情将溢出[…]此时,溢出只能发生在键之间。目前钥匙内不能发生溢出。[…]在GroupBy的一个键内溢出可能会在Spark的下一个版本Spark 1.2中结束。[…]如果目标是直接将与每个组关联的所有值写入磁盘,并且与单个组关联的值大于内存中的值,那么groupBy操作符现在无法实现这一点

他进一步提出了一个解决方案:

解决这一问题的最佳方法在一定程度上取决于您试图如何处理下游数据。典型的方法包括细分任何非常大的组,例如,将小范围(1-10)内的散列值附加到大键上。然后,下游代码必须处理为每个组聚合部分值的问题。如果您的目标只是在一个大文件的磁盘上按顺序排列每个组,那么您也可以使用哈希后缀调用
sortByKey
。排序功能在Spark 1.1(预发布版)中具体化


有什么特别的吗?我想我已经触及了那篇文章中提到的大部分要点。Tbh,我真正想要的,是解释为什么groupBy会消耗内存,而不仅仅是洗牌到磁盘。老实说,很多spark的问题都可以通过升级版本来解决,它肯定有它的问题,但也有一个非常活跃的社区,在1.0.0、1.0.1和1.1.0-Snapshot上造成了同样的问题,好吧,如果
reduceByKey
有效,但
groupByKey
无效,那么我发现除了一个庞大的团队之外,很难得出任何结论!392744是一个相当大的数字,取决于您的类型。你有没有试过对计数进行排序,找出哪一个最大?你确定它们都在那个数量级吗??