Hadoop之HDFS(二)java客户端操作

Hadoop之HDFS(二)java客户端操作

java客户端操作

  • 核心API
API 含义和作用
Configuration 配置信息,封装hdfs操作的相关配置文件信息
FileSystem HDFS的分布式文件系统工具,操作HDFS文件。
IOUtils IO操作的工具类
Path 封装表示HDFS文件路径
  • 配置windows的Hadoop执行环境
1. 将hadoop2.9.2解压到window中,路径不能有中文,不能有空格。
2. 拷贝hadoop的windows执行环境工具到bin路径下,替换客户端工具。
3. 配置环境变量
	HADOOP_HOME=hadoop安装路径
	PATH=hadoop安装路径/bin
4. 重启IDEA或者eclipse
  • 加入Hadoop依赖
<!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-common -->
<dependency>
    <groupId>org.apache.hadoop</groupId>
    <artifactId>hadoop-common</artifactId>
    <version>2.9.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-hdfs -->
<dependency>
    <groupId>org.apache.hadoop</groupId>
    <artifactId>hadoop-hdfs</artifactId>
    <version>2.9.2</version>
</dependency>
  • 导入log4j.properties(从Linux的Hadoop目录下etc中拷贝)

java常见操作

  • 文件下载
	//HDFS文件下载
    @Test
    public void test01() throws IOException {
    
    
        //1.创建配置信息,关联HDFS信息:Configuration
        Configuration configuration = new Configuration();
        configuration.set("fs.defaultFS", "hdfs://hadoop10:9000");
        //2.获得操作HDFS文件的工具
        FileSystem fileSystem = FileSystem.get(configuration);
        //3.通过命令获得java的输入流
        FSDataInputStream fsDataInputStream = fileSystem.open(new Path("/demo/test.tar.gz"));
        //4.IO操作数据
        FileOutputStream fileOutputStream = new FileOutputStream("D:/test.tar.gz");
        IOUtils.copyBytes(fsDataInputStream, fileOutputStream, 1024, true);
    }

封装FileSystem

配置信息转移文件

  1. 将配置文件core-site.xml拷贝到java项目的resources文件夹中

  2. 导入log4j配置文件

  3. 使用classpath类加载输入流指向core-site.xml

InputStream is = Test1.class.getResourceAsStream("/core-site.xml")

  1. 讲配置文件加入封装到Configuration

conf.addResource(is)

  • 文件上传

注意:需要给windows的用户开启hdfs文件创建权限
否则会出现:Permission denied: user=X230, access=WRITE, inode="/hdfs":root:supergroup:drwxr-xr-x

	//HDFS文件上传
    @Test
    public void test03() throws IOException {
    
    
        //1.获得FileSystem
		//将配置文件core-site.xml拷贝到java项目的resources文件夹中,将配置读取到输入流中
        InputStream inputStream = HDFSUtil.class.getResourceAsStream("/core-site.xml");
        Configuration configuration = new Configuration();
        //将配置文件加入封装到configuration中
        configuration.addResource(inputStream);
        //获得操作HDFS文件的工具
        FileSystem fileSystem = FileSystem.get(configuration);
		
        //2.获得输出到远程HDFS的输出流
        FSDataOutputStream fsDataOutputStream = fileSystem.create(new Path("/demo/test2.tar.gz"));
        //3.获得java本地读入文件的输入流
        FileInputStream fileInputStream = new FileInputStream("D:/test.tar.gz");
        //4.IOUtils操作
        IOUtils.copyBytes(fileInputStream, fsDataOutputStream, 2014, true);
    }
  • 创建文件夹

    注意:需要给windows的用户开启hdfs文件创建权限

boolean isok = fileSystem.mkdir(new Path("/baizhi/yangdddir"));//返回值boolean,是否创建成功。
  • 判断文件是否存在
boolean isexist = fileSystem.exists(new Path("/baizhi/yangdd"))
  • 删除文件

    注意:需要给windows的用户开启hdfs文件创建权限
    -rm -r

/**
参数1:远端hdfs的文件路径
参数2:是否递归删除,如果给false,删除无法递归则会抛出异常
返回值:是否删除成功

*/
Boolean deleteOK = fileSystem.delete(new Path("hdfs文件路径"),true);
  • 展示文件的元数据信息
 	// 获得目录下所有文件的
	FileStatus[] fileStatuses = fs.listStatus(new Path("/hdfs"));
    for (FileStatus file : fileStatuses) {
    
    
            //1. 获得文件路径
            Path path = file.getPath();
            //2. 获得文件权限
            FsPermission permission = file.getPermission();
            //3. 获得文件副本数
            short replication = file.getReplication();
            //4. 获得文件修改时间,long的时间戳
            long modificationTime = file.getModificationTime();
            //5. 获得文件大小,单位B
            long len = file.getLen();
    }
  • 递归遍历文件,并且可以获取文件块所在的位置
        /**
         * 功能:递归获得目录下的所有文件的元数据信息,相当于hdfs的ls命令
         * listFiles参数1:要查看的目录
         * listFiles参数2:是否递归 -R
         */
        RemoteIterator<LocatedFileStatus> files = fs.listFiles(new Path("/hdfs"), true);
        while(files.hasNext()){
    
    
            //迭代获得每个file元数据
            LocatedFileStatus file = files.next();
            //1. 获得文件路径
            Path path = file.getPath();
            //2. 获得文件权限
            FsPermission permission = file.getPermission();
            //3. 获得文件副本数
            short replication = file.getReplication();
            //4. 获得文件修改时间,long的时间戳
            long modificationTime = file.getModificationTime();
            //5. 获得文件大小,单位B
            long len = file.getLen();
            //6. 获得block的切片分布信息
            BlockLocation[] blockLocations = file.getBlockLocations();
        }

其他常见方法(了解)

方法 含义
fs.getDefaultBlockSize(hdfs的path); 获得默认block大小
fs.getFileChecksum(hdfs的path); 获得checksum(指纹 数字签名)
fs.getDefaultReplication(hdfs的path); 获得默认副本集

Client上传下载原理

文件下载流程

在这里插入图片描述

文件上传流程

在这里插入图片描述
在这里插入图片描述

Guess you like

Origin blog.csdn.net/weixin_44191814/article/details/120354375