赞
踩
Hadoop文件系统API文档:https://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-common/filesystem/index.html
Hadoop整合了众多文件系统,HDFS只是这个文件系统的一个实例,下表整合了一些类或接口:
类或接口 | 功能描述 |
---|---|
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)来判断 |
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) | 删除指定文件 |
创建名称为HDFSDemo的Maven项目
创建成功
在pom.xml文件里添加hadoop和junit依赖
1.在pox.xml文件中添加如下内容:
<dependencies>
<!--hadoop客户端-->
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>3.3.4</version>
</dependency>
<!--单元测试框架-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
</dependency>
</dependencies>
2.下载相关依赖到本地仓库
3.查看下载好的依赖
1.右击【resources】,选择【New】,单击【Resource Bundle】
2.在弹出的对话框中输入log4j,按【ok】键,成功创建
3.向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 Shell里利用hdfs dfs -touchz命令可以创建时间戳文件+
1.右击【java】,选择【New】,单击【Package】
2.在弹出的对话框中输入:net.army.hdfs,按下回车键,创建成功
1.右击【net.army.hdfs】包,选择【New】,单击【Java Class】
2.在弹出的对话框中输入:CreateFileOnHDFS,按下回车键,创建成功
create1()源码
@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查看
create2()源码
@Test public void create2() 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"); // 判断路径对象指向的文件是否存在 if (fs.exists(path)) { // 提示用户文件已存在 System.out.println("文件[" + path + "]已经存在!"); } else { // 基于路径对象创建文件 boolean result = fs.createNewFile(path); // 根据返回值判断文件是否创建成功 if (result) { System.out.println("文件[" + path + "]创建成功!"); } else { System.out.println("文件[" + path + "]创建失败!"); } } }
运行程序,查看结果
注:类似于HDFS Shell里的hdfs dfs -put命令
1.右击【net.army.hdfs】包,选择【New】,单击【Java Class】
2.在弹出的对话框中输入:WriteFileOnHDFS,按下回车键,创建成功
创建write1()方法
write1()源码
@Test public void write1() 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/hello.txt"); // 创建文件系统数据字节输出流(出水管:数据从程序到文件) FSDataOutputStream out = fs.create(path); // 通过字节输出流向文件写数据 out.write("Hello Hadoop World".getBytes()); // 关闭文件系统数据字节输出流 out.close(); // 关闭文件系统对象 fs.close(); // 提示用户写文件成功 System.out.println("文件[" + path + "]写入成功!"); }
运行write1()测试方法,查看结果,抛出RemoteException异常,三个数据节点都在运行,但是无法写入数据
修改代码,设置数据节点主机名属性,如下图所示
运行程序,查看结果
在Hadoop WebUI查看hello.txt文件
在项目根目录创建一个文本文件test.txt
1.右击【HDFSDemo】,选择【New】,单击【File】
2.在弹出的对话框中输入test.txt,按下回车键,创建成功
3.向test.txt文件添加如下内容:
hello linux world
hello hadoop world
hello zookeeper world
hello hive world
hell hbase world
创建write2()方法
write2()源码
@Test
public void write2() throws Exception {
// 创建配置对象
Configuration conf = new Configuration();
// 设置数据节点主机名属性
conf.set("dfs.client.use.datanode.hostname", "true");
// 定义统一资源标识符(uri: uniform resource identifier)
String uri = "hdfs://master:9000";
// 创建文件系统对象(基于HDFS的文件系统)
FileSystem fs = FileSystem.get(new URI(uri), conf, "root");
// 创建路径对象(指向文件)
Path path = new Path(uri + "/ied01/exam.txt"
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。