大数据1.9使用Java API操作HDFS

了解HDFS Java API

Hadoop文件系统API文档:https://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-common/filesystem/index.html

大数据1.9使用Java API操作HDFS_第1张图片

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文档:https://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-common/filesystem/filesystem.html

 大数据1.9使用Java API操作HDFS_第2张图片

  • 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项目

大数据1.9使用Java API操作HDFS_第3张图片

 大数据1.9使用Java API操作HDFS_第4张图片

 单击【Finish】按钮

2、添加相关依赖

  • pom.xml文件里添加hadoopjunit依赖

大数据1.9使用Java API操作HDFS_第5张图片

大数据1.9使用Java API操作HDFS_第6张图片

            
                          
                                     
        org.apache.hadoop      
        hadoop-client    
        3.3.4                  
   
    
                               
                                     
        junit                  
        junit            
        4.13.2                 
   
                                
                                                     
Maven Repository(Maven仓库)- https://mvnrepository.com/  搜索hadoop

 大数据1.9使用Java API操作HDFS_第7张图片

单击hadoop-client超链接

大数据1.9使用Java API操作HDFS_第8张图片

 单击3.3.4超链接

大数据1.9使用Java API操作HDFS_第9张图片

3、创建日志属性文件

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

大数据1.9使用Java API操作HDFS_第10张图片

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

大数据1.9使用Java API操作HDFS_第11张图片

 在Hadoop WebUI界面查看

大数据1.9使用Java API操作HDFS_第12张图片

5、在HDFS上创建文件

  • 在HDFS Shell里利用hdfs dfs -touchz命令可以创建时间戳文件
  • 任务:在/ied01目录创建hadoop.txt文件
  • 创建net.yang.hdfs包,在包里创建CreateFileOnHDFS

 大数据1.9使用Java API操作HDFS_第13张图片

  • 编写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 + "]创建失败!");
        }
    }
}
 

 运行程序,查看结果

大数据1.9使用Java API操作HDFS_第14张图片

 利用Hadoop WebUI查看

大数据1.9使用Java API操作HDFS_第15张图片

  • /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

 大数据1.9使用Java API操作HDFS_第16张图片

 查看exists(Path path)方法

大数据1.9使用Java API操作HDFS_第17张图片

 编写create2()方法,事先判断文件是否存在

大数据1.9使用Java API操作HDFS_第18张图片

 运行程序,查看结果

6、写入HDFS文件

  • 类似于HDFS Shell里的hdfs dfs -put命令
  • net.yang.hdfs包里创建WriteFileOnHDFS大数据1.9使用Java API操作HDFS_第19张图片

(1)将数据直接写入HDFS文件

  • 任务:在/ied01目录里创建hello.txt文件
  • 创建write1()方法大数据1.9使用Java API操作HDFS_第20张图片

 运行write1()测试方法,查看结果,抛出RemoteException异常,三个数据节点都在运行,但是无法写入数据

大数据1.9使用Java API操作HDFS_第21张图片

 修改代码,设置数据节点主机名属性,如下图所示

 大数据1.9使用Java API操作HDFS_第22张图片

运行write1()测试方法,查看结果,抛出RemoteException异常,三个数据节点都在运行,但是无法写入数据

 利用Hadoop WebUI查看hello.txt文件

大数据1.9使用Java API操作HDFS_第23张图片

(2)将本地文件写入HDFS文件

  • 在项目根目录创建一个文本文件test.txt大数据1.9使用Java API操作HDFS_第24张图片

  • 创建write2()方法大数据1.9使用Java API操作HDFS_第25张图片

  • 运行write2()测试方法,查看结果大数据1.9使用Java API操作HDFS_第26张图片  

  • 查看/ied01/exam.txt内容

        大数据1.9使用Java API操作HDFS_第27张图片 

7、读取HDFS文件

  • 相当于Shell里的两个命令:hdfs dfs -cathdfs dfs -get
  • net.yang.hdfs包里创建ReadFileOnHDFS

        大数据1.9使用Java API操作HDFS_第28张图片 

(1)读取HDFS文件直接在控制台显示

  • 准备读取hdfs://master:9000/ied01/test.txt文件

 大数据1.9使用Java API操作HDFS_第29张图片

       编写read1()方法

        ·大数据1.9使用Java API操作HDFS_第30张图片

         运行read1()测试方法,查看结果

        大数据1.9使用Java API操作HDFS_第31张图片 

