Kafka DirectStream的Spark Streaming问题:
spark streaming assertion failed:无法获取记录 在轮询4096之后,spark-executor-a-group a-topic 7 244723248
尝试:
1)调整增加spark.streaming.kafka.consumer.poll.ms
- 从512到4096,失败较少,但即使失败仍然存在10秒
2)将执行程序内存从1G调整为2G
- 部分工作,更不用说失败了
3)https://issues.apache.org/jira/browse/SPARK-19275
- 当流媒体持续时间小于8秒时仍然失败(“session.timeout.ms” - >“30000”)
4)尝试Spark 2.1
- 问题仍然存在
使用Scala 2.11.8,Kafka版本:0.10.0.0,Spark版本:2.0.2
Spark configs
.config("spark.cores.max", "4")
.config("spark.default.parallelism", "2")
.config("spark.streaming.backpressure.enabled", "true")
.config("spark.streaming.receiver.maxRate", "1024")
.config("spark.streaming.kafka.maxRatePerPartition", "256")
.config("spark.streaming.kafka.consumer.poll.ms", "4096")
.config("spark.streaming.concurrentJobs", "2")
使用spark-streaming-kafka-0-10-assembly_2.11-2.1.0.jar
错误堆栈:
at scala.Predef$.assert(Predef.scala:170)
at org.apache.spark.streaming.kafka010.CachedKafkaConsumer.get(CachedKafkaConsumer.scala:74)
at org.apache.spark.streaming.kafka010.KafkaRDD$KafkaRDDIterator.next(KafkaRDD.scala:228)
at org.apache.spark.streaming.kafka010.KafkaRDD$KafkaRDDIterator.next(KafkaRDD.scala:194)
at scala.collection.Iterator$class.foreach(Iterator.scala:893)
at org.apache.spark.streaming.kafka010.KafkaRDD$KafkaRDDIterator.foreach(KafkaRDD.scala:194)
...
at com.datastax.spark.connector.cql.CassandraConnector$$anonfun$withSessionDo$1.apply(CassandraConnector.scala:109)
at com.datastax.spark.connector.cql.CassandraConnector$$anonfun$withSessionDo$1.apply(CassandraConnector.scala:108)
at com.datastax.spark.connector.cql.CassandraConnector.closeResourceAfterUse(CassandraConnector.scala:142)
at com.datastax.spark.connector.cql.CassandraConnector.withSessionDo(CassandraConnector.scala:108)
...
at org.apache.spark.rdd.RDD$$anonfun$foreachPartition$1$$anonfun$apply$29.apply(RDD.scala:925)
at org.apache.spark.rdd.RDD$$anonfun$foreachPartition$1$$anonfun$apply$29.apply(RDD.scala:925)
at org.apache.spark.SparkContext$$anonfun$runJob$5.apply(SparkContext.scala:1944)
at org.apache.spark.SparkContext$$anonfun$runJob$5.apply(SparkContext.scala:1944)
at org.apache.spark.scheduler.ResultTask.runTask(ResultTask.scala:87)
at org.apache.spark.scheduler.Task.run(Task.scala:99)
at org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:282)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
失败1%+阻止来自Kafka的数据失败:(请帮忙!
答案 0 :(得分:3)
目前的解决方案:
num.network.threads
,默认为3 spark.streaming.kafka.consumer.poll.ms
值〜!一个大...
没有配置spark.streaming.kafka.consumer.poll.ms,它使用的是spark.network.timeout,这是120s - 导致一些问题 答案 1 :(得分:1)
我用一个简单的配置更改就解决了这个问题,这很明显,但是花了一些时间才意识到如何避免处理这样的默认(错误)配置。
主要问题是Spark配置spark.streaming.kafka.consumer.poll.ms
(在KafkaRDD中默认为 512 ms)或spark.network.timeout
(默认为120sec(如果{{1 }}未设置)始终小于Kafka使用者spark.streaming.kafka.consumer.poll.ms
(Kafka 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,祝你好运
答案 2 :(得分:0)
对我有用的解决方案:
max.partition.fetch.bytes
。推理:当消费者轮询来自Kafka的记录时,它会预取数据达到此数量。如果网络速度较慢,则可能无法预取全部金额,CachedKafakConsumer
中的轮询将超时。