火花结构化流执行器失败,并显示OutOfMemoryError
使用VirtualVM检查堆分配表明JMX Mbean Server内存使用量随时间呈线性增长。
经过进一步的调查,似乎JMX Mbean充满了数千个KafkaMbean对象实例,这些实例的消费者-(\ d +)指标成千上万(等于在执行程序上创建的任务数)。
运行Kafka使用者并在执行程序上使用DEBUG日志显示,执行程序添加了数千个指标传感器,通常根本不删除它们,或者仅删除了一些
我正在使用HDP Kafka 1.0.0.2.6.5.0-292运行HDP Spark 2.3.0.2.6.5.0-292。
这是初始化结构化流的方法:
sparkSession
.readStream
.format("kafka")
.options(Map("kafka.bootstrap.servers" -> KAFKA_BROKERS,
"subscribePattern" -> INPUT_TOPIC,
"startingOffsets" -> "earliest",
"failOnDataLoss" -> "false"))
.mapPartitions(processData)
.writeStream
.format("kafka")
.options(Map("kafka.bootstrap.servers" -> KAFKA_BROKERS,
"checkpointLocation" -> CHECKPOINT_LOCATION))
.queryName("Process Data")
.outputMode("update")
.trigger(Trigger.ProcessingTime(1000))
.load()
.start()
.awaitTermination()
我期望Spark / Kafka在任务完成时正确地清理MBean,但事实并非如此。
答案 0 :(得分:0)
您的HDP版本可能使用的是spark 2.3.1,它具有一个从Kafka读取数据的已知错误(当您从每个微批中没有新数据的主题中读取时,会出现此问题):
https://issues.apache.org/jira/browse/SPARK-24987
https://issues.apache.org/jira/browse/SPARK-25106
此错误是由于2.3.1版中进行了更改(2.3.0版中不存在)导致的,因此您可以升级spark版本或获取HDP版本的补丁。