【问题标题】:Spark Streaming on YARN - There is insufficient memory for the Java Runtime Environment to continueYARN 上的 Spark Streaming - 内存不足,Java 运行时环境无法继续
【发布时间】:2018-02-11 10:21:38
【问题描述】:

这是一个运行在 YARN 集群模式下的 Spark Streaming 应用程序,它在三个 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

当为运行该执行程序的 java 进程执行 lsof -p <PID> 时,我可以看到来自 Kafka Brokers 中主机服务器的大量 TCP 连接(最多 90K):

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()
}

【问题讨论】:

  • 您使用什么库从 Spark 连接到 Kafka?你能给我们看一些代码吗?
  • 更新了更多信息
  • 你看到这个答案了吗? stackoverflow.com/a/16789621/2796894
  • 是的,但我认为从 Kafka Producer 创建的 Kafka 连接应该首先关闭而不是保持打开状态 - 需要超过 90K 与 Kafka 代理的 ESTABLISHED 连接听起来太过分了

标签: java apache-kafka spark-streaming hadoop-yarn


【解决方案1】:

这是一个小学生的错误。这很好地解释了article 帮助解决了这个问题。 kafka 生产者没有关闭连接,所以我们使用广播和惰性评估技术解决了这个问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-02-19
    • 2017-08-13
    • 2014-02-22
    • 2018-05-20
    • 2020-09-03
    • 1970-01-01
    • 1970-01-01
    • 2022-10-06
    相关资源
    最近更新 更多