CDH虚拟机环境下Talend向HDFS传文件为空且报错求助
解决HDFS文件创建但内容为空+复制节点失败问题
这个问题我碰到过好几次——核心是HDFS的DataNode虽然表面显示运行,但实际上没法接收数据块,导致文件能创建(因为NameNode处理了元数据)但写不进内容,最终出现复制失败的报错。给你一步步排查的方案:
先确认DataNode的真实状态
别光看Cloudera Manager显示的“运行中”,得实打实检查:- 登录虚拟机执行命令:
hdfs dfsadmin -report,看输出里的Live datanodes是不是真的有1个,以及该节点的可用存储空间、节点状态有没有异常 - 查看DataNode的日志文件(默认路径是
/var/log/hadoop-hdfs/hadoop-hdfs-datanode-*.log),搜索关键词block pool、storage directory,大概率能找到问题根源——比如磁盘满了、存储目录权限不对、目录损坏
- 登录虚拟机执行命令:
检查DataNode存储目录的权限
DataNode的存储目录必须归hdfs用户和组所有,权限至少是755:- 先找到存储目录:在Cloudera Manager的HDFS服务配置里搜
dfs.datanode.data.dir,拿到路径 - 执行命令:
ls -ld /your-datanode-storage-path,确认权限是drwxr-xr-x且属主是hdfs:hdfs - 如果不对,修正权限:
sudo chown -R hdfs:hdfs /your-datanode-storage-path,再执行sudo chmod -R 755 /your-datanode-storage-path
- 先找到存储目录:在Cloudera Manager的HDFS服务配置里搜
排查网络和防火墙问题
虽然是虚拟机,网络不通也会导致NameNode找不到DataNode:- 在虚拟机里测试DataNode端口连通性:
telnet localhost 50010(数据传输端口)和telnet localhost 50020(IPC端口),如果连不上说明DataNode没正常监听 - 确认Windows主机能ping通虚拟机IP,Talend里配置的NameNode地址必须是虚拟机的IP(不能写
localhost,因为Talend在Windows上运行,localhost指的是Windows本机) - 临时关闭虚拟机的防火墙测试:
sudo systemctl stop firewalld(CentOS/RHEL系统),如果关闭后能上传成功,就需要在防火墙上开放HDFS相关端口
- 在虚拟机里测试DataNode端口连通性:
确认HDFS复制因子配置
因为你只有1个DataNode,复制因子必须设为1:- 在Cloudera Manager的HDFS服务配置里搜
dfs.replication,确保值是1 - 也可以用命令行验证:
hdfs getconf -confKey dfs.replication
- 在Cloudera Manager的HDFS服务配置里搜
重启HDFS服务
如果上面的检查都没问题,试着重启HDFS的NameNode和DataNode:- 在Cloudera Manager里选HDFS服务,点击“重启”按钮
- 或者命令行执行:
sudo service hadoop-hdfs-namenode restart和sudo service hadoop-hdfs-datanode restart
Talend端的额外验证
排除Talend本身的问题:- 确认tHDFSPut组件里的NameNode地址是虚拟机IP,端口为8020(CDH默认的NameNode端口)
- 确认本地文件路径正确,Talend有权限读取该文件(别放在Windows的受保护目录,比如
C:\Program Files) - 先手动用HDFS命令行上传测试:
hdfs dfs -put /your-local-file-path/Input.xml /user/cloudera/test/,如果命令行也失败,说明问题完全在HDFS端,和Talend无关
内容的提问来源于stack exchange,提问作者Vish
相关产品推荐
相关产品推荐

