按“内部”分区键进行有效分组
Posted
技术标签:
【中文标题】按“内部”分区键进行有效分组【英文标题】:Efficient grouping by key "within" partitions 【发布时间】:2014-09-28 19:50:39 【问题描述】:我正在尝试调整流程以激发火花。 基本上,该过程分析来自 JDBC 数据源的批量数据 每条记录都有一个batchId,还有一个更高级别的groupId。
批次数量很大(预先未知)。
组数约为 100。
每个批次的记录数可以容纳在 RAM 中。
实际分析代码无所谓,但不适合reduceByKey或combineByKey等更具体的模型
我的想法是:
使用jdbcRdd读取数据,使用“group id”进行分区
使用 group by batchId 准备数据
使用地图应用业务逻辑。
瓶颈似乎是 groupByKey,据我了解,这将强制进行洗牌(将数据写入磁盘) - 即使每个批次都包含在单个分区中。
另一种可能的方法是使用 batchId 进行分区,但这会创建大量的分区 - 因此会产生大量的查询
有没有办法在分区内按键执行分组? 还有其他可能的方法吗?
【问题讨论】:
您几乎可以使用RDD
上的mapPartitions()
方法对每个分区执行任何操作——您只需提供一个函数,该函数对分区数据进行迭代并在结果中返回一个迭代器数据,可以是不同的类型。您可以通过地图进行分组,当您处理完所有输入后将其发回。
【参考方案1】:
是的,您需要使用 mapPartitions。您可以访问分区中所有记录的迭代器。您只是从那里编写 Scala 代码,并且可以做您喜欢做的事情,包括建立一个批次 ID 到记录的 Map。请注意,这必须适合内存,但如果这很重要,您始终可以减小分区大小。
【讨论】:
以上是关于按“内部”分区键进行有效分组的主要内容,如果未能解决你的问题,请参考以下文章