package com.cetc55.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.net.URI;
import java.net.URISyntaxException;
import java.util.Arrays;
/**
* 以下代码均为本人练习代码
* 代码功能:连接hdfs,对hdfs的文件进行操作
*/
public class HdfsClient {
private FileSystem fs;
@Before
public void inif() throws URISyntaxException, IOException, InterruptedException {
// 连接集群的namenode的地址
URI uri = new URI("hdfs://master:8020");
// 创建一个配置文件
Configuration configuration = new Configuration();
// 用户信息
String user = "root";
// 获取客户端对象
fs = FileSystem.get(uri, configuration, user);
}
@After
public void close() throws IOException {
// 关闭客户端连接
fs.close();
}
@Test
// 创建目录
public void testMkdir() throws URISyntaxException, IOException, InterruptedException {
// 创建目录的路径
Path path = new Path("/xiyou/longgong");
// 创建文件
fs.mkdirs(path);
}
// 上传文件
@Test
public void testPut() throws IOException {
// 参数解读:参数1:表示删除源数据 参数2:表示是否允许覆盖
// 参数3:源数据路径 参数4:目的地路径
// 源数据路径
Path path1 = new Path("D:\\test\\santaizi.txt");
Path path2 = new Path("/xiyou/longgong");
fs.copyFromLocalFile(false, true, path1, path2);
}
// 下载文件
@Test
public void testGet() throws IOException {
// 参数解读:参数1:表示是否删除源文件 参数2:原文件路径(HDFS)
// 参数3:目标地址路径(win) 参数4:是否关闭文件校验
Path pathHDFS = new Path("/xiyou/longgong/donghailongwang.txt");
Path pathWin = new Path("D:\\test\\");
fs.copyToLocalFile(false, pathHDFS, pathWin, true);
// fs.copyFromLocalFile(false,false,pathHDFS,pathWin);
}
// 删除文件
@Test
public void testRm() throws IOException {
// 参数解读:参数1:要删除的路径 参数2:是否递归删除
Path pathHdfs = new Path("/xiyou/longgong/donghailongwang.txt");
fs.delete(pathHdfs, false);
// 删除空目录
fs.delete(new Path("/xiyou"), false);
// 删除非空目录
fs.delete(new Path("/xiyou"), true);
// 备注:删除空目录和非空目录的区别在于 是否递归删除
}
// 文件的更名和移动
@Test
public void testMv() throws IOException {
Path path1 = new Path("/input");
Path path2 = new Path("/output");
fs.rename(path1, path2);
}
// 获取文件详细信息
@Test
public void testFileDetail() throws IOException {
// 获取所以文件信息
RemoteIterator<LocatedFileStatus> listFiles = fs.listFiles(new Path("/xiyou/longgong/"), true);
// 遍历文件
while (listFiles.hasNext()) {
LocatedFileStatus fileStatus = listFiles.next();
System.out.println("===============" + fileStatus.getPath() + "================");
System.out.println("===============" + fileStatus.getBlockLocations() + "===============");
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));
}
// 3 关闭资源
fs.close();
}
// HDFS文件和文件夹的判断
@Test
public void testListStatus() throws IOException {
// 判断是目录还是文件
FileStatus[] listStatus = fs.listStatus(new Path("/"));
for (FileStatus Status : listStatus) {
if (Status.isDirectory()) {
System.out.println("目录:"+Status.getPath().getName());
}else{
System.out.println("文件:"+Status.getPath().getName());
}
}
}
}
HDFS 的java-常用API
最新推荐文章于 2024-03-13 22:34:11 发布