1.在本机中配置HADOOP_HOME的环境变量
2.配置PATH路径
3.创建Maven工程
4.在pom.xml文件中导入依赖(这边不做过多解释,导入时看清楚自己的hadoop版本)
5.API操作
package com.root.hdfs;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.*;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.Arrays;
/**
* 客户端代码常用操作
* 1.获取一个客户端对象
* 2.执行相关的命令操作
* 3.关闭资源
*/
public class HDFSClient {
private FileSystem fs;//ctrl+alt+f 把 fs 升级为全局变量
@Before //若不加 Before 和下面的 After 会报空指针异常
//执行顺序:Before->Test->After
public void init() throws URISyntaxException, IOException {
//连接集群的nn地址
URI uri = new URI("hdfs://hadoop102:8020");
//创建一个配置文件
Configuration configuration = new Configuration();
//获取到客户端对象
//ctrl+p:提示参数
fs = FileSystem.get(uri, configuration);
}
@After
public void close() throws IOException {
//关闭资源
fs.close();
}
//创建文件夹
@Test
public void testmkdir() throws URISyntaxException, IOException {
fs.mkdirs(new Path("/homework/demo01"));
}
//创建文件
@Test
public void mkfile() throws IOException {
FSDataOutputStream outputStream = fs.create(new Path("/xiaoxiao.txt"));
outputStream.writeUTF("Hello! Be my lover!");
outputStream.flush();
}
//上传文件
@Test
public void testPut() throws IOException {
//参数一:删除原数据;参数二:是否允许覆盖;参数三:原数据路径;参数四:目的地路径
fs.copyFromLocalFile(false, true, new Path("D:\\SoRa.txt"), new Path("/homework/demo01"));
}
//文件下载
@Test
public void testGet() throws IOException {
//参数解读:参数一:源文件是否删除;参数二:源文件路径HDFS;参数三:目标地址路径windows;参数四:crc是否开启校验
fs.copyToLocalFile(false, new Path("hdfs://hadoop102/homework/demo01/SoRa.txt"), new Path("D:\\HDFSClient01\\source"), false);
}
//删除目录
@Test
public void testRm() throws IOException {
//参数解读:参数一:要删除的目录;参数二:是否递归删除
//删除空目录
fs.delete(new Path("/homework/demo02"), false);
//删除非空目录
fs.delete(new Path("/homework/demo01"), true);//递归删除true
}
//删除文件
@Test
public void testFileDelete() throws IOException {
fs.delete(new Path("/homework/demo01/SoRa.txt"), true);
}
//文件更名和移动
@Test
public void testmv() throws IOException {
//参数一:源文件路径;参数二:目标文件路径
//文件名称的修改
fs.rename(new Path("/homework/demo01/SoRa.txt"), new Path("/homework/demo01/SORA.txt"));
//文件的移动和更名
fs.rename(new Path("/homework/demo01/SORA.txt"), new Path("/SORA.txt"));
}
//获取文件详细信息
@Test
public void fileDetail() throws IOException {
//获取所有文件信息 下面代码.var返回一个迭代器Iterator
RemoteIterator<LocatedFileStatus> listFiles = fs.listFiles(new Path("/SORA.txt"), true);
//遍历文件(迭代器)
while (listFiles.hasNext()) {
LocatedFileStatus fileStatus = listFiles.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));
}
}
//判断是文件夹还是文件
@Test
public void testFile() throws IOException {
FileStatus[] listStatus = fs.listStatus(new Path("/"));
for (FileStatus status : listStatus) {
if (status.isFile()) {
System.out.println("文件:" + status.getPath().getName());
} else {
System.out.println("目录:" + status.getPath().getName());
}
}
}
}