Apache spark 卡夫卡+;火花流:kafka.common.offsetAutoFrangeException

Apache spark 卡夫卡+;火花流:kafka.common.offsetAutoFrangeException,apache-spark,pyspark,apache-kafka,spark-streaming,kafka-consumer-api,Apache Spark,Pyspark,Apache Kafka,Spark Streaming,Kafka Consumer Api,我对卡夫卡/火花这件事还不熟悉。我让Spark Streaming(PySpark)接收卡夫卡制作人的数据。它正常运行一分钟,然后总是抛出一个kafka.common.offsetAutoFrangeException。卡夫卡消费者版本为0.8(显然,PySpark不支持0.10)。我有一个主节点,在AWS Ubuntu 14.04上有3个工作节点。我不知道这是否相关,但这里的卡夫卡日志相对较大(~1-10kb),我已经相应地调整了生产者/经纪人/消费者配置。数据的传递很好,虽然可能比我认为的制

我对卡夫卡/火花这件事还不熟悉。我让Spark Streaming(PySpark)接收卡夫卡制作人的数据。它正常运行一分钟,然后总是抛出一个
kafka.common.offsetAutoFrangeException
。卡夫卡消费者版本为0.8(显然,PySpark不支持0.10)。我有一个主节点,在AWS Ubuntu 14.04上有3个工作节点。我不知道这是否相关,但这里的卡夫卡日志相对较大(~1-10kb),我已经相应地调整了生产者/经纪人/消费者配置。数据的传递很好,虽然可能比我认为的制作人可能产生的速度慢(这可能是问题的根源?)

通过增加此处的保留时间/大小,解决了类似的问题:

但我的保留时间是一小时,每个节点的
服务器.properties
中的大小是1GB,更重要的是,Spark的故障时间和设置的保留时间/大小没有变化

是否有其他调整的可能性,可能在Spark Streaming配置上?我在网上看到的所有答案都与卡夫卡资源调配有关,但在我的案例中似乎没有什么不同

编辑1:我尝试了a)让多个流从生产者读取,b)用
时间来减慢生产者流本身的速度。sleep(1.0)
。两者都没有持久的效果

i、 e


是否有可能您的生产者生成太多的消息太快,以至于每个代理上的1G不够?1G在所有现实中似乎都很低。Spark Streaming决定了它需要在微批处理中处理的偏移量范围并尝试根据偏移量从代理检索消息后,由于大小限制,消息将消失。请将代理大小增加到100G,看看这是否能解决您的问题

是否可能是您的生产者生成太多的消息太快,以至于每个代理上的1G不够?1G在所有现实中似乎都很低。Spark Streaming决定了它需要在微批处理中处理的偏移量范围并尝试根据偏移量从代理检索消息后,由于大小限制,消息将消失。请将代理大小增加到100G,看看这是否能解决您的问题

看起来您正在使用0.8中的新消费者,对吗?我猜这是通过引导服务器而不是zk连接实现的。您如何提交偏移量?@dawsaw它是自动提交的,但在周末我想我已经确定这是Spark流媒体中的一个背压问题。看起来您正在使用0.8中的新消费者,对吗?我猜这是通过引导服务器而不是zk连接实现的。如何提交偏移量?@dawsaw它是自动提交的,但在周末我想我已经确定这是Spark Streaming中的一个背压问题。我同意(经过进一步测试)几乎可以肯定是制作人生成了Spark Streaming无法跟上的消息。但我认为我需要更改我正在制作的内容和/或Spark配置,而不是更改Kafka配置。我同意(经过进一步测试后)几乎可以肯定的是,Spark Streaming无法跟上制作者生成消息的步伐。但我认为我需要更改我正在生产的和/或Spark配置,而不是更改Kafka配置。
n_secs = 1
ssc = StreamingContext(sc, n_secs)
kds = [KafkaUtils.createDirectStream(ssc, ['test-video'], {
                    'bootstrap.servers':'localhost:9092', 
                    'group.id':'test-video-group', 
                    'fetch.message.max.bytes':'15728640',
                    'auto.offset.reset':'largest'}) for _ in range(n_streams)]

stream = ssc.union(*kds)