• 实验目的

掌握HDFS安装、HDFS命令和HDFS Java API编程。

  • 实验内容
  1. 掌握HDFS命令使用方法;
  2. 熟悉开发环境配置和编码过程;
  3. 掌握HDFS Java API的基本用法。
  • 实验步骤

    一、HDFS配置和启动

修改HDFS配置并在集群中启动HDFS。

java 连接hdfs 自适应方式 hdfs jvm_hadoop

java 连接hdfs 自适应方式 hdfs jvm_大数据_02

二、HDFS命令行测试

    在集群节点中输入HDFS命令行完成目录管理和文件上传/下载等操作,具体完成以下操作:

  1. 查看HDFS根目录;

java 连接hdfs 自适应方式 hdfs jvm_hadoop_03


  1. 在HDFS根目录创建文件夹test;

java 连接hdfs 自适应方式 hdfs jvm_java 连接hdfs 自适应方式_04


  1. 从Linux中上传一个文件至HDFS的/test目录;

java 连接hdfs 自适应方式 hdfs jvm_java 连接hdfs 自适应方式_05


  1. 将该文件从HDFS下载至/Home目录中。

java 连接hdfs 自适应方式 hdfs jvm_hadoop_06

三、HDFS Java API测试

       1. 在IntelliJ IDEA或Eclipse环境中创建一个Maven项目,并使用HDFS的Java API操作HDFS

(1) 下载IntelliJ IDEA或Eclipse,并创建Maven项目;

参考博客:idea建立一个maven项目


java 连接hdfs 自适应方式 hdfs jvm_Java_07

java 连接hdfs 自适应方式 hdfs jvm_Java_08

java 连接hdfs 自适应方式 hdfs jvm_java 连接hdfs 自适应方式_09

java 连接hdfs 自适应方式 hdfs jvm_HDFS_10

       (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>节点中去,如下图:

 

java 连接hdfs 自适应方式 hdfs jvm_Java_11

中间出现了Idea卡在Resolving Maven dependencies这个问题

解决方案参考博客:

Idea卡在Resolving Maven dependencies的解决方案


最后

java 连接hdfs 自适应方式 hdfs jvm_hadoop_12

更换镜像源,参考博客:

IntelliJ IDEA 中更改 maven 镜像源


java 连接hdfs 自适应方式 hdfs jvm_hadoop_13

 

java 连接hdfs 自适应方式 hdfs jvm_大数据_14

       (3) 使用Java API编写代码并调试,将Windows中的一个文件上传至HDFS指定目录,常见异常参见《HDFS Java API常见异常解决方案》;

写程序时出现的问题:

参考博客:IntelliJ IDEA的Project目录不显示SRC目录和鼠标右键新建时,选项没有Java class的解决方法和具体解释


java 连接hdfs 自适应方式 hdfs jvm_java 连接hdfs 自适应方式_15

java 连接hdfs 自适应方式 hdfs jvm_HDFS_16

中间出现的问题:

·hadoop客户端操作出现:

Exception in thread "main" org.apache.hadoop.security.AccessControlException:

参考博客:


·could only be written to 0 of the 1 minReplication nodes.

解决方案:

  1. 关闭集群:

在Hadoop的对应目录下,进行sbin/stop-all.sh

  1. 删除dfs文件下的数据第二步:删除所有名字为dfs的文件夹,我这里有以下两个文件夹,分别删除两次:

所有节点都需要

rm -rf  /home/hadoop/dfs/data/*

rm -rf  /home/hadoop//tmp/dfs/*

  1. 格式化HDFS:

在Hadoop的对应目录下,./bin/hdfs namenode -format

  1. 重启hadoop:

在Hadoop的对应目录下,进行 sbin/start-all.sh

(4) 在集群中使用HDFS命令查看是否上传成功。

java 连接hdfs 自适应方式 hdfs jvm_HDFS_17

       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次数有点多,这样是不正确的。