API操作HDFS
一、HDFS获取文件系统
方法一
import static org.junit.Assert.*;
import java.net.URI;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.BlockLocation;
import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.LocatedFileStatus;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.fs.RemoteIterator;
import org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.NewAppWeightBooster;
import org.junit.Test;
import sun.nio.ch.Net;
//HDFS获取文件系统
@Test
public void initHDFS() throws Exception {
//1.创建对象
Configuration configuretion = new Configuration();
//2.设置参数
configuretion.set("fs.defaultFS","hdfs://node1:9000");
configuretion.set("dfs.replication", "3");
//3获取文件系统
FileSystem fs = FileSystem.get(configuretion);
//4打印
System.out.println(fs.toString());
}
方法二
(1) 首先src根目录下创建 core-site.xml ,配置信息如下
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<!-- 指定HDFS中NameNode的地址 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://node1:9000</value>
</property>
<!-- 指定hadoop运行时产生文件的存储目录 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/module/hadoop-2.8.2/data/tmp</value>
</property>
</configuration>
(2) 不用配置参数了,默认读取core-site.xml 信息
//HDFS获取文件系统
@Test
public void initHDFS() throws Exception {
//1.创建对象
Configuration configuretion = new Configuration();
//2获取文件系统
FileSystem fs = FileSystem.get(configuretion);
//3打印
System.out.println(fs.toString());
}
二、HDFS文件上传
(1)code
@Test
public void putFileToHDFS() throws Exception{
// 1 创建配置信息对象
// new Configuration();的时候,它就会去加载jar包中的hdfs-default.xml
// 然后再加载classpath下的hdfs-site.xml
Configuration configuration = new Configuration();
// 2 设置参数
// 参数优先级: 1、客户端代码中设置的值 2、classpath下的用户自定义配置文件 3、服务器的默认配置
configuration.set("dfs.replication", "2");
FileSystem fs = FileSystem.get(new URI("hdfs://node1:9000"),configuration, "victor");
// 3 创建要上传文件所在的本地路径
Path src = new Path("e:/hello.txt");
// 4 创建要上传到hdfs的目标路径
Path dst = new Path("hdfs://node1:9000/user/victor/hello.txt");
// 5 拷贝文件
fs.copyFromLocalFile(src, dst);
// 6 关闭资源
fs.close();
}
(2)将core-site.xml拷贝到项目的根目录下
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<!-- 指定HDFS中NameNode的地址 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://node1:9000</value>
</property>
</configuration>
(3)将hdfs-site.xml拷贝到项目的根目录下
<?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>
(4)测试参数优先级
优先级
客户端代码中设置的值 > ClassPath下的用户自定义配置文件 > 服务器的默认配置
三、HDFS文件下载
@Test
public void getFileFromHDFS() throws Exception{
// 1 创建配置信息对象
Configuration configuration = new Configuration();
FileSystem fs = FileSystem.get(new URI("hdfs://node1:9000"),configuration, "victor");
//fs.copyToLocalFile(boolean delSrc, Path src, Path dst, boolean useRawLocalFileSystem);
// boolean delSrc 指是否将原文件删除
// Path src 指要下载的文件路径
// Path dst 指将文件下载到的路径
// boolean useRawLocalFileSystem 是否开启文件效验
// 2下载文件
fs.copyToLocalFile(false,new Path("hdfs://node1:9000/user/victor/hello.txt"),new Path("e:/hellocopy.txt"), true);
// 3 关闭资源
fs.close();
}
四、HDFS目录创建
@Test
public void mkdirAtHDFS() throws Exception{
// 1 创建配置信息对象
Configuration configuration = new Configuration();
FileSystem fs = FileSystem.get(new URI("hdfs://node1:9000"),configuration, "victor");
// 2 创建目录
fs.mkdirs(new Path("hdfs://node1:9000/user/victor/output"));
// 3.关闭资源
fs.close();
}
五、HDFS文件夹 和文件 删除
@Test
public void deleteAtHDFS() throws Exception{
// 1 创建配置信息对象
Configuration configuration = new Configuration();
FileSystem fs = FileSystem.get(new URI("hdfs://node1:9000"),configuration, "victor");
// 2 删除文件夹 ,如果是非空文件夹,参数2是否递归删除,true递归
fs.delete(new Path("hdfs://node1:9000/user/victor/output"), true);
// 3 关闭资源
fs.close();
}
六、HDFS文件名更改
文件改名 + 文件夹改名
@Test
public void renameAtHDFS() throws Exception{
// 1 创建配置信息对象
Configuration configuration = new Configuration();
FileSystem fs = FileSystem.get(new URI("hdfs://node1:9000"),configuration, "victor");
//2 重命名文件或文件夹
fs.rename(new Path("hdfs://node1:9000/user/victor/hello.txt"), new Path("hdfs://node1:9000/user/victor/hellonihao.txt"));
// 3.关闭资源
fs.close();
}
七、HDFS文件详情查看
查看文件名称、权限、长度、块信息
@Test
public void readListFiles() throws Exception {
// 1 创建配置信息对象
Configuration configuration = new Configuration();
FileSystem fs = FileSystem.get(new URI("hdfs://node1:9000"),configuration, "victor");
RemoteIterator<LocatedFileStatus> listFiles = fs.listFiles(new Path("/"), true);
while (listFiles.hasNext()) {
LocatedFileStatus fileStatus = listFiles.next();
System.out.println(fileStatus.getPath().getName());
System.out.println(fileStatus.getBlockSize());
System.out.println(fileStatus.getPermission());
System.out.println(fileStatus.getLen());
BlockLocation[] blockLocations = fileStatus.getBlockLocations();
for (BlockLocation bl : blockLocations) {
System.out.println("block-offset:" + bl.getOffset());
String[] hosts = bl.getHosts();
for (String host : hosts) {
System.out.println(host);
}
}
System.out.println("--------------分割线--------------");
}
}
八、HDFS文件和文件夹判断
@Test
public void findAtHDFS() throws Exception {
// 1 创建配置信息对象
Configuration configuration = new Configuration();
FileSystem fs = FileSystem.get(new URI("hdfs://node1:9000"),configuration, "victor");
// 2 获取查询路径下的文件状态信息
FileStatus[] listStatus = fs.listStatus(new Path("/"));
// 3 遍历所有文件状态
for (FileStatus status : listStatus) {
if (status.isFile()) {
System.out.println("f--" + status.getPath().getName());
} else {
System.out.println("d--" + status.getPath().getName());
}
}
// 4.关闭资源
fs.close();
}