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; |