由数千个KafkaMbean实例引起的Spark结构化流OutOfMemoryError

时间:2019-05-23 08:17:24

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

火花结构化流执行器失败,并显示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,但事实并非如此。

1 个答案:

答案 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版本的补丁。