1. 环境搭建
- IntelliJ IDEA 新建 Maven 项目- 勾选 Create from archetype
- 选择 org.apache.maven.archetypes:maven-archetype-quickstart,点击Next
- Maven home directory可以默认,也可以选择自己安装的Maven目录
- User settings file勾选Override,选择用户自定义的~/.m2/settings.xml文件
 
- 勾选 
- pom.xml配置
| 1 | 
 | 
2. 编写测试类
2.1. 调用fileSystem.mkdir方法创建文件夹
测试代码:
| 1 | package org.example; | 
2.1.1. 异常处理
- 连接异常:java.net.ConnectException: Connection refused
异常代码:
| 1 | HDFSApp.setUp | 
解决方法:
(1)使用jps命令查看Hdfs是否运行;
(2)查看服务器防火墙是否开放8020端口;
(3)查看服务器Hadoop安装目录下etc/core-site.xml中地址是否配置为服务器公网ip;  
| 1 | root@brave-post-2:~# $HADOOP_HOME/sbin/start-dfs.sh | 
- 访问控制权限异常:org.apache.hadoop.security.AccessControlException: Permission denied: user=yan, access=WRITE, inode="/":root:supergroup:drwxr-xr-x- 解决方法:使用FileSystem.get的重载方法,给出user参数值为root
 
- 解决方法:使用
2.2. 调用FileSystem.create方法创建文件
测试代码:
| 1 | 
 | 
2.2.1. 异常处理
运行上面方法,hdfs无法写入内容,出现以下异常
| 1 | org.apache.hadoop.ipc.RemoteException(java.io.IOException): File /hdfsapi/test/a.txt could only be replicated to 0 nodes instead of minReplication (=1). There are 1 datanode(s) running and 1 node(s) are excluded in this operation. | 
出现上面异常的原因有很多,具体信息可以查看日志文件hadoop-root-datanode-brave-post-2.localdomain.log:
经过一番盘查试错,终,之前在core-site.xml文件中,将localhost改为0.0.0.0,导致了这个问题。
正确配置应为  
| 1 | <configuration> | 
重新启动HDFS之后,打开浏览器查看DataNode info:

此时DN节点显示的是公网ip+端口,客户端重新运行测试类createFile方法,成功创建并写入文本文件内容。Hadoop运行在公网服务器时,想要Java客户端能够通过Java API操作HDFS,必须通过配置让节点在 Datanode Information 中显示的是正在使用公网ip地址。
- 试错期间还遇到了clusterID不一致的问题,查看datanode节点的日志输出异常java.io.IOException: Incompatible clusterIDs:
| 1 | 2020-06-12 07:16:54,343 WARN org.apache.hadoop.hdfs.server.common.Storage: java.io.IOException: Incompatible clusterIDs in /home/root/app/tmp/dfs/data: namenode clusterID = CID-401a9f8e-e699-4aa9-9f8c-0ef5bd016863; datanode clusterID = CID-42b312a4-8c81-4582-8d33-d8dafa23fe4e | 
找到解决方法:
出现该问题的原因:在第一次格式化dfs后,启动并使用了hadoop,后来又重新执行了格式化命令(hdfs namenode -format),这时namenode的clusterID会重新生成,而datanode的clusterID 保持不变。
解决方法:将datanode的clusterID改成和上面日志中的namenode的clusterID一样。
| 1 | root@brave-post-2:/home/root/app/tmp/dfs/data/current# cat VERSION | 
2.3. 副本系数 replication factor
问题:我们已经在hdfs-site.xmL中设置了副本系数为1,为什么此时查询文件看到的是3呢?
如果你是通过hdfs shell的方式put上去的,那么才采用xml配置中的副本系数1;
如果我们是java api上传上去的,在本地我们并没有手工设置副本系数,所以采用的是hadoop默认的副本系数3.
测试代码:
| 1 | package org.example; |