Hadoop学习笔记-HDFS(3)-HDFS的API操作

客户端环境配置

首先需要在本地安装和配置Hadoop。

下载一份hadoop在本地解压,然后配置HADOOP_HOME。idea运行时会读这个环境变量然后找到他里面的bin文件,所以本地的hadoop只需要有bin目录即可。

并且里面缺少了winutils.exe和hadoop.dll,需要额外下载

steveloughran/winutils: Windows binaries for Hadoop versions (built from the git commit ID used for the ASF relase) (github.com)

之后创建Maven工程,并导入相应的依赖坐标(其中hadoop-client的版本需要和服务器上对应)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>com.syh</groupId>
<artifactId>hadoop</artifactId>
<version>1.0-SNAPSHOT</version>

<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>

<dependencies>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>3.1.3</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.30</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-hdfs</artifactId>
<version>3.1.3</version>
<scope>test</scope>
</dependency>

</dependencies>

</project>

API操作

创建HdfsClient类完成对应的API操作测试

首先是集群的连接和断开

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class HdfsClient {

private FileSystem fs;

@Before
public void init() throws URISyntaxException, IOException, InterruptedException {
// 连接集群的NN地址
URI uri = new URI("hdfs://hadoop102:8020");
// 创建一个配置文件
Configuration configuration = new Configuration();
// 用户指定
String user = "syh";
// 获取客户端对象
fs = FileSystem.get(uri, configuration, user);
}

@After
public void close() throws IOException {
// 关闭资源
fs.close();
}
}

1. 文件夹创建

1
fs.mkdirs(new Path("/xiyou/huaguoshan"));

2. 文件上传和下载

1
2
fs.copyFromLocalFile(true, true, new Path("d:/sunwukong.txt"), new Path("/xiyou/huaguoshan/"));
fs.copyToLocalFile(false, new Path("/xiyou/huaguoshan/sunwukong.txt"), new Path("d:/zhubajie.txt"), false);
  • copyFromLocalFile可以指定对源文件是否删除,是否允许覆盖
  • copyToLocalFile可以指定对源文件是否删除,是否开启校验
    • 最后一个参数指定为false,则开启校验,下载来的文件会有.crc文件

3. 文件更名和移动

1
2
//更名、移动、文件更名、文件夹更名
fs.rename(new Path("/xiyou"), new Path("/xiyou-temp"));

4. 文件删除

1
2
//删除路径、是否递归
fs.delete(new Path("/xiyou-temp/temphaha"), true);

5. 文件详情查看

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 RemoteIterator<LocatedFileStatus> files = fs.listFiles(new Path("/"), true);
while (files.hasNext()) {
LocatedFileStatus fileStatus = files.next();

System.out.println(fileStatus.getPath());
System.out.println(fileStatus.getPermission());
System.out.println(fileStatus.getOwner());
System.out.println(fileStatus.getGroup());
System.out.println(fileStatus.getLen());
System.out.println(fileStatus.getModificationTime());
System.out.println(fileStatus.getReplication());
System.out.println(fileStatus.getBlockSize());
System.out.println(fileStatus.getPath().getName());

// 获取块信息
BlockLocation[] blockLocations = fileStatus.getBlockLocations();
System.out.println(Arrays.toString(blockLocations));
}

6. 判断文件或者文件夹

1
2
3
4
5
6
7
8
9
FileStatus[] fileStatuses = fs.listStatus(new Path("/xiyou-temp"));

for (FileStatus fileStatus : fileStatuses) {
if (fileStatus.isFile()) {
System.out.println("文件 + " + fileStatus.getPath().getName());
} else {
System.out.println("目录 + " + fileStatus.getPath().getName());
}
}

Hadoop学习笔记-HDFS(3)-HDFS的API操作
http://example.com/2022/02/18/Hadoop学习笔记-HDFS-3-HDFS的API操作/
作者
EverNorif
发布于
2022年2月18日
许可协议