基于Java API实现HDFS文件的操作

大数据技术 潘老师 2年前 (2021-04-22) 1608 ℃ (0) 扫码查看
文章目录展开

准备

使用Java API操作HDFS中文件主要涉及如下几个类:
1)Configuration类:该类的对象封装了客户端或者服务器的配置。
2)FileSystem 类:该类的对象是一个文件系统对象,可以用该对象的一些方法对文件进行操作。FileSystem fs = FileSystem.get(conf);通过FileSystem的静态方法get获得该对象。
3)FSDatalnputStream FSDataOutputStream:这两个类是HDFS中的输入/输出流,分别通过FileSystem的open 方法和create方法获得。

代码实现

以下我们会通过实例代码来介绍如何利用Java API进行文件夹的创建、文件列表显示、文件上传的文件下载的操作。

1、创建Maven项目

我们基于Maven创建一个java项目,使用的archetype为maven-archetype-quickstart,在此不再赘述

2、添加依赖

我们在pom.xml中添加HDFS操作的相关依赖(依赖版本尽量与安装的hadoop版本一致),如下:

<dependency>
    <groupId>org.apache.hadoop</groupId>
    <artifactId>hadoop-common</artifactId>
    <version>3.2.1</version>
</dependency>
<dependency>
    <groupId>org.apache.hadoop</groupId>
    <artifactId>hadoop-client</artifactId>
    <version>3.2.1</version>
</dependency>
<dependency>
    <groupId>org.apache.hadoop</groupId>
    <artifactId>hadoop-hdfs</artifactId>
    <version>3.2.1</version>
</dependency>

2、创建测试类

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.*;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
/**
* <h3>hdfs</h3>
*
* @author panziye
* @description <p></p>
* @date 2021-04-22 12:30
**/
public class TestHDFS {
//1.创建文件夹
public static void createFloder(){
//定义一个配置对象
Configuration conf = new Configuration();
try {
//URI对象通过使用HDFS协议指定HDFS文件系统配置的节点地址,ip可换为主机映射名
URI uri = new URI("hdfs://192.168.55.100:9820");
//根据配置信息获取文件系统对象
FileSystem fs = FileSystem.get(uri, conf);
//在指定路径下创建文件夹
Path path = new Path("/yunpan");
fs.mkdirs(path);
} catch (URISyntaxException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
//2.上传文件
public static void uploadFile(){
//定义一个配置对象
Configuration conf = new Configuration();
try {
//URI对象
URI uri = new URI("hdfs://192.168.55.100:9820");
//根据配置信息获取文件系统对象
FileSystem fs = FileSystem.get(uri, conf);
//定义文件的路径和上传路径
Path src = new Path("D://hello.txt");
Path dest = new Path("/yunpan/hello.txt");
//从本地上传到文件服务器上
fs.copyFromLocalFile(src,dest);
} catch (URISyntaxException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
//3.递归显示文件
public static void listFile(Path path){
//定义一个配置对象
Configuration conf = new Configuration();
try {
//URI对象
URI uri = new URI("hdfs://192.168.55.100:9820");
//根据配置信息获取文件系统对象
FileSystem fs = FileSystem.get(uri, conf);
// true 表示递归查找 ; false 表示不进行递归查找
RemoteIterator<LocatedFileStatus> iterator = fs.listFiles(path, true);
while (iterator.hasNext()){
LocatedFileStatus next = iterator.next();
System.out.println("当前文件路径是:"+next.getPath());
}
System.out.println("-------------------------------------");
//将给定path路径下的所有文件元数据放到一个FileStatus的数组中
//FileStatus对象封装了文件和目录的元数据,包括文件长度、块大小、权限等
final FileStatus[] fileStatusArray = fs.listStatus(path);
for (int i = 0; i < fileStatusArray.length; i++) {
FileStatus fileStatus = fileStatusArray[i];
System.out.println(fileStatus.getPath());
}
} catch (URISyntaxException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
//4.下载文件
public static void downloadFile(){
//定义一个配置对象
Configuration conf = new Configuration();
try {
//URI对象
URI uri = new URI("hdfs://192.168.55.100:9820");
//根据配置信息获取文件系统对象
FileSystem fs = FileSystem.get(uri, conf);
//定义下载文件的路径和本地存放路径
Path src = new Path("/yunpan/hello.txt");
Path dest = new Path("E://hello.txt");
//从文件服务器下载到本地
fs.copyToLocalFile(src,dest);
} catch (URISyntaxException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
//main方法
public static void main(String[] args) {
//设置操作用户
System.setProperty("HADOOP_USER_NAME","hadoop");
//1.创建新文件夹
//createFloder();
//2.上传文件
//uploadFile();
//3.递归显示文件
//listFile(new Path("/"));
//4.下载文件
downloadFile();
}
}

注意:
1)如果报错org.apache.hadoop.security.AccessControlException: Permission denied: user=Administrator,请参考:

解决org.apache.hadoop.security.AccessControlException: Permission denied: user=Administrator

我们在使用Java API操作HDFS时如果出现如下错误提示: 表明我们没有使用正确的用户操作HDFS,即没有 […]


2)下载文件如果报错 java.io.FileNotFoundException: HADOOP_HOME and hadoop.home.dir are unset请参考:
解决java.io.FileNotFoundException: java.io.FileNotFoundException: HADOOP_HOME and hadoop.home.dir are unset

我们在使用Java API测试从Liunx上HDFS中下载文件到本地windows系统时,发现会包如下错误: […]


版权声明:本站所有文章,如无特殊说明,均为本站原创。转载请务必注明文章来源,谢谢支持。
本文链接:https://www.panziye.com/java/bigdata/3038.html
喜欢 (2)
请潘老师喝杯Coffee吧!】
分享 (0)
用户头像
发表我的评论
取消评论
表情 贴图 签到 代码

Hi,您需要填写昵称和邮箱!

  • 昵称【必填】
  • 邮箱【必填】
  • 网址【可选】