Hadoop Part 5 - HDFS Java 编程访问

2021-04-03
4分钟阅读时长

【版本】

当前版本号v20210430

版本修改说明
v20220125升级文档到 Hadoop 3
v20210430修正 HdfsUtils 类名错误
v20210404增加常见问题
v20210403初始化版本

【实验目的】

  • 掌握 HDFS 文件系统的 Java 编程接口的调用和编程

【实验环境】

  • Windows 7 以上64位操作系统
  • JDK 8
  • Maven 3
  • IDEA 社区版

【实验资源】

  • hadoop.dll
链接:https://pan.baidu.com/s/1MoQ0iU0Qb1o8_o5JV6X6iw 
提取码:3rno

【实验内容】

  • 按要求使用 Java 编程实现访问 HDFS

【实验参考】

类 org.apache.hadoop.fs.FileSystem 的 参考文档

  • FileSystem.copyToLocalFile 方法用于从 HDFS 复制文件到本地文件系统。详细参考文档
/**
 * @Param src HDFS 文件路径
 * @Param dst 本地文件路径
 */
public void copyToLocalFile(Path src, Path dst) throws IOException
  • FileSystem.copyFromLocalFile 方法用于从本地文件系统复制文件到 HDFS。详细参考文档
/**
 * @Param src 本地文件路径
 * @Param dst HDFS 文件路径
 */
public void copyFromLocalFile(Path src, Path dst) throws IOException

【实验要求】

  1. 打开 Part 4 的 hadoop-exp 项目。

  2. 在项目hadoop-exp\src\main\java下创建一个名为hadoop+你学号后3位.hdfs的包。注意替换为你的学号后3位。

  3. 在包下面新建一个 HdfsUtils 的类。该类包含了一个在HDFS上创建文件并写入内容的方法createFile。代码如下,注意替换为你的学号后3位。

package hadoop你学号**后3位**.hdfs;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;

import java.io.IOException;
import java.net.URI;

public class HdfsUtils {

    /**
     * 在HDFS上创建文件并写入内容
     * @param conf HDFS的配置
     * @param hdfsFilePath HDFS创建的文件的路径
     * @param content 写入文件的内容
     * @param overwrite true表示覆盖原文件,false表示不覆盖
     */
    public static boolean createFile(Configuration conf,URI uri,String hdfsFilePath,String content,boolean overwrite) {
        FileSystem fs=null;
        FSDataOutputStream os=null;
        boolean rs=false;
        try {
            // 指定用户名 , 获取 FileSystem 对象
            fs = FileSystem.get(uri, conf, "hadoop");
            //定义文件路径
            Path dfs = new Path(hdfsFilePath);
            os = fs.create(dfs, overwrite);
            //往文件写入信息
            os.writeBytes(content);
            //成功创建文件,设置为true
            rs=true;
        }catch(Exception e){
            e.printStackTrace();
        }finally {
            try {
                if(os!=null) {
                    // 关闭流
                    os.close();
                }
                if(fs!=null) {
                    // 不需要再操作 FileSystem 了,关闭
                    fs.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return rs;
    }
}
  1. 在项目hadoop-exp\src\test\java下创建一个名为hadoop+你学号后3位.hdfs的包。注意替换为你的学号后3位。

  2. 在包下面新建一个 HdfsUtilsTest 的类,用于单元测试。代码如下,注意替换为你的学号后3位。此测试用例主要目的是在 HDFS 上创建一个文件,并把 “hello” 写入文件。

package hadoop替换为你学号后3位.hdfs;

import hadoop替换为你学号后3位.hdfs.HdfsUtils;
import org.apache.hadoop.conf.Configuration;
import org.junit.Test;

import java.net.URI;

public class HdfsUtilsTest {
    @Test
    public void testCreate() {
        Configuration conf=new Configuration();
        boolean rs=false;
        //创建的文件路径
        String filePath="/替换为你学号后3位/test.txt";
        String content="hello";
        try {
            URI uri = new URI("hdfs://10.0.0.71:8020");
            rs= HdfsUtils.createFile(conf, uri, filePath, content, true);
        }catch(Exception e){
            e.printStackTrace();
        }
        if(rs){
            System.out.println("Create successfully!");
        }else{
            System.out.println("Create fail!");
        }
    }
}
  1. 复制文件 hadoop.dllC:\Windows\System32 下。
重要步骤,请勿忽略!
  1. 启动虚拟机的 Hadoop。
注意一定要启动 Hadoop,否则实验无法成功!
  1. 运行HdfsUtilsTest。查看 IDEA 的控制台输出结果是否创建成功。

  2. SSH 登录 NodeA,运行以下命令查看创建文件的内容输出。是否和创建的文件内容一致。注意替换为你的学号后3位。

hdfs dfs -cat /替换为你学号后3位/test.txt
  1. 参考以上代码和【实验参考】给出的 API 文档,完成以下编程要求
  • (1)在HdfsUtils类新增一个uploadFile方法,可以上传本地文件到 HDFS。
  • (2)在HdfsUtilsTest类新增一个testUpload方法,测试上传文件到 HDFS。
  • (3)在HdfsUtils类新增一个dowloadFile方法,可以下载 HDFS 文件到本地。
  • (4)在HdfsUtilsTest类新增一个testDownload方法,测试下载 HDFS 文件到本地。

【常见问题】

报错:(null) entry in command string

答:这是缺少文件hadoop.dll文件

  • 1、下载hadoop.dll文件
  • 2、把文件放在c:\windows\system32目录下

IDEA 报错:java.net.ConnectionException:Call From XXXX/10.0.0.2 to 10.0.0.71:8020 failed on connection exception.

答:这是连接 NameNode 进程出错。

    1. 确保所有虚拟机节点都要启动。
    1. 确保能够ping 到10.0.0.71
    1. 确保 Hadoop 启动成功,使用jps命令检查进程是否缺少,特别是 namenode 进程。