Spark - 在写作之前将kafka偏移量收集到驱动程序中

时间:2018-01-30 22:59:12

标签: scala apache-spark apache-kafka spark-streaming

我有一个高容量的kafka主题,我想从中编写批量偏移量。我目前正在使用以下方法。在这种情况下,流是一个InputDStream(我最后使用DStream中的GenericRecord值)。

val my_offsets = stream.foreachRDD { rdd =>
  val offsetRanges = rdd.asInstanceOf[HasOffsetRanges].offsetRanges
  rdd.foreachPartition { iter =>
    val o: OffsetRange = offsetRanges(TaskContext.get.partitionId)
    val tOffsets = (o.topic, o.partition, o.untilOffset)

    writeOffsetsToMyDatasource(tOffsets)
  }
}

然而,这会导致每个kafka分区写入任何给定的数据存储区(MySQL,ZK,Hbase等),这会在尝试使用大量分区进行小批量处理时产生不良结果。

我找不到一种方法来将offsetRanges收集到驱动程序中,这是首选,因为每个批处理(例如对于mysql),指定的值会节省大量不必要的写入。

1 个答案:

答案 0 :(得分:0)

val offsetRanges = rdd.asInstanceOf[HasOffsetRanges].offsetRanges

您的offsetRanges 位于驱动程序中。您可以将offsetRanges序列化为首选内容,然后将其写入您想要的任何来源。

顺便说一下, val o: OffsetRange = offsetRanges(TaskContext.get.partitionId)

您的offsetRanges数组的长度与rdd的分区数相等,foreachRDD和默认设置(spark.streaming.concurrentJobs = 1)我认为can have undesirable results when trying to do small time batches with a large number of partitions.无论如何都不会发生。