Docker部署Hadoop集群Flume写HDFS生成0字节文件报错如何解决
报错诱因
核心为Docker容器化Hadoop的网络适配问题:
- bde2020系列Hadoop镜像默认配置下,NameNode会向客户端返回DataNode的Docker内部私有网段IP(如报错日志中的
192.168.192.10、192.168.192.11等)。你的Flume Agent直接运行在宿主机,无法直接访问Docker内部网段,因此连接DataNode的50010数据传输端口时触发Connection refused异常。 - 你已配置的
/etc/hosts将datanode1/2/3指向本地环回地址,但默认NameNode返回的是DataNode的IP而非hostname,所以hosts配置未生效。 - 手动通过Web UI上传文件正常的原因是:Web UI上传走NameNode代理转发逻辑,不需要客户端直接和DataNode通信,不会触发跨网络访问问题。
修复步骤
- 调整docker-compose.yml的Hadoop配置:
- 为每个DataNode服务添加环境变量
HDFS_DATANODE_HOSTNAME,值对应为datanode1/datanode2/datanode3,和你hosts中配置的hostname保持一致 - 为NameNode服务添加环境变量
HDFS_NAMENODE_DATANODE_REGISTRATION_IP_HOSTNAME_CHECK: false,关闭IP校验,允许DataNode使用hostname注册 - 为每个DataNode添加端口映射,将容器内50010端口映射到宿主机的不同端口,示例:
ports: - "50010:50010" # datanode1对应映射 - "50011:50010" # datanode2对应映射 - "50012:50010" # datanode3对应映射
- 为每个DataNode服务添加环境变量
- 修改Flume的agent.conf配置,在HDFS Sink配置段添加以下参数,强制HDFS客户端使用hostname连接DataNode:
agent.sinks.hdfs-sink.hdfs.use-datanode-hostname = true agent.sinks.hdfs-sink.hdfs.client.use.datanode.hostname = true - 重启整个Hadoop Docker集群,再重新启动Flume Agent即可解决问题。
内容的提问来源于stack exchange,提问作者Ben
相关产品推荐
相关产品推荐

