【问题标题】: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() 方法对每个分区执行任何操作——您只需提供一个函数,该函数对分区数据进行迭代并在结果中返回一个迭代器数据,可以是不同的类型。您可以通过地图进行分组,当您处理完所有输入后将其发回。

标签: jdbc apache-spark


【解决方案1】:

是的,您需要使用 mapPartitions。您可以访问分区中所有记录的迭代器。您只是从那里编写 Scala 代码,并且可以做您喜欢做的事情,包括建立一个批次 ID 到记录的 Map。请注意,这必须适合内存,但如果这很重要,您始终可以减小分区大小。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-09
    • 2017-06-06
    • 2016-05-03
    • 1970-01-01
    • 2013-03-12
    • 2012-05-23
    • 1970-01-01
    相关资源
    最近更新 更多