1.配置Hadoop的Windows客户端
Hadoop 配置Windows 客户端
2.新建Maven项目[略]
3.添加依赖
<!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-client -->
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>3.3.6</version>
</dependency>
<!-- https://mvnrepository.com/artifact/junit/junit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-reload4j -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-reload4j</artifactId>
<version>2.0.9</version>
</dependency>
4.在项目的 src/main/resources目录下,新建日志配置文件,文件名为“log4j.properties”
log4j.rootLogger=INFO, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n
log4j.appender.logfile=org.apache.log4j.FileAppender
log4j.appender.logfile.File=target/spring.log
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] - %m%n
5.新建测试类
package cn.coreqi.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;
/**
* 客户端代码步骤
* 1.首先获取一个客户端对象
* 2.执行相关的操作命令
* 3.关闭资源
*/
public class HdfsClient {
/**
* 客户端对象
*/
private FileSystem fs;
/**
* 初始化客户端对象
* @throws IOException
* @throws InterruptedException
* @throws URISyntaxException
*/
@Before
public void init() throws IOException, InterruptedException, URISyntaxException {
// 需要连接的Hadoop NameNode地址
URI uri = new URI("hdfs://192.168.58.130:8020");
// 创建一个配置文件
Configuration configuration = new Configuration();
configuration.set("dfs.replication","7"); //设置默认副本数量为7
// 用户
String user = "root";
// 获取客户端对象
fs = FileSystem.get(uri, configuration,user);
}
/**
* 释放客户端资源
* @throws IOException
*/
@After
public void close() throws IOException {
// 关闭资源
fs.close();
}
/**
* 创建目录
* @throws IOException
*/
@Test
public void testMkdirs() throws IOException{
// 创建一个文件夹
fs.mkdirs(new Path("/coreqi"));
}
/**
* 上传
* @throws IOException
*/
@Test
public void testPut() throws IOException {
// 参数解析
// 参数一,表示是否删除源数据
// 参数二,是否允许覆盖
// 参数三,源数据路径
// 参数四,目标路径
//fs.copyFromLocalFile(false,false,new Path("C:\\Users\\fanqi\\Desktop\\bda6f29e-29de-4b9d-aa01-8c0fa850f99b.webp"),new Path("\\coreqi\\1.webp"));
fs.copyFromLocalFile(false,false,new Path("C:\\Users\\fanqi\\Desktop\\bda6f29e-29de-4b9d-aa01-8c0fa850f99b.webp"),new Path("hdfs://192.168.58.130/coreqi/2.webp"));
}
/**
* 下载
* @throws IOException
*/
@Test
public void testGet() throws IOException {
// 参数解析
// 参数一,源文件是否删除
// 参数二,源文件在HDFS中的路径
// 参数三,目标地址路径
// 参数四,是否开启文件校验
fs.copyToLocalFile(false,new Path("hdfs://192.168.58.130/coreqi/2.webp"),new Path("D://2.webp"),false);
}
/**
* 删除文件或文件夹
*/
@Test
public void testRm() throws IOException {
// 参数解析
// 参数一,删除的HDFS路径
// 参数二,是否递归删除,对于非空的目录删除,此值需要配置为true
fs.delete(new Path("hdfs://192.168.58.130/coreqi/2.webp"),false);
}
/**
* 文件的更名或移动
*/
@Test
public void testMv() throws IOException {
// 参数解析
// 参数一,源文件路径
// 参数二,目标文件路径
//fs.rename(new Path("hdfs://192.168.58.130/coreqi/2.webp"),new Path("hdfs://192.168.58.130/coreqi/22.webp"));
//文件移动并更名
//fs.rename(new Path("hdfs://192.168.58.130/coreqi/22.webp"),new Path("hdfs://192.168.58.130/23.webp"));
//文件夹重命名
fs.rename(new Path("hdfs://192.168.58.130/coreqi"),new Path("hdfs://192.168.58.130/coreqir"));
}
/**
* 获取文件详细信息
*/
@Test
public void fileDetail() throws IOException {
// 获取所有文件信息
RemoteIterator<LocatedFileStatus> listFiles = fs.listFiles(new Path("/"), true);
// 遍历文件
while (listFiles.hasNext()) {
LocatedFileStatus fileStatus = listFiles.next();
System.out.println("=======" + fileStatus.getPath() + "=======");
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) {
boolean isFile = status.isFile();
System.out.println(isFile ? "文件 " : "目录 " + status.getPath().getName());
}
}
}