上一篇文章介绍在idea里远程连接Hadoop的实例WordCount,但在实际过程中很难一次就能成功运行的,会出现各种问题:
远程无法访问HDFS文件系统
出现报错如下:

I/O error

Failed to connect to /127.0.0.1:50010
原因分析:虚拟机上安装的 Hadoop 配置文件是以内网IP作为机器间通信的IP。在这种情况下,我们能够访问到namenode机器,namenode会给我们数据所在机器的IP地址供我们访问数据传输服务,但是返回的的是datanode内网的IP,我们无法根据该IP访问datanode服务器。
为了能够让开发机器访问到 hdfs ,我们可以通过域名访问 hdfs 。
1.首先注意虚拟机的hosts文件,我的虚拟机的主机名是hadoop01,在hosts文件必须增加:
0.0.0.0 hadoop01
2.在与hdfs交互的程序中添加如下代码:
import org.apache.hadoop.conf.Configuration;
Configuration conf = new Configuration();
//设置通过域名访问datanode
conf.set("dfs.client.use.datanode.hostname", "true");
也就是在WordCout.java 的main方法里加

3.在idea配置应用的参数是:

IP与端口必须与虚拟机的Hadoop环境一致,在通过50070端口的HDFS管理界面中可以在概览处看到hadoop01:9000是Hadoop文件系统的默认端口

4.在win10主机上必须正确配置Hadoop的环境变量:HADOOP_HOME和PATH
无法将文件上传到HDFS上
- 执行 hdfs dfs -put localfile /etc/Hadoop-2.xxx 时提示:
put: Permission denied: user=root, access=WRITE, inode="/etc/Hadoop-2.xxx":hdfs:supergroup:drwxr-xr-x
原因:权限不够。这里涉及到两个方面的权限。一个是本地文件系统中localfile 文件的权限,一个是HDFS上 /etc/Hadoop-2.xxx目录的权限。
2.如果排除是权限问题,可能是DataNode出问题了,可以执行命令:
hdfs dfsadmin -report
如果看如下返回信息说明DataNode有问题:Configured Capacity: 0 (0 B)
可以删除Hadoop主目录下的hdfs文件夹及其配置文件中tmp文件夹下的所有文件,重新格式化hdfs。
./sbin/stop-dfs.sh
./sbin/stop-yarn.sh
rm -rf /tmp/*
rm -rf -r /etc/Hadoop-2.10.1/hdfs
./bin/hdfs namenode -format