我使用Spark作为批处理来处理来自kafka的日志。 在每个循环中,我的代码应该得到任何到达kafka消费者的东西。但是,我想对每个周期从kafka获取的数据量进行重新设置。比方说5 GB或500000对数行..
offsetRanges = []
def storeOffsetRanges(rdd):
global offsetRanges
offsetRanges = rdd.offsetRanges()
WRITE OFFSETS TO DISK
return rdd
while True:
host = "localhost:9092"
offset = OffsetRange(topic, 0, fromOffset, untilOffset)
kafka_content = KafkaUtils.createRDD(sc, {"metadata.broker.list": host}, [offset])
kafka_content.transform(storeOffsetRanges)
RDD TRANSFORMATIONS..
如果驱动程序出现故障,我会将偏移量存储在内存和磁盘中。但是,我如何强制这些kafka偏移来限制每个周期的最大数据? kafka偏移范围的单位是什么?
提前致谢!
答案 0 :(得分:0)
Kafka偏移单位是消息。在每个周期,您将获得来自Kafka的大多数untilOffest - fromOffset
条消息。但是数据只能从一个主题分区中读取,因此如果您的主题有更多分区,那么应用程序将错过一些日志行。
作为替代方案,您可以尝试spark streaming with kafka direct approach。使用此方法您将摆脱while True
,您将使用可选的背压机制,根据时间(非固定偏移)处理微型计算机中的日志行。然后你可以省略在内存中保存偏移(流将处理它),但是在驱动程序重启时仍然需要将它们保存到磁盘(参见KafkaUtils.createDirectStream中的fromOffsets
)。