Hadoop文件系统API文档:https://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-common/filesystem/index.html
类或接口 | 功能描述 |
---|---|
org.apache.hadoop.fs.FileSystem | 一个通用文件系统的抽象基类,可被分布式文件系统继承。 |
org.apache.hadoop.fs.FileStatus | 文件状态接口,用于向客户端展示系统中文件和目录的元数据。具体包括文件大小、块大小、副本信息、所有者、修改时间等,可通过FileSystem.listStatus()方法获得具体的实例对象。 |
org.apache.hadoop.fs.FileDataInputStream | 文件输入流,用于读取Hadoop文件。 |
org.apache.hadoop.fs.FileDataOutputStream | 文件输出流,用于写Hadoop文件。 |
org.apache.hadoop.fs.Configuration | 访问配置项,所有配置项的值,如果在core-site.xml中有对应的配置,则以core-site.xml为准。 |
org.apache.hadoop.fs.Path | 路径,用于表示Hadoop文件系统中的一个文件或一个目录的路径。 |
org.apache.hadoop.fs.PathFilter | 路径过滤器接口,通过实现方法PathFilter.accept(Path path)来判断是否接收路径path表示的文件或目录。 |
FileSystem类API文档:https://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-common/filesystem/filesystem.html
FileSystem对象的一些方法可以对文件进行操作
方法名 | 功能描述 |
---|---|
copyFromLocalFile(Path src, Path dst) | 从本地磁盘复制文件到HDFS |
copyToLocalFile(Path src, Path dst) | 从HDFS复制文件到本地磁盘 |
mkdirs(Path f) | 建立子目录 |
rename(Path src, Path dst) | 重命名文件或文件夹 |
delete(Path f) | 删除指定文件 |
单击【Finish】按钮
pom.xml
文件里添加hadoop
和junit
依赖
Maven Repository(Maven仓库)- https://mvnrepository.com/ 搜索hadoop
单击hadoop-client
超链接
单击3.3.4
超链接
resources
目录里创建log4j.properties
文件log4j.rootLogger=stdout, logfile 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/hdfs.log log4j.appender.logfile.layout=org.apache.log4j.PatternLayout log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] - %m%n
在主节点上执行命令:start-dfs.sh
在Hadoop WebUI界面查看
hdfs dfs -touchz
命令可以创建时间戳文件/ied01
目录创建hadoop.txt
文件net.yang.hdfs
包,在包里创建CreateFileOnHDFS
类create1()
方法package net.hw.hdfs;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.junit.Test;
import java.net.URI;
public class CreateFileOnHDFS {
@Test
public void create1() throws Exception {
// 创建配置对象
Configuration conf = new Configuration();
// 定义统一资源标识符(uri: uniform resource identifier)
String uri = "hdfs://master:9000";
// 创建文件系统对象(基于HDFS的文件系统)
FileSystem fs = FileSystem.get(new URI(uri), conf);
// 创建路径对象(指向文件)
Path path = new Path(uri + "/ied01/hadoop.txt");
// 基于路径对象创建文件
boolean result = fs.createNewFile(path);
// 根据返回值判断文件是否创建成功
if (result) {
System.out.println("文件[" + path + "]创建成功!");
} else {
System.out.println("文件[" + path + "]创建失败!");
}
}
}
运行程序,查看结果
利用Hadoop WebUI查看
在/ied01
目录里确实创建了一个0
字节的hadoop.txt
文件,有点类似于Hadoop Shell里执行hdfs dfs -touchz /ied01/hadoop.txt
命令的效果,但是有一点不同,hdfs dfs -touchz
命令重复执行,不会失败,只是不断改变该文件的时间戳。
能否事先判断文件是否存在呢?我们去查看Hadoop FileSystem API文档
https://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-common/filesystem/filesystem.html
查看exists(Path path)
方法
编写create2()
方法,事先判断文件是否存在
运行程序,查看结果
(1)将数据直接写入HDFS文件
运行write1()
测试方法,查看结果,抛出RemoteException
异常,三个数据节点都在运行,但是无法写入数据
修改代码,设置数据节点主机名属性,如下图所示
运行write1()
测试方法,查看结果,抛出RemoteException
异常,三个数据节点都在运行,但是无法写入数据
利用Hadoop WebUI查看hello.txt
文件
hdfs dfs -cat
和hdfs dfs -get
net.yang.hdfs
包里创建ReadFileOnHDFS
类(1)读取HDFS文件直接在控制台显示
准备读取hdfs://master:9000/ied01/test.txt
文件
编写read1()
方法
运行read1()
测试方法,查看结果
/ied01/test.txt
下载到项目的download
目录里download
目录 创建read2()
方法
运行read2()
测试方法,查看结果
hdfs dfs -mv
命令net.yang.hdfs
包里创建RenameDirOrFile
类(1)重命名目录
运行renameDir()
方法,查看结果
(2)重命名文件
利用Hadoop WebUI界面查看
(1)显示指定目录下文件全部信息
/lzy01
目录下的文件列表(2)显示指定目录下文件路径和长度信息
list2()
方法任务:获取/lzy01/hadoop-3.3.4.tar.gz
文件块信息
在net.hw.hdfs
包里创建GetBlockLocations
类
由此可见,hadoop-3.3.4.tar.gz
被hadoop物理切分成6
块,前5
块长度均为134217728
字节(128
MB),第6
块长度为24369142
字节(23.24
MB)
/ied01
目录net.hw.hdfs
包里创建MakeDirOnHDFS
类运行程序,查看结果
利用Hadoop WebUI界面查看
任务:判断HDFS上/ied01
目录是否存在,判断/ied01/hadoop.txt
文件是否存在
在net.hw.hdfs
包里创建DirFileExistsOrNot
类
编写dirExists()
方法
package net.yang.hdfs;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.junit.Test;
import java.net.URI;
public class DirFileExistsOrNot {
@Test
public void dirExists() throws Exception {
// 创建配置对象
Configuration conf = new Configuration();
// 设置数据节点主机名属性
conf.set("dfs.client.use.datanode.hostname", "true");
// 定义uri字符串
String uri = "hdfs://master:9000";
// 创建文件系统对象
FileSystem fs = FileSystem.get(new URI(uri), conf, "root");
// 创建路径对象,指向目录
Path path = new Path("/ied01");
// 判断目录是否存在
if (fs.exists(path)) {
System.out.println("目录[" + path + "]存在!");
} else {
System.out.println("目录[" + path + "]不存在!");
}
}
}
运行程序,查看结果
net.hw.hdfs
包里创建PathToFileOrDir
类运行程序,查看结果
net.hw.hdfs
包里创建DeleteFileOrDir
类(1)删除文件
/lzy01/test2.txt
文件 运行deleteFile()
测试方法,查看结果
再运行deleteFile()
测试方法,查看结果
可以在删除文件之前,判断文件是否存在,需要修改代码
此时运行deleteFile()
测试方法,查看结果
(2)删除目录
任务:删除/lzy01
目录编写deleteDir()
方法
运行deleteDir()
方法,查看结果
再运行deleteDir()
方法,查看结果
(3)删除目录或文件
进行三个层面的判断:判断是否存在、判断类型(目录或文件)、判断删除是否成功
任务:删除/ied02/exam.txt
文件和/lzy01
目录
编写delete()
方法
运行程序,查看结果
再次运行程序,查看结果