spark kafka制作人抛出太多打开的文件异常

brc7rcf0  于 2021-05-29  发布在  Spark
关注(0)|答案(1)|浏览(445)

我正在尝试运行一个用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

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

fumotvh3

fumotvh31#

在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>

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

相关问题