【问题标题】:Spark Kafka Producer throwing Too many open files ExceptionSpark Kafka Producer 抛出太多打开的文件异常
【发布时间】:2020-09-21 23:46:04
【问题描述】:

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

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

提前致谢

【问题讨论】:

  • 能发一下spark job的代码吗?

标签: apache-spark apache-kafka spark-streaming kafka-producer-api


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2018-06-22
    • 1970-01-01
    • 1970-01-01
    • 2017-09-05
    • 2019-09-17
    • 1970-01-01
    • 2016-08-20
    • 2017-01-20
    • 1970-01-01
    相关资源
    最近更新 更多