1. 客户端环境准备
1.1下载资料包
我用阿里云盘分享了「hadoop-3.1.0」
链接:Hadoop在WIN环境传送门
1.2 配置 HADOOP_HOME 环境变量
1.3 配置 Path 环境变量。
注意:如果环境变量不起作用,可以重启电脑试试。
验证 Hadoop 环境变量是否正常。双击 winutils.exe,如果报如下错误。说明缺少微软运
更多 Java –大数据 –前端 –python 人工智能资料下载,可百度访问:尚硅谷官网行库(正版系统往往有这个问题)。再资料包里面有对应的微软运行库安装包双击安装即可。微软运行库传送门**
安装完微软库,运行项目如果报HADOOP_HOME的错重启下电脑就好啦。
2. java操作
2.1创建maven项目加入pom 依赖
<dependencies>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>3.1.3</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.30</version>
</dependency>
</dependencies>
2.2)在项目的 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
2.3创建包和类
HdfsClient.class
文件代码
package com.zrp.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;
/**
* @author 赵锐鹏
* @date 2021/8/18 13:55
*/
public class HdfsClient {
/* *
* 客户端代码常见套路
* 1.获取一个客户端对象
* 2.执行相关的操作命令
* 3.关闭资源
*
* HDFS zookeeper
* */
private FileSystem fileSystem;
@Before
public void init() throws URISyntaxException, IOException, InterruptedException {
//连接的集群nn地址
URI uri = new URI("hdfs://hadoop51:8020");
//创建一个配置文件
Configuration configuration = new Configuration();
//优先级最高
configuration.set("dfs.replication", "2");
//用户
String user = "root";
//1.获取到客户端对象
FileSystem fileSystem = FileSystem.get(uri, configuration, user);
}
@After
public void close() throws IOException {
//3关闭资源
fileSystem.close();
}
/**
* 创建一个目录
*/
@Test
public void testmkdir() throws IOException {
//2.创建一个文件夹
fileSystem.mkdirs(new Path("/test"));
}
/**
* 上传一个文件
* <p>
* 参数优先级
* hdfs-default.xml =>hdfs-site.xml =>在项目资源目录下的配置文件 => 代码里面的配置
*/
@Test
public void testPut() throws IOException {
//参数1.删除原数据 参数2.是否运行覆盖 参数3.原数据路径 参数4,目标路径(win)
fileSystem.copyFromLocalFile(false, false, new Path("D:\\sukukong.txt"), new Path("hdfs://hadoop52/test"));
}
/**
* 下载一个文件
*/
@Test
public void testDownload() throws IOException {
//参数1.源文件是否删除 2.源文件路径HDFS 3.目标地址路径(win) 参数4.是否开启校验(几乎不用)
fileSystem.copyToLocalFile(true, new Path(""), new Path(""), true);
}
/**
* 删除文件/文件夹
*/
@Test
public void testDelete() throws IOException {
//参数解读 1.要删除的路径 2.是否递归删除
//删除文件
fileSystem.delete(new Path("/xiyou/jdk.tar.gz"), false);
//删除空目录
fileSystem.delete(new Path("/xiyou"), false);
//删除非空目录
fileSystem.delete(new Path("/jingou"), true);
}
/**
* 文件更名和移动
*/
@Test
public void testMv() throws IOException {
//参数解读 1.源文件路径 参2.目标文件路径
//对文件名称的修改
fileSystem.rename(new Path("/input/word.txt"), new Path("/input/ss.txt"));
//文件移动和更名
fileSystem.rename(new Path("/input/ss.txt"), new Path("/cls.txt"));
//目录更名
fileSystem.rename(new Path("/input"), new Path("/output"));
}
/**
* 获取文件详细信息
*/
@Test
public void fileDetail() throws IOException {
//获取所有文件信息
RemoteIterator<LocatedFileStatus> listFiles = fileSystem.listFiles(new Path("/"), 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 testIfFile() throws IOException {
// 2 判断是文件还是文件夹
FileStatus[] listStatus = fileSystem.listStatus(new Path("/"));
for (FileStatus fileStatus : listStatus) {
// 如果是文件
if (fileStatus.isFile()) {
System.out.println("是文件:" + fileStatus.getPath().getName());
} else {
System.out.println("是文件夹:" + fileStatus.getPath().getName());
}
}
}
}