Producer偶现发送数据失败,日志提示“Too many open files in system”
问题背景与现象
在使用Producer向Kafka发送数据功能时,发现客户端发送失败。
可能原因
- Kafka服务异常。
- 网络异常。
- Kafka Topic异常。
原因分析
- 查看Kafka服务状态:
- MRS Manager界面操作:登录MRS Manager,依次选择“服务管理 > Kafka”,查看当前Kafka状态,发现状态为良好,且监控指标内容显示正确。
- FusionInsight Manager界面操作:登录FusionInsight Manager,选择“集群 > 服务 > Kafka”,查看当前Kafka状态,发现状态为良好,且监控指标内容显示正确。
- 查看SparkStreaming日志中提示错误的Topic信息。
执行Kafka相关命令,获取Topic分布信息和副本同步信息,观察返回结果。
kafka-topics.sh --describe --zookeeper <zk_host:port/chroot>
如图2所示,发现对应Topic状态正常。所有Partition均存在正常Leader信息。
- 通过telnet命令,查看是否可以连接Kafka。
如果无法telnet成功,请检查网络安全组与ACL。
- 通过SSH登录Kafka Broker。
通过cd /var/log/Bigdata/kafka/broker命令进入日志目录。
查看server.log发现如下日志抛出java.io.IOException: Too many open files in system。
图3 日志异常
- 通过lsof命令查看当前节点Kafka进程句柄使用情况,发现占用的句柄数达到了47万。
图4 句柄数
- 排查业务代码,不停地创建新的Producer对象,未正常关闭。
解决办法
- 停止当前应用,保证服务端句柄不再疯狂增加影响服务正常运行。
- 优化应用代码,解决句柄泄露问题。
建议:全局尽量使用一个Producer对象,在使用完成之后主动调用close接口进行句柄关闭。