2014-09-28 67 views
2

我正在尝试使一个进程适应火花。 基本上,该过程分析来自JDBC数据源的批次数据,每个记录都有一个batchId,也是一个更高级别的groupId。通过键“分区内”进行高效分组

  • 批次数很大(预先未知)。

  • 组数为〜100。

  • 每个批次的记录数可以放入RAM中。

实际分析代码并不重要,但它不适合reduceByKey的更具体的型号或combineByKey

我的想法是:

  • 使用jdbcRdd阅读数据,使用“组ID”进行分区

  • 使用groupId来准备数据

  • 使用映射来应用业务逻辑。

的瓶颈似乎是groupByKey,从我的理解将强制洗牌(将数据写入到磁盘) - 尽管每个批次被包含在一个分区。

另一个可能的方法是使用batchId的分区,但是这将创建一个非常大的数目的分区 - 和为此的大量的查询

有没有办法通过一个分区内键执行一组? 任何其他可能的方法?

+2

你可以使用'RDD'上的'mapPartitions()'方法在每个分区的基础上做几乎任何事情 - 只需提供一个函数,该函数对分区数据使用迭代器并返回结果数据,可以是不同的类型。您可以通过地图进行分组,您可以在处理完所有输入后发送回地图。 – 2014-09-29 02:03:47

回答

7

是的,你需要使用mapPartitions。您访问分区中所有记录的Iterator。你只是从那里写Scala代码,并且可以做你喜欢的事情,包括建立一个批记录地图到记录。这必须适应记忆,但是如果重要的话,你总是可以减小分区大小。