[英]Spark Streaming on YARN - There is insufficient memory for the Java Runtime Environment to continue
這是在YARN集群模式下運行的Spark Streaming應用程序,可在三個Kafka Broker中生成消息。
一旦達到15萬個打開文件,它就會失敗:
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
當對運行該執行程序的java進程執行lsof -p <PID>
,我可以從Kafka Brokers中的主機服務器看到大量(最多90K)TCP連接:
host:portXXX->kafkabroker1:XmlIpcRegSvc (ESTABLISHED)
host:portYYY->kafkabroker2:XmlIpcRegSvc (ESTABLISHED)
host:portZZZ->kafkabroker3:XmlIpcRegSvc (ESTABLISHED)
我嘗試將執行程序核心的數量從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()
}
這是一個小學生錯誤。 這篇解釋得很好的文章有助於解決此問題。 卡夫卡制作人並未關閉連接,因此我們使用了廣播和惰性評估技術來解決該問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.