簡體   English   中英

YARN上的Spark流-沒有足夠的內存供Java運行時環境繼續

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM