【发布时间】: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