Hadoop3 - Java Api 操作 HDFS
Posted 小毕超
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Hadoop3 - Java Api 操作 HDFS相关的知识,希望对你有一定的参考价值。
一、HDFS
上篇文章对 HDFS 进行了简单的介绍,并且使用 Shell Cli 对 HDFS 进行了一些基本的操作,本篇文章使用 Java Api 对 HDFS 进行操作,下面是上篇文章地址:
如果在 windows 环境下使用 Java Api 进行操作,需要 hadoop.dll 和 winutils.exe ,可以下载Hadoop源码在windows平台编译,编译出windows本地库。
如果运行依然有问题,可以下载编译好的包:
然后配置Hadoop环境变量
HADOOP_HOME=D:\\soft\\hadoop-3.1.4
path=;%HADOOP_HOME%\\bin
其中 Java Api 中有两个核心类:
-
Configuration
配置对象类,用于加载或设置参数属性 -
FileSystem
文件系统对象基类。针对不同文件系统有不同具体实现。该类封装了文件系统的相关操作方法。
下面围绕这两个核心类进行操作:
二、Java Api 操作搭建
首先创建一个 Maven 项目,添加 Hadoop 的依赖:
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-common</artifactId>
<version>3.1.4</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-hdfs</artifactId>
<version>3.1.4</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>3.1.4</version>
</dependency>
声明 Configuration
,并添加 hdfs
的连接地址:
org.apache.hadoop.conf.Configuration conf = new org.apache.hadoop.conf.Configuration();
conf.set("fs.defaultFS", "hdfs://192.168.40.172:8020");
通过 Configuration
获得一个文件系统连接
FileSystem fileSystem = FileSystem.get(conf);
下面通过 FileSystem
创建一个目录:
boolean mkdirs = fileSystem.mkdirs(new Path("/had/test/t1"));
System.out.println(mkdirs);
如果出现下面错误,是因为以Windows登录用户访问HDFS,而该用户不具备在HDFS操作权限,可以通过修改HDFS文件系统权限,或者设置客户端身份,该身份具备在HDFS操作权限。
设置客户端身份,注意需要放在获取 FileSystem
之前:
System.setProperty("HADOOP_USER_NAME","root");
重新运行,如果没有出错,就可以到 HDFS 中来看下,是否创建成功:
目录已经创建成功!
最后使用完毕后,不要忘记对 FileSystem
进行关闭:
fileSystem.close();
三、Java Api 文件操作
//本地文件路径
Path src = new Path("D:/test.txt");
//hdfs目标路径
Path dst = new Path("/had/test/t1");
// 上传文件 参数(源路径,目标路径)
fileSystem.copyFromLocalFile(src,dst);
到 HDFS 中查看是否上传成功
已成功上传!
//文件流
InputStream in = new FileInputStream("D:/test.txt");
//获得 hdfs 文件流
OutputStream out = fileSystem.create(new Path("/had/test/t1/test1.txt"));
// 使用Hadoop提供的IOUtils,将in的内容copy到out,设置buffSize大小,是否关闭流设置true
IOUtils.copyBytes(in, out, 4096, true);
到 HDFS 中查看是否上传成功
已成功上传!
//hdfs目标路径
Path src = new Path("/had/test/t1/test.txt");
//本地文件路径
Path dst = new Path("D:/test/test2.txt");
// 下载文件 参数(源路径,目标路径)
fileSystem.copyToLocalFile(src,dst);
到本地路径中查看,是否上传成功:
已经下载成功!
// 获得 hdfs 文件流
InputStream in = fileSystem.open(new Path("/had/test/t1/test1.txt"));
// 本地文件流
OutputStream out = new FileOutputStream("D:/test/test1.txt");
IOUtils.copyBytes(in, out, 4096, true);
到本地路径中查看,是否上传成功:
已经下载成功!
//删除指定的文件。参数:false:表示是否递归删除
boolean b = fileSystem.delete(new Path("/had/test/t1/test1.txt"), false);
System.out.println(b);
到 HDFS 中查看:
已经删除
以上是关于Hadoop3 - Java Api 操作 HDFS的主要内容,如果未能解决你的问题,请参考以下文章
读Hadoop3.2源码,深入了解java调用HDFS的常用操作和HDFS原理
✨[hadoop3.x系列]HDFS REST HTTP API的使用WebHDFS