- 实验目的
掌握HDFS安装、HDFS命令和HDFS Java API编程。
- 实验内容
- 掌握HDFS命令使用方法;
- 熟悉开发环境配置和编码过程;
- 掌握HDFS Java API的基本用法。
- 实验步骤
一、HDFS配置和启动
修改HDFS配置并在集群中启动HDFS。
二、HDFS命令行测试
在集群节点中输入HDFS命令行完成目录管理和文件上传/下载等操作,具体完成以下操作:
- 查看HDFS根目录;
- 在HDFS根目录创建文件夹test;
- 从Linux中上传一个文件至HDFS的/test目录;
- 将该文件从HDFS下载至/Home目录中。
三、HDFS Java API测试
1. 在IntelliJ IDEA或Eclipse环境中创建一个Maven项目,并使用HDFS的Java API操作HDFS
(1) 下载IntelliJ IDEA或Eclipse,并创建Maven项目;
参考博客:idea建立一个maven项目
(2) 编辑pom.xml文件,引用必要的Hadoop和HDFS组件,注意Hadoop中的JDK版本与Windows中的版本保持一致,操作方法和maven配置方法见《IntelliJ IDEA配置HDFS Java API》;
查询maven组件配置https://mvnrepository.com/
需要查询的组件(自己判断合适的版本):
hadoop-client
hadoop-hdfs
hadoop-common
将所有查询到的组件的XML插入到<dependencies></dependencies>节点中去,如下图:
中间出现了Idea卡在Resolving Maven dependencies这个问题
解决方案参考博客:
Idea卡在Resolving Maven dependencies的解决方案
最后
更换镜像源,参考博客:
IntelliJ IDEA 中更改 maven 镜像源
(3) 使用Java API编写代码并调试,将Windows中的一个文件上传至HDFS指定目录,常见异常参见《HDFS Java API常见异常解决方案》;
写程序时出现的问题:
参考博客:IntelliJ IDEA的Project目录不显示SRC目录和鼠标右键新建时,选项没有Java class的解决方法和具体解释
中间出现的问题:
·hadoop客户端操作出现:
Exception in thread "main" org.apache.hadoop.security.AccessControlException:
参考博客:
·could only be written to 0 of the 1 minReplication nodes.
解决方案:
- 关闭集群:
在Hadoop的对应目录下,进行sbin/stop-all.sh
- 删除dfs文件下的数据第二步:删除所有名字为dfs的文件夹,我这里有以下两个文件夹,分别删除两次:
所有节点都需要
rm -rf /home/hadoop/dfs/data/*
rm -rf /home/hadoop//tmp/dfs/*
- 格式化HDFS:
在Hadoop的对应目录下,./bin/hdfs namenode -format
- 重启hadoop:
在Hadoop的对应目录下,进行 sbin/start-all.sh
(4) 在集群中使用HDFS命令查看是否上传成功。
2. (选做)如何在Web项目中访问HDFS,实现在Web页面操作上传下载HDFS中的文件。
(1) 用Maven构建一个Java EE项目,并添加HDFS Java API相关组件;
(2) 在JSP或Servlet的服务端代码中访问HDFS,并与前端页面功能关联起来。
四、实验结果
试验运行过程及结果
如上步骤所示
五、实验体会
一二部分的HDFS启动以及命令行测试较为简单。
第三部分,因为之前完全没有接触过maven项目的建立,一开始有点不知所措。开始百度maven教程。
到第三部分的(2)将所有查询到的组件的XML插入到<dependencies></dependencies>节点中去,所找到的hadoop-client、hadoop-hdfs、hadoop-common一直是红色(就是未找到,未导入的意思),控制台一直卡在Resolving Maven dependencies。后面进行了镜像源的更改,以及修改maven Importing的jvm参数, 默认为700多, 直接修改成 -Xms1024m -Xmx2048m,得以解决。
Java程序的创建部分,也十分的不熟练了。IntelliJ IDEA的Project目录不显示SRC目录和鼠标右键新建时,选项没有Java class,也是改了好久的sources才好。
程序运行后,出现
Exception in thread "main" org.apache.hadoop.security.AccessControlException:
以及:
Exception in thread "main" org.apache.hadoop.ipc.RemoteException(java.io.IOException): File /home/navy/files/yc.txt could only be written to 0 of the 1 minReplication nodes. There are 0 datanode(s) running and no node(s) are excluded in this operation。主要是后一个问题,可能是因为我之前hadoop namenode -format次数有点多,这样是不正确的。