7.HDFS的API操作
7.2HDFS的API案例实操
7.2.1HDFS文件上传(测试参数优先级)
package com.summer.hdfs;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
/**
* @author Redamancy
* @create 2022-08-15 17:59
*/
public class HdfsClient {
private FileSystem fs;
@Before
public void init() throws URISyntaxException, IOException, InterruptedException {
//连接的集群nn地址
URI uri = new URI("hdfs://hadoop102:8020");
//创建一个配置文件
Configuration configuration = new Configuration();
//用户
String user = "summer";
//获取到了客户端对象
fs = FileSystem.get(uri, configuration,user);
}
@After
public void close() throws IOException {
//关闭资源
fs.close();
}
@Test
public void testPut() throws IOException {
//参数解读:
// 参数一:表示删除原数据,为true表示上传完文件后,原数据文件将会删除;为false表示上传完文件后,原数据文件将不会删除;
// 参数二:是否允许覆盖,为true表示不管目的地地址是否有同名的文件都会覆盖;
// 为false表示目的地地址有同名的文件则报错org.apache.hadoop.fs.PathExistsException: `hdfs://hadoop102/xiyou/huaguoshan/sunwukong.txt': Target hdfs://hadoop102/xiyou/huaguoshan/sunwukong.txt already exists;
// 参数三:原数据路径Windows;参数四:目的地路径HDFS
fs.copyFromLocalFile(false,true,new Path("D:\\sunwukong.txt"),new Path("hdfs://hadoop102/xiyou/huaguoshan"));
}
}
7.2.1.1copyFromLocalFile参数解读
//参数解读:
// 参数一:表示删除原数据,为true表示上传完文件后,原数据文件将会删除;为false表示上传完文件后,原数据文件将不会删除;
// 参数二:是否允许覆盖,为true表示不管目的地地址是否有同名的文件都会覆盖;
// 为false表示目的地地址有同名的文件则报错org.apache.hadoop.fs.PathExistsException: `hdfs://hadoop102/xiyou/huaguoshan/sunwukong.txt': Target hdfs://hadoop102/xiyou/huaguoshan/sunwukong.txt already exists;
// 参数三:原数据路径Windows;参数四:目的地路径HDFS
7.2.1.2副本个数
为什么这里的副本有三个,因为在下面设置的
参数优先级:服务器的自定义配置(hdfs-site.xml) >服务器的默认配置(hdfs-default.xml)
7.2.1.3将hdfs-site.xml拷贝到项目的resources资源目录下
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
</configuration>
如果创建的文件副本变为了1,则
参数优先级:在项目资源目录下的用户自定义配置文件(如在resources下创建的hdfs-site.xml,可以看上面的过程) >服务器的自定义配置(hdfs-site.xml) >服务器的默认配置(hdfs-default.xml)
7.2.1.4客户端代码中设置的值
为2,则参数优先级排序:(1)客户端代码中设置的值 >(2)在项目资源目录下的用户自定义配置文件(如在resources下创建的hdfs-site.xml,可以看上面的过程) >(3)服务器的自定义配置(hdfs-site.xml) >(4)服务器的默认配置(hdfs-default.xml)
7.2.2HDFS文件下载
package com.summer.hdfs;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
/**
* @author Redamancy
* @create 2022-08-15 17:59
*/
public class HdfsClient {
private FileSystem fs;
@Before
public void init() throws URISyntaxException, IOException, InterruptedException {
//连接的集群nn地址
URI uri = new URI("hdfs://hadoop102:8020");
//创建一个配置文件
Configuration configuration = new Configuration();
configuration.set("dfs.replication","2");
//用户
String user = "summer";
//获取到了客户端对象
fs = FileSystem.get(uri, configuration,user);
}
@After
public void close() throws IOException {
//关闭资源
fs.close();
}
@Test
public void testGet() throws IOException {
//参数的解读:参数一:原文件是否删除;参数二:原文件路径HDFS;参数三:目标地址路径Windows;参数四:是否要校验CRC
fs.copyToLocalFile(false,new Path("hdfs://hadoop102/xiyou/huaguoshan"),new Path("D:\\"),false);
}
}
CRC文件是一个校验文件,保证文件传输完整。
注意:如果执行上面代码,下载不了文件,有可能是你电脑的微软支持的运行库少,需要安装一下微软运行库。
7.2.3HDFS文件更名和移动
package com.summer.hdfs;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
/**
* @author Redamancy
* @create 2022-08-15 17:59
*/
public class HdfsClient {
private FileSystem fs;
@Before
public void init() throws URISyntaxException, IOException, InterruptedException {
//连接的集群nn地址
URI uri = new URI("hdfs://hadoop102:8020");
//创建一个配置文件
Configuration configuration = new Configuration();
configuration.set("dfs.replication","2");
//用户
String user = "summer";
//获取到了客户端对象
fs = FileSystem.get(uri, configuration,user);
}
@After
public void close() throws IOException {
//关闭资源
fs.close();
}
//文件的更名和移动
@Test
public void testmv() throws IOException {
//参数解读:参数一:原文件路径;参数二:目标文件路径
//对文件名称的修改
fs.rename(new Path("/testinput/word.txt"),new Path("/testinput/summer.txt"));
//文件的更名和移动
fs.rename(new Path("/testinput/summer.txt"),new Path("/after.txt"));
//目录更名
fs.rename(new Path("/testinput"),new Path("/testoutput"));
}
}
7.2.3.1对文件名称的修改
核心代码:
fs.rename(new Path("/testinput/word.txt"),new Path("/testinput/summer.txt"));
7.2.3.2文件的更名和移动
核心代码:
fs.rename(new Path("/testinput/summer.txt"),new Path("/after.txt"));
7.2.3.3目录更名
核心代码:
fs.rename(new Path("/testinput"),new Path("/testoutput"));
7.2.4HDFS删除文件和目录
package com.summer.hdfs;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
/**
* @author Redamancy
* @create 2022-08-15 17:59
*/
public class HdfsClient {
private FileSystem fs;
@Before
public void init() throws URISyntaxException, IOException, InterruptedException {
//连接的集群nn地址
URI uri = new URI("hdfs://hadoop102:8020");
//创建一个配置文件
Configuration configuration = new Configuration();
configuration.set("dfs.replication","2");
//用户
String user = "summer";
//获取到了客户端对象
fs = FileSystem.get(uri, configuration,user);
}
@After
public void close() throws IOException {
//关闭资源
fs.close();
}
//文件删除
@Test
public void testRm() throws IOException {
//参数解读:参数一:要删除的路径;参数二:是否递归删除
//删除文件
fs.delete(new Path("/hadoop-3.1.3.tar.gz"),false);
//删除空目录
fs.delete(new Path("/xiyou"),false);
//删除非空目录
fs.delete(new Path("/jinguo"),true);
}
}
7.2.4.1删除文件
核心代码:
fs.delete(new Path("/hadoop-3.1.3.tar.gz"),false);
7.2.4.2删除空目录
核心代码:
fs.delete(new Path("/xiyou"),false);
7.2.4.3删除非空目录
核心代码:
fs.delete(new Path("/jinguo"),true);
7.2.5HDFS文件详情查看
查看文件名称、权限、长度、块信息
//获取文件详细信息
@Test
public void fileDetail() throws IOException {
//获取所有文件信息
RemoteIterator<LocatedFileStatus> listFiles = fs.listFiles(new Path("hdfs://hadoop102/"), 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.getReplication());
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));
}
=============hdfs://hadoop102/after.txt=============
rw-r--r--
summer
3
26
1659793848099
3
134217728
after.txt
[0,26,hadoop102,hadoop104,hadoop103]
=============hdfs://hadoop102/hadoop-3.1.3.tar.gz=============
rw-r--r--
summer
2
338075860
1660640604122
2
134217728
hadoop-3.1.3.tar.gz
[0,134217728,hadoop104,hadoop102, 134217728,134217728,hadoop103,hadoop102, 268435456,69640404,hadoop102,hadoop103]
=============hdfs://hadoop102/tmp/logs/summer/logs-tfile/application_1659955855387_0001/hadoop103_40403=============
rw-r-----
summer
3
66228
1659955977487
3
134217728
hadoop103_40403
[0,66228,hadoop102,hadoop104,hadoop103]
=============hdfs://hadoop102/tmp/logs/summer/logs-tfile/application_1659955855387_0001/hadoop104_43491=============
rw-r-----
summer
3
67455
1659955978021
3
134217728
hadoop104_43491
[0,67455,hadoop102,hadoop104,hadoop103]
=============hdfs://hadoop102/tmp/logs/summer/logs-tfile/application_1659963897517_0001/hadoop102_33697=============
rw-r-----
summer
3
32036
1659969846561
3
134217728
hadoop102_33697
[0,32036,hadoop102,hadoop104,hadoop103]
=============hdfs://hadoop102/tmp/logs/summer/logs-tfile/application_1659963897517_0001/hadoop104_42477=============
rw-r-----
summer
3
103855
1659969846884
3
134217728
hadoop104_42477
[0,103855,hadoop102,hadoop104,hadoop103]
Process finished with exit code 0
7.2.6HDFS文件和文件夹判断
package com.summer.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 Redamancy
* @create 2022-08-15 17:59
*/
public class HdfsClient {
private FileSystem fs;
@Before
public void init() throws URISyntaxException, IOException, InterruptedException {
//连接的集群nn地址
URI uri = new URI("hdfs://hadoop102:8020");
//创建一个配置文件
Configuration configuration = new Configuration();
configuration.set("dfs.replication","2");
//用户
String user = "summer";
//获取到了客户端对象
fs = FileSystem.get(uri, configuration,user);
}
@After
public void close() throws IOException {
//关闭资源
fs.close();
}
//判断是文件夹还是文件
@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());
}
}
}
}