4.4 使用Java API操作HDFS

学习目标:

  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依赖


<dependencies>                                    
    <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>                                                      

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

 搜索hadoop

 单击hadoop-client超链接

 单击3.3.4超链接

 3、创建日志属性文件

 在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

 4、启动集群HDFS服务

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

 在Hadoop WebUI界面查看

5、在HDFS上创建文件

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

 

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

package net.hw.hdfs;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;

import java.net.URI;

/**
 * 功能:在HDFS上创建文件
 * 作者:华卫
 * 日期:2022年11月18日
 */
public class CreateFileOnHDFS {
    public static void main(String[] args) throws Exception {
        // 创建配置对象
        Configuration conf = new Configuration();
        // 定义统一资源标识符
        String uri = "hdfs://master:9000";
        // 创建文件系统对象
        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 + "]创建失败!");
        }
    }
}

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

 

 运行程序,查看结果

  利用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类,事先判断文件是否存在

package net.hw.hdfs;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;

import java.net.URI;

/**
 * 功能:在HDFS上创建文件
 *      事先判断文件是否存在
 * 作者:华卫
 * 日期:2022年11月25日
 */
public class CreateFileOnHDFS_ {
    public static void main(String[] args) 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 + "]创建失败!");
            }
        }
    }
}

 运行程序,查看结果

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

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

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

 进入project

 

 

(二)设置模块语言等级

设置模块语言等级11

 

(三)设置java编译器等级

打开设置对话框,查看jav

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值