当前位置:   article > 正文

4.4 使用Java API操作HDFS_hdfs的java api操作

hdfs的java api操作

学习目标:

  1. 了解HDFS Java API
  2. 掌握使用Java API操作HDFS

 一、导入新课

  • 上一节对HDFS的Shell操作进行了详细的讲解,而HDFS Shell本质上就是对Java API的应用。本节课将针对HDFS Java API操作进行详细讲解。

 二、新课讲解

 由于Hadoop是使用Java语言编写的,因此可以使用Java API操作Hadoop文件系统。HDFS Shell本质上就是对Java API的应用,通过编程的形式操作HDFS,其核心是使用HDFS提供的Java API构造一个访问客户端对象,然后通过客户端对象对HDFS上的文件进行操作(增、删、改、查)


(一)了解HDFS Java API

 Hadoop文件系统API文档:Apache Hadoop 3.3.4 – The Hadoop FileSystem API Definition

1、HDFS常见类与接口

  • 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)来判断是否接收路径path表示的文件或目录。

 2、FileSystem的常用方法

FileSystem类API文档:Apache Hadoop 3.3.4 – class

  • FileSystem对象的一些方法可以对文件进行操作
方法名 功能描述
copyFromLocalFile(Path src, Path dst) 从本地磁盘复制文件到HDFS
copyToLocalFile(Path src, Path dst) 从HDFS复制文件到本地磁盘
mkdirs(Path f) 建立子目录
rename(Path src, Path dst) 重命名文件或文件夹
delete(Path f) 删除指定文件

 (二)编写Java程序访问HDFS

1、创建Maven项目

创建Maven项目 - HDFSDemo

 单击【Finish】按钮

 2、添加相关依赖

pom.xml文件里添加hadoopjunit依赖


  1. <dependencies>
  2. <dependency>
  3. <groupId>org.apache.hadoop</groupId>
  4. <artifactId>hadoop-client</artifactId>
  5. <version>3.3.4</version>
  6. </dependency>
  7. <dependency>
  8. <groupId>junit</groupId>
  9. <artifactId>junit</artifactId>
  10. <version>4.13.2</version>
  11. </dependency>
  12. </dependencies>

 Maven Repository(Maven仓库)- https://mvnrepository.com/

 搜索hadoop

 单击hadoop-client超链接

 单击3.3.4超链接

 3、创建日志属性文件

 在resources目录里创建log4j.properties文件

  1. log4j.rootLogger=stdout, logfile
  2. log4j.appender.stdout=org.apache.log4j.ConsoleAppender
  3. log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
  4. log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n
  5. log4j.appender.logfile=org.apache.log4j.FileAppender
  6. log4j.appender.logfile.File=target/hdfs.log
  7. log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
  8. log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] - %m%n

 4、启动集群HDFS服务

 在主节点上执行命令:start-dfs.sh

 在Hadoop WebUI界面查看

5、在HDFS上创建文件

 创建net.hw.hdfs包,在包里创建CreateFileOnHDFS

 

 在HDFS上有/ied01目录,在该目录里创建hadoop.txt文件

  1. package net.hw.hdfs;
  2. import org.apache.hadoop.conf.Configuration;
  3. import org.apache.hadoop.fs.FileSystem;
  4. import org.apache.hadoop.fs.Path;
  5. import java.net.URI;
  6. /**
  7. * 功能:在HDFS上创建文件
  8. * 作者:华卫
  9. * 日期:2022年11月18日
  10. */
  11. public class CreateFileOnHDFS {
  12. public static void main(String[] args) throws Exception {
  13. // 创建配置对象
  14. Configuration conf = new Configuration();
  15. // 定义统一资源标识符
  16. String uri = "hdfs://master:9000";
  17. // 创建文件系统对象
  18. FileSystem fs = FileSystem.get(new URI(uri), conf);
  19. // 创建路径对象
  20. Path path = new Path(uri + "/ied01/hadoop.txt");
  21. // 创建文件
  22. boolean result = fs.createNewFile(path);
  23. // 判断文件是否创建成功
  24. if (result) {
  25. System.out.println("文件[" + path + "]创建成功!");
  26. } else {
  27. System.out.println("文件[" + path + "]创建失败!");
  28. }
  29. }
  30. }

 注意:导包千万不要导错了

 

 运行程序,查看结果

  利用HDFS集群WebUI查看

在/ied01目录里确实创建了一个0字节的hadoop.txt文件,有点类似于Hadoop Shell里执行hdfs dfs -touchz /ied01/hadoop.txt命令的效果,但是有一点不同,hdfs dfs -touchz命令重复执行,不会失败,只是不断改变该文件的时间戳。
 

 再次运行程序,由于hadoop.txt已经存在,此时会提示用户创建失败

能否事先判断文件是否存在呢?我们去查看Hadoop FileSystem API文档

Apache Hadoop 3.3.4 – class

 查看exists(Path path)方法

net.hw.hdfs包里创建CreateFileOnHDFS类,事先判断文件是否存在

  1. package net.hw.hdfs;
  2. import org.apache.hadoop.conf.Configuration;
  3. import org.apache.hadoop.fs.FileSystem;
  4. import org.apache.hadoop.fs.Path;
  5. import java.net.URI;
  6. /**
  7. * 功能:在HDFS上创建文件
  8. * 事先判断文件是否存在
  9. * 作者:华卫
  10. * 日期:2022年11月25日
  11. */
  12. public class CreateFileOnHDFS_ {
  13. public static void main(String[] args) throws Exception {
  14. // 创建配置对象
  15. Configuration conf = new Configuration();
  16. // 定义统一资源标识符(uri:uniform resource identifier)
  17. String uri = "hdfs://master:9000";
  18. // 创建文件系统对象(基于HDFS的文件系统)
  19. FileSystem fs = FileSystem.get(new URI(uri), conf);
  20. // 创建路径对象
  21. Path path = new Path(uri + "/ied01/hadoop.txt");
  22. // 判断路径对象指向的文件是否存在
  23. if (fs.exists(path)) {
  24. // 提示用户文件已存在
  25. System.out.println("文件[" + path + "]已经存在!");
  26. } else {
  27. // 基于路径对象创建文件
  28. boolean result = fs.createNewFile(path);
  29. // 根据返回值判断文件是否创建成功
  30. if (result) {
  31. System.out.println("文件[" + path + "]创建成功!");
  32. } else {
  33. System.out.println("文件[" + path + "]创建失败!");
  34. }
  35. }
  36. }
  37. }

 运行程序,查看结果

 注意:如果出现“不支持发行版本5”的问题  用以下解决方法尝试

(一)设置项目sdk与语言等级

打开项目窗口,设置项目sdk-jdk11.项目语言等级-11

 进入project

 

 

(二)设置模块语言等级

设置模块语言等级11

 

(三)设置java编译器等级

打开设置对话框,查看jav

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/代码探险家/article/detail/740496
推荐阅读
相关标签
  

闽ICP备14008679号