我们有一个运行在Spark 2.3.3上的Spark Streaming应用程序
基本上,它会打开一个Kafka流:
kafka_stream = spark \
.readStream \
.format("kafka") \
.option("kafka.bootstrap.servers", "mykafka:9092") \
.option("subscribe", "mytopic") \
.load()
kafka主题有2个分区。之后,在列上进行一些基本的过滤操作,一些Python UDF和explode(),例如:
stream = apply_operations(kafka_stream)
apply_operations在数据上完成所有工作。最后,我们想将流写入接收器,即。 e。:
stream.writeStream \
.format("our.java.sink.Class") \
.option("some-option", "value") \
.trigger(processingTime='15 seconds') \
.start()
要让此流操作永久运行,请应用:
spark.streams.awaitAnyTermination()
最后。
到目前为止,太好了。一切都运行了几天。但是由于网络问题,工作死了几天了,现在卡夫卡流中有数百万条消息正在等待赶上。
当我们使用spark-submit重新启动流数据作业时,第一批将太大,并且需要一些时间才能完成。我们认为可能有一种方法可以通过一些参数来限制第一批的大小,但是我们发现没有任何帮助。
我们尝试过:
spark.streaming.backpressure.enabled = true以及spark.streaming.backpressure.initialRate = 2000和spark.streaming.kafka.maxRatePerPartition = 1000和spark.streaming.receiver.maxrate = 2000
将spark.streaming.backpressure.pid.minrate设置为较低的值也没有效果
设置选项(“ maxOffsetsPerTrigger”,10000)也没有效果
现在,在我们重新启动管道之后,迟早整个Spark Job都会再次崩溃。我们不能简单地扩展用于火花作业的内存或内核。
是否有任何我们想控制一次流批量处理的事件数量的东西?
答案 0 :(得分:3)
您在注释中写道,您正在使用spark-streaming-kafka-0-8_2.11,并且该api版本无法处理maxOffsetPerTrigger(或其他据我所知的减少消耗的消息数量的机制),仅{ {3}}用于较新的API implemented。根据{{3}},此更新的api还可与您的kafka版本0.10.2.2一起使用。