HDFS Java API
HDFS(Hadoop Distributed File System)是Hadoop项目的核心子项目,在大数据开发中通过分布式计算对海量数据进行存储与管理。它基于流数据模式访问和处理超大文件的需求而开发
FileSystem是HDFS Java API的核心工具类,该类是一个抽象类,其中封装了很多操作文件的方法,使用这些方法可以很轻松地操作HDFS中的文件。
package com.xc.xcspringboot.test;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IOUtils;
import org.apache.hadoop.util.Progressable;
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Timestamp;
public class HdfsApiTest {
private static FileSystem hdfs;
static {
Configuration conf = new Configuration();
//设置HDFS访问地址
conf.set("fs.default.name", "hdfs://172.19.25.168:9000");
try {
//取得FileSystem文件系统实例
hdfs = FileSystem.get(conf);
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) throws Exception {
// mkdirs(hdfs);
// createFile(hdfs);
// createFileProgressable(hdfs);
// getFile(hdfs);
// deleteFile(hdfs);
// listStatus(hdfs);
// getFileStatus(hdfs);
// copyFromLocalFile(hdfs);
copyToLocalFile(hdfs);
}
/**
* 创建目录
*/
public static void mkdirs(FileSystem hdfs) throws IOException {
boolean isok = hdfs.mkdirs(new Path("hdfs:/mydir"));
if (isok) {
System.out.println("创建目录成功!");
} else {
System.out.println("创建目录失败! ");
}
}
/**
* 创建文件
*/
public static void createFile(FileSystem hdfs) throws Exception {
//打开一个输出流
FSDataOutputStream outputStream = hdfs.create(new Path("hdfs:/mydir/newfile2.txt"));
//写入文件内容
outputStream.write("我是文件内容".getBytes());
System.out.println("文件创建成功! ");
}
/**
* 查询HDFS文件内容并输出
*/
public static void getFile(FileSystem hdfs) throws IOException {
//打开文件输入流
InputStream in = hdfs.open(new Path("hdfs:/mydir/newfile2.txt"));
//输出文件内容
IOUtils.copyBytes(in, System.out, 4096, false);
}
/**
* 上传文件并监控上传进度
*/
public static void createFileProgressable(FileSystem hdfs) throws IOException {
InputStream in = new BufferedInputStream(new FileInputStream("D:/导入导出/Java大全(2021年).pdf"));
//上传文件并监控上传进度
FSDataOutputStream outputStream = hdfs.create(new Path("hdfs:/mydir/Java大全(2021年).pdf"),
new Progressable() {
@Override
public void progress() {//回调 方法显示进度
System.out.println(".");
}
});
IOUtils.copyBytes(in, outputStream, 4096, false);
}
/**
* 删除文件
*/
public static void deleteFile(FileSystem hdfs) throws Exception {
Path path = new Path("hdfs:/mydir/newfile2.txt");
//删除文件
boolean isok = hdfs.deleteOnExit(path);
if (isok) {
System.out.println("删除成功!");
} else {
System.out.println("删除失败! ");
}
}
/**
* 递归遍历目录和文件
*/
public static void listStatus(FileSystem hdfs) throws IOException {
//遍历HDFS上的文件和目录
FileStatus[] fs = hdfs.listStatus(new Path("hdfs:/"));
if (fs.length > 0) {
for (FileStatus f : fs) {
showDir(f);
}
}
}
private static void showDir(FileStatus fs) throws IOException {
Path path = fs.getPath();
//输出文件或目录的路径
System.out.println(path);
//如果是目录,则递归遍历该目录下的所有子目录或文件
if (fs.isDirectory()) {
FileStatus[] f = hdfs.listStatus(path);
if (f.length > 0) {
for (FileStatus file : f) {
showDir(file);
}
}
}
}
/**
* 获取文件或目录的元数据
*/
public static void getFileStatus(FileSystem hdfs) throws IOException {
Path path = new Path("hdfs:/mydir/newfile2.txt");
FileStatus fileStatus = hdfs.getFileStatus(path);
//判断是文件夹还是文件
if (fileStatus.isDirectory()) {
System.out.println("这是一个文件夹");
} else {
System.out.println("这是一个文件");
//输出元数据信息
System.out.println("文件路径: " + fileStatus.getPath());
System.out.println("文件修改日期: " + new Timestamp(fileStatus.getModificationTime()).toString());
System.out.println("文件上次访问日期: " + new Timestamp(fileStatus.getAccessTime()).toString());
System.out.println("文件长度: " + fileStatus.getLen());
System.out.println("文件备份数: " + fileStatus.getReplication());
System.out.println("文件块大小: " + fileStatus.getBlockSize());
System.out.println("文件所有者:" + fileStatus.getOwner());
System.out.println("文件所在分组: " + fileStatus.getGroup());
System.out.println("文件的权限: " + fileStatus.getPermission().toString());
}
}
/**
* 上传本地文件
*/
public static void copyFromLocalFile(FileSystem hdfs) throws IOException {
//创建可供hadoop使用的文件系统路径
Path src = new Path("D:/xc-desktop/日志1.txt"); //本地目录/文件
Path dst = new Path("hdfs:/mydir/日志1.txt"); //HDFS目录/文件
//复制上传本地文件至HDFS文件系统中
hdfs.copyFromLocalFile(src, dst);
System.out.println("文件上传成功!");
}
/**
* 下载文件到本地
*/
public static void copyToLocalFile(FileSystem hdfs) throws IOException {
//创建可供hadoop使用的文件系统路径
Path src = new Path("hdfs:/mydir/日志1.txt"); //HDFS目录/文件
Path dst = new Path("D:/xc-desktop/日志1.txt"); //本地目录/文件
//4.从HDFS文件系统中复制下载文件至本地
hdfs.copyToLocalFile(false, src, dst, true);
System.out.println("文件下载成功!");
}
}
书籍:Hadoop大数据技术开发实战 4.4 HDFS Java API操作
https://gitee.com/caoyeoo0/xc-springboot/blob/hadoopApi/src/main/java/com/xc/xcspringboot/test/HdfsApiTest.java

浙公网安备 33010602011771号