我正在尝试运行一个用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
请提出一些解决方案,因为这是一个非常关键的问题。
先谢谢你
在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>
或者以某种方式减少打开的文件数量(例如,减少每个主题的分区数量)。