导入依赖
1、hadoop-client 客户端
<dependency>
<groupId>org.apache.hadoopgroupId>
<artifactId>hadoop-clientartifactId>
<version>3.1.3version>
dependency>
a、导入Hadoop客户端依赖 3.1.3 (和服务器依赖一致)
b、相当于导入一个本地模式的Hadoop,子依赖含有hdfs、yarn、mr等
2、junit 单元测试
<dependency>
<groupId>junitgroupId>
<artifactId>junitartifactId>
<version>4.12version>
dependency>
3、slf4j-log4j 打印日志
<dependency>
<groupId>org.slf4jgroupId>
<artifactId>slf4j-log4j12artifactId>
<version>1.7.30version>
dependency>
在Resource(一般放置静态文件,如:图片、音频和视频)中加入配置文件,修改slf4j日志级别为INFO
应用:hdfs zk
/**
* 在hdfs上创建文件夹
*/
@Test
public void testMkdir() throws URISyntaxException, IOException, InterruptedException {
// 1、客户端和 namenode 打交道,所以要拿到 namenode 所在节点:hadoop102 的URI
// 2、namenode 的内部通讯端口为8020
URI uri = new URI("hdfs://hadoop102:8020");
// 创建配置文件
Configuration configuration = new Configuration();
// 得到了一个客户端对象
// hdfs的 owner 是atguigu
FileSystem fs = FileSystem.get(uri, configuration, "atguigu");
fs.mkdirs(new Path("/xiyou/huaguoshan"));
// 关闭资源
fs.close();
}
private FileSystem fs;
@Before
public void init() throws IOException, InterruptedException, URISyntaxException {
// 1、客户端和 namenode 打交道,所以要拿到 namenode 所在节点:hadoop102 的URI
URI uri = new URI("hdfs://hadoop102:8020");
// 创建配置文件
Configuration configuration = new Configuration();
// 得到了一个客户端对象
// hdfs的owner是atguigu
fs = FileSystem.get(uri, configuration, "atguigu");
}
@After
public void close() throws IOException {
// 关闭资源
fs.close();
}
/**
* 在hdfs上创建文件夹
*/
@Test
public void testMkdir() throws URISyntaxException, IOException, InterruptedException {
fs.mkdirs(new Path("/xiyou/huaguoshan1"));
}
@Test
public void testPut() throws IOException {
// 参数1:是否删除原数据 2:是否允许覆盖 3:原数据路径 4:目标地址路径
fs.copyFromLocalFile(false,false,new Path("D:\\input\\sunwukong.txt") , new Path("hdfs://hadoop102/xiyou/huaguoshan"));
}
<property>
<name>dfs.replicationname>
<value>3value>
<description>Default block replication.
The actual number of replications can be specified when the file is created.
The default is used if replication is not specified in create time.
description>
property>
上传文件默认副本数是3
在idea中的resources文件夹下添加hdfs-site.xml文件
<configuration>
<property>
<name>dfs.replicationname>
<value>1value>
property>
configuration>
设置副本数是1
设置副本数是2
@Test
public void testGet() throws IOException {
// 参数1:是否删除原数据 2:HDFS路径 3:目标地址路径Window 4:是否使用校验文件,对比传输时有无中途丢失数据
fs.copyToLocalFile(false,new Path("hdfs://hadoop102/xiyou/huaguoshan") , new Path("D:\\input\\sunwukong1.txt"),true);
}
除了下载的文件之外,还有一个crc校验文件
@Test
public void testDel() throws IOException {
// 参数1:要删除的路径 2:是否递归删除 如果只是一个文件,true和false都一样 ; 如果是非空目录,true
fs.delete(new Path("hdfs://hadoop102/sanguo") ,true);
}
@Test
public void testMv() throws IOException {
// 参数1:原文件路径 2:目标文件路径
// 1、修改文件名
fs.rename(new Path("hdfs://hadoop102/jinguo/weiguo.txt") ,new Path("hdfs://hadoop102/jinguo/wg.txt"));
// 2、更名或者移动
fs.rename(new Path("hdfs://hadoop102/jinguo/wg.txt") ,new Path("hdfs://hadoop102/output/weiguo.txt"));
// 3、目录更名
fs.rename(new Path("hdfs://hadoop102/output") ,new Path("hdfs://hadoop102/input"));
}
@Test
public void testFileDetail() throws IOException {
// 得到所有文件信息的迭代器
RemoteIterator<LocatedFileStatus> listFiles = fs.listFiles(new Path("/jinguo"), 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.getPath().getName());
System.out.println(fileStatus.getBlockSize());
}
}
@Test
public void testFile() throws IOException {
// 得到所有文件信息的数组
FileStatus[] listStatus = fs.listStatus(new Path("/jinguo"));
// 遍历文件
for (FileStatus status : listStatus) {
if (status.isFile()){
System.out.println("文件:" + status.getPath().getName());
}else {
System.out.println("文件夹:" + status.getPath().getName());
}
}
}