HDFS的API操作
本地开发Hadoop应用程序基本都是在Windows环境中,所以需要提前搭建配置Windows环境。
1. 搭建windows版hadoop环境
- 解压缩hadoop-3.3.6.tar.gz到非中文目录下
- 访问https://gitee.com/javaee_home/hadoopcompiler 下载的文件拷贝到bin目录中
- 在windows环境变量配置HADOOP_HOME和Path
- 命令行窗口测试
sh
C:\Users\mi>yarn version
Hadoop 3.3.6
Source code repository https://github.com/apache/hadoop.git -r 1be78238728da9266a4f88195058f08fd012bf9c
Compiled by ubuntu on 2023-06-18T08:22Z
Compiled on platform linux-x86_64
Compiled with protoc 3.7.1
From source with checksum 5652179ad55f76cb287d9c633bb53bbd
This command was run using /D:/hadoop-3.3.6/share/hadoop/common/hadoop-common-3.3.6.jar
2. 创建Maven工程
pom.xml文件如下
xml
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>3.3.6</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.36</version>
</dependency>
3. 使用代码操作HDFS
3.1 创建目录
java
// 1 获取文件系统
Configuration configuration = new Configuration();
FileSystem fs = FileSystem.get(new URI("hdfs://hadoop102:8020"), configuration,"jack");
// 2 创建目录
fs.mkdirs(new Path("/xiyou/huaguoshan/"));
// 3 关闭资源
fs.close();
执行效果:
3.2 上传文件
java
// 2 上传文件
// boolean delSrc 指是否将源文件删除
// Path src 指要上传的文件路径
// Path dst 指将文件上传到的路径
Path path = new Path("D:\\BaiduNetdiskDownload\\随堂笔记.txt");
fs.copyFromLocalFile(true, path, new Path("/xiyou/huaguoshan/"), true);
3.3 HDFS文件下载
java
// 2 执行下载操作
// boolean delSrc 指是否将原文件删除
// Path src 指要下载的文件路径
// Path dst 指将文件下载到的路径
// boolean useRawLocalFileSystem 是否开启文件校验, false将提供crc校验码
fs.copyToLocalFile(false, new Path("/xiyou/huaguoshan/随堂笔记.txt"), new Path("e:/download_hdfs/"), false);
运行效果:
3.4 HDFS文件删除
java
// 2 执行删除, 第二个参数:是否需要递归删除
fs.delete(new Path("/xiyou/huaguoshan"), false);
如果目录不为空会报错,此时需要递归删除,第二个参数配置为true:
3.5 HDFS文件更名和移动
java
// 文件修改名称
fs.rename(new Path("/xiyou/huaguoshan/随堂笔记.txt"), new Path("/xiyou/huaguoshan/学习笔记.txt"));
// 文件移动并改名
fs.rename(new Path("/xiyou/huaguoshan/学习笔记.txt"), new Path("/user/jack/study_note.txt"));
// 目录的更名
fs.rename(new Path("/xiyou/huaguoshan"), new Path("/xiyou/huaguoshan2"));
运行效果:
3.6 获取HDFS文件详情
java
// 获取文件详情。/ 表示所有文件
RemoteIterator<LocatedFileStatus> listFiles = fs.listFiles(new Path("/"), true);
while (listFiles.hasNext()) {
LocatedFileStatus fileStatus = listFiles.next();
// 读取信息
System.out.print(fileStatus.getPath()+"\t");
System.out.print(fileStatus.getPermission()+"\t");
System.out.print(fileStatus.getOwner()+"\t");
System.out.print(fileStatus.getGroup()+"\t");
System.out.print(fileStatus.getLen()+"\t");
System.out.print(fileStatus.getModificationTime()+"\t");
System.out.print(fileStatus.getReplication()+"\t");
System.out.print(fileStatus.getBlockSize()+"\t");
System.out.print(fileStatus.getPath().getName()+"\t");
// 获取存储块信息
BlockLocation[] blockLocations = fileStatus.getBlockLocations();
System.out.println(Arrays.toString(blockLocations));
}
3.7 HDFS文件和文件夹判断
java
// 2 判断是文件还是文件夹
FileStatus[] listStatus = fs.listStatus(new Path("/user/jack"));
for (FileStatus fileStatus : listStatus) {
// 如果是文件
if (fileStatus.isFile()) {
System.out.println("文件:"+fileStatus.getPath().getName());
}else {
System.out.println("目录:"+fileStatus.getPath().getName());
}
}
运行结果:
4. HDFS参数优先级
参数优先级排序:客户端代码中设置的值 > ClassPath下的用户自定义配置文件 > 然后是服务器的自定义配置(xxx-site.xml) > 服务器的默认配置(xxx-default.xml)。
在Maven项目中resource下创建hdfs-site.xml副本参数是1, 代码中配置副本参数是2,另外HDFS服务器中副本默认是3,进行代码验证:
xml
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
</configuration>
java
// 1 获取文件系统
Configuration configuration = new Configuration();
// 配置参数
configuration.set("dfs.replication", "2");
FileSystem fs = FileSystem.get(new URI("hdfs://hadoop102:8020"), configuration,"jack");
// 2 创建目录
//fs.mkdirs(new Path("/xiyou/huaguoshan/"));
// 3. 文件上传, 没有put的api,但是有copyFromLocalFile等效
// 参数优先级
Path path = new Path("C:\\Users\\mi\\Desktop\\yl.sql");
fs.copyFromLocalFile(false, path, new Path("/xiyou/huaguoshan/"));
// 3 关闭资源
fs.close();
运行效果: