HDFS 的应用开发

HDFS 在生产应用中主要是客户端的开发,其核心步骤是从 HDFS 提供的 api中构造一个 HDFS 的访问客户端对象,然后通过该客户端对象操作(增删改查)HDFS 上的文件。

HDFS基于java的API操作,需要本机创建HDFS客户端:

java HadoopAPI 文档 java hadoop开发_hadoop


(一)配置 windows 平台 Hadoop 环境

  • 在 windows 上做 HDFS 客户端应用开发,需要设置 Hadoop 环境,而且要求是windows 平台编译的 Hadoop,不然会报以下的错误:
Failed to locate the winutils binary in the hadoop binary path java.io.IOException: Could not
locate executable null\bin\winutils.exe in the Hadoop binaries.

为此我们需要进行如下的操作:
A、在 windows 平台下编译 Hadoop 源码(参考资料编译:Windows 源码编译Hadoop 2.7.4步骤详解,但不推荐)
B、使用已经编译好的 Windows 版本 Hadoop:hadoop-2.7.4-with-windows.tar.gz

有兴趣推荐下载链接:Windows 源码编译Hadoop 2.7.4

C、解压一份到 windows 的任意一个目录下
D、在 windows 系统中配置 HADOOP_HOME 指向你解压的安装包目录
E、在 windows 系统的 path 变量中加入 HADOOP_HOME 的 bin 目录


(二) 构造客户端对象

在 java 中操作 HDFS,主要涉及以下 Class:

  • Configuration:该类的对象封转了客户端或者服务器的配置;
  • FileSystem:该类的对象是一个文件系统对象,可以用该对象的一些方法来对文件进行操作,通过FileSystem 静态方法 get 获得该对象。
    FileSystem fs = FileSystem.get(conf)
    get 方法从 conf 中的一个参数 fs.defaultFS 的配置值判断具体是什么类型的文件系统。
    如果我们的代码中没有指定 fs.defaultFS,并且工程 classpath下也没有给定相应的配置,conf中的默认值就来自于hadoop的jar包中的core-default.xml ,默认值为file:/// ,则获取的将不是一个DistributedFileSystem 的实例,而是一个本地文件系统的客户端对象。

(三)小试牛刀:(注意保证Hadoop集群正常启动状态)

框架封装的 API 操作:

Configuration conf = new Configuration();
//这里指定使用的是 hdfs 文件系统
conf.set("fs.defaultFS", "hdfs://node-01:9000");
//需要配置本地hosts文件192.168.10.201  node-01主机节点

java HadoopAPI 文档 java hadoop开发_java HadoopAPI 文档_02

//通过如下的方式进行客户端身份的设置
System.setProperty("HADOOP_USER_NAME", "root");
//通过 FileSystem 的静态方法获取文件系统客户端对象
FileSystem fs = FileSystem.get(conf);
//也可以通过如下的方式去指定文件系统的类型 并且同时设置用户身份
//FileSystem fs = FileSystem.get(new URI("hdfs://node-21:9000"), conf, "root");
//列出 hdfs 根目录下的所有文件信息
RemoteIterator<LocatedFileStatus> listFiles = fs.listFiles(new Path("/"), false);
//遍历出我们得到的指定文件路径的迭代器 获取相应的文件信息
while (listFiles.hasNext()) {
LocatedFileStatus fileStatus = listFiles.next();
String name = fileStatus.getPath().getName();
System.out.println(name);
}
//关闭我们的文件系统
fs.close();