![](/img/trans.png)
[英]Spark Structured Streaming not restarting at Kafka offsets
[英]Spark - Collect kafka offsets to driver before writing
我有一个大量的kafka主题,我想从中编写批处理偏移量。 我目前正在使用以下方法。 在这种情况下,stream是一个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)具有指定的值将节省很多不必要的写入。
val offsetRanges = rdd.asInstanceOf[HasOffsetRanges].offsetRanges
您的offsetRanges
在driver中 。 您可以将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.
这种情况can have undesirable results when trying to do small time batches with a large number of partitions.
反正不会发生。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.