Spark Kafka Producer抛出太多打开的文件 Exception

问题描述 投票:0回答:1

我正在尝试运行一个用Java编写的Spark Kafka Job,以每批次向一个Kafka Topic产生大约10K条记录。这是一个spark批处理作业,在一个循环中依次读取100个(共100万条记录)hdfs部分文件,并在一个批次中产生每个部分文件的10K记录。我使用的是org.apache.kafka.client.producer.KafkaProducer API。

得到下面的异常。

org.apache.kafka.common.KafkaException: Failed to construct kafka producer
....
Caused by: org.apache.kafka.common.KafkaException: java.io.IOException: Too many open files
....
Caused by: java.io.IOException: Too many open files

下面是配置。

Cluster Resource availability:
---------------------------------
The cluster has more than 500 nodes, 150 Terabyte total memory, more than 30K cores

Spark Application configuration:
------------------------------------
Driver_memory: 24GB
--executor-cores: 5
--num-executors: 24
--executor-memory: 24GB

Topic Configuration:
--------------------
Partitions: 16
Replication: 3

Data size
----------
Each part file has 10K records
Total records 1million
Each batch produce 10K records

请提出一些解决方案,因为这是一个非常关键的问题。

先谢谢你

apache-spark apache-kafka spark-streaming apache-kafka-streams kafka-producer-api
1个回答
0
投票

在Kafka中,每个主题(可选择)被分割成许多分区。对于每个分区,一些文件是由经纪人维护的(用于索引和实际数据)。

kafka-topics --zookeeper localhost:2181 --describe --topic topic_name

将会给你主题的分区数量。topic_name. 每个主题的默认分区数 num.partitions 定义为 /etc/kafka/server.properties

如果经纪商托管了许多分区,而且某个分区有许多日志段文件,那么打开的文件总数可能很大。

您可以通过运行以下命令查看当前的文件描述符限制

ulimit -n

你也可以用以下方法检查打开的文件数量。lsof:

lsof | wc -l

为了解决这个问题,你需要改变打开文件描述符的限制。

ulimit -n <noOfFiles>

或者以某种方式减少打开的文件数量(例如,减少每个主题的分区数量)。

© www.soinside.com 2019 - 2024. All rights reserved.