我正在尝试运行一个用java编写的spark-kafka作业,每批生成一个kafka主题的大约10k条记录。这是一个spark批处理作业,它在一个循环中顺序读取100个(总计100万条记录)hdfs零件文件,并在一个批处理中生成每一个包含10k条记录的零件文件。我正在使用org.apache.kafka.clients.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
请提出一些解决方案,因为这是一个非常关键的问题。
提前谢谢
1条答案
按热度按时间fumotvh31#
在Kafka中,每个主题(可选)都被分割成许多分区。对于每个分区,一些文件由代理维护(用于索引和实际数据)。
将为主题提供分区数
topic_name
. 每个主题的默认分区数num.partitions
定义如下/etc/kafka/server.properties
如果代理托管许多分区,并且某个分区有许多日志段文件,那么打开的文件的总数可能会很大。您可以通过运行
您还可以使用
lsof
:要解决此问题,您需要更改打开的文件描述符的限制:
或者以某种方式减少打开文件的数量(例如,减少每个主题的分区数量)。