我有一个高容量的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),指定的值会节省大量不必要的写入。
答案 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.
无论如何都不会发生。