spark streaming-on-yarn-java运行时环境内存不足,无法继续运行

nue99wik  于 2021-06-07  发布在  Kafka
关注(0)|答案(1)|浏览(420)

这是一个在yarn集群模式下运行的spark流应用程序,它在三个kafka代理中生成消息。
一旦达到150k打开文件,它就会失败:

There is insufficient memory for the Java Runtime Environment to continue
Native memory allocation (mmap) failed  to map 12288 bytes for committing reserved memory.

Job aborted due to stage failure ... : 
org.apache.kafka.common.KafkaException: Failed to construct kafka producer
.....
Caused by: java.lang.OutOfMemoryError: unable to create new native thread

什么时候做 lsof -p <PID> 对于运行该executor的java进程,我可以在kafka代理中看到来自主机服务器的成吨(高达90k)tcp连接: host:portXXX->kafkabroker1:XmlIpcRegSvc (ESTABLISHED) host:portYYY->kafkabroker2:XmlIpcRegSvc (ESTABLISHED) host:portZZZ->kafkabroker3:XmlIpcRegSvc (ESTABLISHED) 我尝试将executor内核的数量从8个减少到6个,但是在打开的文件数量上没有任何差别(仍然达到150k),然后一直失败。
从spark streaming连接到kafka的库有:

org.apache.spark.streaming.kafka010.KafkaUtils
org.apache.spark.streaming.dstream.InputDStream
org.apache.kafka.clients.producer.kafkaproducer

代码:

foreachRDD{
   get kafkaProducer
   do some work on each RDD...
   foreach( record => {
      kafkaProducer.send(record._1,record._2)
   }
  kafkaProducer.close()
}
kcugc4gi

kcugc4gi1#

那是小学生的错误。这篇解释得很好的文章帮助解决了这个问题。Kafka制作人没有关闭连接,所以我们使用广播和延迟评估技术解决了这个问题。

相关问题