【发布时间】:2018-10-08 00:38:08
【问题描述】:
在 Spark 中使用 Dataset.groupByKey(_.key).mapGroups 或 Dataset.groupByKey(_.key).cogroup 时,当其中一个分组导致超过 2GB 的数据时,我遇到了问题。
在开始减少数据之前,我需要按组对数据进行规范化,并且我想将这些组分成更小的子组,以便它们更好地分布。例如,这是我尝试拆分组的一种方法:
val groupedInputs = inputData.groupByKey(_.key).mapGroups {
case(key, inputSeries) => inputSeries.grouped(maxGroupSize).map(group => (key, group))
}
但不幸的是,尽管我尝试解决它,但我的工作总是因以下错误而死:java.lang.UnsupportedOperationException: Cannot grow BufferHolder by size 23816 because the size after growing exceeds size limitation 2147483632。使用 Kryo 序列化时,我收到不同的 Kryo serialization failed: Buffer overflow 错误,建议我增加 spark.kryoserializer.buffer.max,但我已经将其增加到 2GB 限制。
我想到的一个解决方案是在对键进行分组之前向它们添加一个随机值。这并不理想,因为它会分裂每个群体(不仅仅是大群体),但我愿意为了“工作”而牺牲“理想”。该代码看起来像这样:
val splitInputs = inputData.map( record => (record, ThreadLocalRandom.current.nextInt(splitFactor)))
val groupedInputs = splitInputs.groupByKey{ case(record, split) => (record.key, split)).mapGroups {
case((key, _), inputSeries) => inputSeries.grouped(maxGroupSize).map(group => (key, group.map(_._1)))
}
【问题讨论】:
标签: apache-spark apache-spark-dataset