(2)读取HDFS文件,保存为本地文件

  • 任务:将/ied01/test.txt下载到项目的download目录里
  • 创建download目录

         大数据1.9使用Java API操作HDFS_第32张图片

         创建read2()方法

        大数据1.9使用Java API操作HDFS_第33张图片 

         运行read2()测试方法,查看结果

        

        大数据1.9使用Java API操作HDFS_第34张图片                   

8、重命名目录或文件

  • 相当于Shell里的hdfs dfs -mv命令
  • net.yang.hdfs包里创建RenameDirOrFile

        大数据1.9使用Java API操作HDFS_第35张图片

(1)重命名目录

  • 任务:将/ied01目录更名为/lzy01
  • 编写renameDir()方法          大数据1.9使用Java API操作HDFS_第36张图片

        运行renameDir()方法,查看结果

        

         利用Hadoop WebUI界面查看        

(2)重命名文件

  • 任务:将lzy01目录下的hello.txt重命名为hi.txt

  • 编写renameFile()方法大数据1.9使用Java API操作HDFS_第37张图片

  • 运行renameFile()测试方法,查看结果

         

         利用Hadoop WebUI界面查看

                 大数据1.9使用Java API操作HDFS_第38张图片

9、显示文件列表

  • net.yang.hdfs包里创建ListHDFSFiles大数据1.9使用Java API操作HDFS_第39张图片

(1)显示指定目录下文件全部信息

  • 任务:显示/lzy01目录下的文件列表

大数据1.9使用Java API操作HDFS_第40张图片 编写list1()方法大数据1.9使用Java API操作HDFS_第41张图片

 运行list1()测试方法,查看结果

(2)显示指定目录下文件路径和长度信息

  • 编写list2()方法

        

10、获取文件块信息

  • 任务:获取/lzy01/hadoop-3.3.4.tar.gz文件块信息

  • net.hw.hdfs包里创建GetBlockLocations

     大数据1.9使用Java API操作HDFS_第42张图片

  • 用到getFileBlockLocations()方法来获取物理切块信息大数据1.9使用Java API操作HDFS_第43张图片

  • 编写代码,获取文件块信息大数据1.9使用Java API操作HDFS_第44张图片

  • 运行程序,查看结果(切点位置,块大小,块存在位置)大数据1.9使用Java API操作HDFS_第45张图片

  •  由此可见,hadoop-3.3.4.tar.gz被hadoop物理切分成6块,前5块长度均为134217728字节(128MB),第6块长度为24369142字节(23.24MB)

11、创建目录

  • 任务:在HDFS上创建/ied01目录
  • net.hw.hdfs包里创建MakeDirOnHDFS

        大数据1.9使用Java API操作HDFS_第46张图片

         运行程序,查看结果

        

         利用Hadoop WebUI界面查看

                 大数据1.9使用Java API操作HDFS_第47张图片

12、判断目录或文件是否存在

  • 任务:判断HDFS上/ied01目录是否存在,判断/ied01/hadoop.txt文件是否存在

  • net.hw.hdfs包里创建DirFileExistsOrNot

        大数据1.9使用Java API操作HDFS_第48张图片 

  • 编写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 + "]不存在!");
            }
        }
    }

  • 运行程序,查看结果

         

13、判断Path指向目录还是文件

  • net.hw.hdfs包里创建PathToFileOrDir

        大数据1.9使用Java API操作HDFS_第49张图片 

         大数据1.9使用Java API操作HDFS_第50张图片

         运行程序,查看结果

        

14、删除目录或文件

  • net.hw.hdfs包里创建DeleteFileOrDir

        大数据1.9使用Java API操作HDFS_第51张图片 

(1)删除文件

  • 任务:删除/lzy01/test2.txt文件

        大数据1.9使用Java API操作HDFS_第52张图片 

         运行deleteFile()测试方法,查看结果

        

         再运行deleteFile()测试方法,查看结果

        

         可以在删除文件之前,判断文件是否存在,需要修改代码

        大数据1.9使用Java API操作HDFS_第53张图片

         此时运行deleteFile()测试方法,查看结果

        

        (2)删除目录

        任务:删除/lzy01目录编写deleteDir()方法

        大数据1.9使用Java API操作HDFS_第54张图片

         运行deleteDir()方法,查看结果

        

        再运行deleteDir()方法,查看结果

        

        (3)删除目录或文件

        进行三个层面的判断:判断是否存在、判断类型(目录或文件)、判断删除是否成功

        任务:删除/ied02/exam.txt文件和/lzy01目录

        编写delete()方法

                        ​​​​​​​        大数据1.9使用Java API操作HDFS_第55张图片

         运行程序,查看结果

        ​​​​​​​

         再次运行程序,查看结果

        

 

你可能感兴趣的:(大数据,java,hdfs)