SparkStreaming + Kafka:轮询60000后无法获取记录

时间:2017-05-18 10:31:18

标签: apache-spark apache-kafka spark-streaming

我在Kafka上做Spark Streaming。流式传输作业开始正常并运行几个小时后才会遇到以下问题:

  

17/05/18 03:44:47错误执行者:阶段1864.0中的任务8.0中的异常(TID 27968)   java.lang.AssertionError:断言失败:在轮询60000后,无法获得spark-executor-c10f4ea9-a1c6-4a9f-b87f-8d6ff66e10a5 madlytics-rt_1 3 1150964759的记录           在scala.Predef $ .assert(Predef.scala:170)           在org.apache.spark.streaming.kafka010.CachedKafkaConsumer.get(CachedKafkaConsumer.scala:74)           在org.apache.spark.streaming.kafka010.KafkaRDD $ KafkaRDDIterator.next(KafkaRDD.scala:227)           在org.apache.spark.streaming.kafka010.KafkaRDD $ KafkaRDDIterator.next(KafkaRDD.scala:193)           在scala.collection.Iterator $$ anon $ 11.next(Iterator.scala:409)           在scala.collection.Iterator $$ anon $ 11.next(Iterator.scala:409)           在scala.collection.Iterator $$ anon $ 11.next(Iterator.scala:409)           在scala.collection.Iterator $$ anon $ 13.hasNext(Iterator.scala:462)           在scala.collection.Iterator $$ anon $ 11.hasNext(Iterator.scala:408)           在scala.collection.Iterator $$ anon $ 13.hasNext(Iterator.scala:461)           在scala.collection.Iterator $$ anon $ 13.hasNext(Iterator.scala:461)           在scala.collection.Iterator $$ anon $ 13.hasNext(Iterator.scala:461)           在scala.collection.Iterator $$ anon $ 11.hasNext(Iterator.scala:408)           在scala.collection.Iterator $$ anon $ 13.hasNext(Iterator.scala:461)           在scala.collection.Iterator $$ anon $ 11.hasNext(Iterator.scala:408)           在scala.collection.Iterator $$ anon $ 13.hasNext(Iterator.scala:461)           在scala.collection.Iterator $$ anon $ 11.hasNext(Iterator.scala:408)           在org.apache.spark.util.collection.ExternalSorter.insertAll(ExternalSorter.scala:192)           在org.apache.spark.shuffle.sort.SortShuffleWriter.write(SortShuffleWriter.scala:63)           在org.apache.spark.scheduler.ShuffleMapTask.runTask(ShuffleMapTask.scala:79)           在org.apache.spark.scheduler.ShuffleMapTask.runTask(ShuffleMapTask.scala:47)           在org.apache.spark.scheduler.Task.run(Task.scala:86)           在org.apache.spark.executor.Executor $ TaskRunner.run(Executor.scala:274)           在java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)           at java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:617)           在java.lang.Thread.run(Thread.java:745)

此外,我按照此处的建议适当增加了heartbeat.interval.mssession.timeout.msrequest.timeout.ms的值:https://issues.apache.org/jira/browse/SPARK-19275

以下是一些相关的配置:

batch.interval = 60s
spark.streaming.kafka.consumer.poll.ms = 60000
session.timeout.ms = 60000 (default: 30000)
heartbeat.interval.ms = 6000 (default: 3000)
request.timeout.ms = 90000 (default: 40000)

此外,Kafka群集是一个5节点,我正在阅读的主题有15个分区。下面列出了其他一些Kafka配置:

num.network.threads=8
num.io.threads=8

任何帮助将不胜感激。感谢。

2 个答案:

答案 0 :(得分:0)

根据我的经验,这种特殊的失败是Kafka集群过载的症状。通常的嫌疑人总是GC世界停留和线程挨饿。

除此之外,表面上的卡夫卡一切都可能没问题,但也许不是。

添加分区后,是否需要花费大量时间重新平衡?或者,由于您执行的所有负载测试,它是否维持一个巨大的偏移主题?

我曾经发生的事情是表面上的集群很好,但这种超时是在这里和那里出现的。在一个全新甚至更小的集群上,这个问题就消失了。

答案 1 :(得分:0)

我用一个简单的配置更改就解决了这个问题,这很明显,但是花了一些时间才意识到如何避免处理这样的默认(错误)配置。

主要问题是Spark配置spark.streaming.kafka.consumer.poll.ms(在KafkaRDD中默认为 512 ms)或spark.network.timeout(默认为120sec(如果{{1 }}未设置)始终小于Kafka使用者spark.streaming.kafka.consumer.poll.msKafka newconsumerapi中的默认 305000 ms)...因此,火花轮询总是在Kafka使用者发生超时之前超时请求/投票(当Kafka主题中没有可用记录时)。

只需将request.timeout.ms增加到大于Kafka spark.streaming.kafka.consumer.poll.ms的值即可。还要将卡夫卡消费者request.timeout.ms调整为始终小于max.poll.interval.ms

Q.E.D,祝你好运