Apache spark 使用Kafka direct stream消除纱线上的堆内存泄漏

Apache spark 使用Kafka direct stream消除纱线上的堆内存泄漏,apache-spark,spark-streaming,yarn,apache-spark-1.4,Apache Spark,Spark Streaming,Yarn,Apache Spark 1.4,我正在运行spark streaming 1.4.0 on Thread(Apache发行版2.6.0)和java 1.8.0_45以及Kafka direct stream。我也在使用支持scala 2.11的spark 我所看到的问题是,驱动程序和执行程序容器都在逐渐增加物理内存的使用,直到容器杀死它为止。我在我的驱动程序中配置了高达192M堆和384堆外空间,但它最终用完了 堆内存在常规GC循环中似乎没有问题。在任何此类运行中都不会遇到内存不足的问题 事实上,我没有在卡夫卡队列上产生任何流

我正在运行spark streaming 1.4.0 on Thread(Apache发行版2.6.0)和java 1.8.0_45以及Kafka direct stream。我也在使用支持scala 2.11的spark

我所看到的问题是,驱动程序和执行程序容器都在逐渐增加物理内存的使用,直到容器杀死它为止。我在我的驱动程序中配置了高达192M堆和384堆外空间,但它最终用完了

堆内存在常规GC循环中似乎没有问题。在任何此类运行中都不会遇到内存不足的问题

事实上,我没有在卡夫卡队列上产生任何流量,但这种情况仍然发生。这是我正在使用的代码

object SimpleSparkStreaming extends App {

val conf = new SparkConf()
val ssc = new StreamingContext(conf,Seconds(conf.getLong("spark.batch.window.size",1L)));
ssc.checkpoint("checkpoint")
val topics = Set(conf.get("spark.kafka.topic.name")); 
    val kafkaParams = Map[String, String]("metadata.broker.list" -> conf.get("spark.kafka.broker.list"))
            val kafkaStream = KafkaUtils.createDirectStream[String,String,StringDecoder,StringDecoder](ssc, kafkaParams, topics)
            kafkaStream.foreachRDD(rdd => {
                rdd.foreach(x => {
                    println(x._2)
                })

            })
    kafkaStream.print()
            ssc.start() 

            ssc.awaitTermination()

}
我在CentOS 7上运行这个。用于spark submit的命令如下

./bin/spark-submit --class com.rasa.cloud.prototype.spark.SimpleSparkStreaming \
--conf spark.yarn.executor.memoryOverhead=256 \
--conf spark.yarn.driver.memoryOverhead=384 \
--conf spark.kafka.topic.name=test \
--conf spark.kafka.broker.list=172.31.45.218:9092 \
--conf spark.batch.window.size=1 \
--conf spark.app.name="Simple Spark Kafka application" \
--master yarn-cluster \
--num-executors 1 \
--driver-memory 192m \
--executor-memory 128m \
--executor-cores 1 \
/home/centos/spark-poc/target/lib/spark-streaming-prototype-0.0.1-SNAPSHOT.jar 
非常感谢您的帮助

问候,


Apoorva

尝试增加executor cores。在您的示例中,唯一的内核专用于消费流数据,在传入数据中不留下任何可处理的内核。

这可能是内存泄漏。。。您是否尝试过conf.set(“spark.executor.extraJavaOptions”、“-XX:+UseG1GC”)

这不是卡夫卡的答案,这将与Spark以及其编目系统在一致持久性和大型操作方面的糟糕程度相隔离。如果您一直在向一个perisitence层写入数据(即在一个循环中,在一个大操作之后重新持久化一个DF,然后再次运行),或者运行一个大查询(即inputDF.distinct.count);Spark作业将开始将一些数据放入内存,而不会有效地删除过时的对象

这意味着一个能够快速运行一次的对象将稳定地减速,直到没有可用内存为止。对于家中的每个人,在环境中运行以下查询,在加载大数据帧的情况下启动AWS EMR:

var iterator = 1
val endState = 15
var currentCount = 0
while (iterator <= endState) {
  currentCount = inputDF.distinct.count
  print("The number of unique records are : " + currentCount)
  iterator = iterator + 1
}
如果不在子进程中取消持久化DFs,则以下是一个派生:

val interimDF = inputDF.action
val tempDF = interimDF.write.format(...).option("...","...").save("...")
for ((k,v) <- sc.getPersistentRDDs) {
  v.unpersist()
}
val interimDF = spark.read..format(...).option("...","...").save("...").persist
interimDF.count
val interimDF=inputDF.action
val tempDF=interimDF.write.format(…).option(“…”,“…”).save(“…”)

对于((k,v)我遇到了同样的问题,你找到解决方案了吗?我有一个类似的问题,但还没有达到饱和点:如果你找到了一些解决方案,请告诉我。我发现自己处于同样的情况,你有没有找到原因或解决方法?这是DirectStream,一个执行器核心就可以了
val interimDF = inputDF.action
val tempDF = interimDF.write.format(...).option("...","...").save("...")
for ((k,v) <- sc.getPersistentRDDs) {
  v.unpersist()
}
val interimDF = spark.read..format(...).option("...","...").save("...").persist
interimDF.count