本文是大数据系列第 9 篇,通过 Java 代码操作 HDFS,掌握 Hadoop 提供的 Java Client API。
Maven 依赖
<dependencies>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-common</artifactId>
<version>2.9.0</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-hdfs</artifactId>
<version>2.9.0</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-mapreduce-client-core</artifactId>
<version>2.9.0</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-mapreduce-client-common</artifactId>
<version>2.9.0</version>
</dependency>
</dependencies>
三个核心类
| 类 | 说明 |
|---|---|
FileSystem | HDFS 操作的抽象基类,所有文件操作入口 |
Path | HDFS 路径封装(不同于 java.io.File) |
Configuration | 加载 Hadoop 配置(core-site.xml 等) |
初始化 FileSystem
Configuration conf = new Configuration();
conf.set("fs.defaultFS", "hdfs://h121.wzk.icu:9000");
FileSystem fs = FileSystem.get(conf);
创建目录
fs.mkdirs(new Path("/test/java"));
上传文件(PUT)
// copyFromLocalFile(src, dst)
fs.copyFromLocalFile(
new Path("/local/test.txt"),
new Path("/test/java/test.txt")
);
下载文件(GET)
// copyToLocalFile(src, dst)
fs.copyToLocalFile(
new Path("/test/java/test.txt"),
new Path("/local/download/test.txt")
);
删除文件
// delete(path, recursive)
fs.delete(new Path("/test/java/test.txt"), false);
// 递归删除目录
fs.delete(new Path("/test/java"), true);
列出目录
FileStatus[] statuses = fs.listStatus(new Path("/test"));
for (FileStatus s : statuses) {
System.out.println(s.getPath().getName() + " - " + s.getLen());
}
流式操作(支持进度条)
// PUT(带进度显示)
try (FSDataOutputStream out = fs.create(new Path("/test/stream.txt"),
progress -> System.out.print("."))) {
out.write("hello hdfs".getBytes());
}
// GET(流式读取)
try (FSDataInputStream in = fs.open(new Path("/test/stream.txt"))) {
byte[] buffer = new byte[1024];
int len;
while ((len = in.read(buffer)) != -1) {
System.out.write(buffer, 0, len);
}
}
Seek 定位读取
FSDataInputStream in = fs.open(new Path("/test/file.txt"));
in.seek(100); // 跳到第 100 字节
// 继续读取...
in.close();
使用完毕关闭
fs.close();
完整工程代码(含 log4j.properties 配置)见 CSDN 原文。