Pyspark Kafka偏移范围单位

时间:2017-01-27 17:05:17

标签: apache-spark pyspark apache-kafka kafka-consumer-api kafka-python

我使用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偏移范围的单位是什么?

提前致谢!

1 个答案:

答案 0 :(得分:0)

Kafka偏移单位是消息。在每个周期,您将获得来自Kafka的大多数untilOffest - fromOffset条消息。但是数据只能从一个主题分区中读取,因此如果您的主题有更多分区,那么应用程序将错过一些日志行。

作为替代方案,您可以尝试spark streaming with kafka direct approach。使用此方法您将摆脱while True,您将使用可选的背压机制,根据时间(非固定偏移)处理微型计算机中的日志行。然后你可以省略在内存中保存偏移(流将处理它),但是在驱动程序重启时仍然需要将它们保存到磁盘(参见KafkaUtils.createDirectStream中的fromOffsets)。

相关问题