基于Java API实现HDFS文件的操作

大数据技术 潘老师 3年前 (2021-04-22) 1962 ℃ (0) 扫码查看

准备

使用Java API操作HDFS中文件主要涉及如下几个类:
1)Configuration类:该类的对象封装了客户端或者服务器的配置。
2)FileSystem 类:该类的对象是一个文件系统对象,可以用该对象的一些方法对文件进行操作。FileSystem fs = FileSystem.get(conf);通过FileSystem的静态方法get获得该对象。
3)FSDatalnputStream FSDataOutputStream:这两个类是HDFS中的输入/输出流,分别通过FileSystem的open 方法和create方法获得。

代码实现

以下我们会通过实例代码来介绍如何利用Java API进行文件夹的创建、文件列表显示、文件上传的文件下载的操作。

1、创建Maven项目

我们基于Maven创建一个java项目,使用的archetype为maven-archetype-quickstart,在此不再赘述

2、添加依赖

我们在pom.xml中添加HDFS操作的相关依赖(依赖版本尽量与安装的hadoop版本一致),如下:

<dependency>
    <groupId>org.apache.hadoop</groupId>
    <artifactId>hadoop-common</artifactId>
    <version>3.2.1</version>
</dependency>
<dependency>
    <groupId>org.apache.hadoop</groupId>
    <artifactId>hadoop-client</artifactId>
    <version>3.2.1</version>
</dependency>
<dependency>
    <groupId>org.apache.hadoop</groupId>
    <artifactId>hadoop-hdfs</artifactId>
    <version>3.2.1</version>
</dependency>

2、创建测试类

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.*;

import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;

/**
 * <h3>hdfs</h3>
 *
 * @author panziye
 * @description <p></p>
 * @date 2021-04-22 12:30
 **/
public class TestHDFS {
    //1.创建文件夹
    public static void createFloder(){
        //定义一个配置对象
        Configuration conf = new Configuration();
        try {
            //URI对象通过使用HDFS协议指定HDFS文件系统配置的节点地址,ip可换为主机映射名
            URI uri = new URI("hdfs://192.168.55.100:9820");
            //根据配置信息获取文件系统对象
            FileSystem fs = FileSystem.get(uri, conf);
            //在指定路径下创建文件夹
            Path path = new Path("/yunpan");
            fs.mkdirs(path);
        } catch (URISyntaxException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    //2.上传文件
    public static void uploadFile(){
        //定义一个配置对象
        Configuration conf = new Configuration();
        try {
            //URI对象
            URI uri = new URI("hdfs://192.168.55.100:9820");
            //根据配置信息获取文件系统对象
            FileSystem fs = FileSystem.get(uri, conf);
            //定义文件的路径和上传路径
            Path src = new Path("D://hello.txt");
            Path dest = new Path("/yunpan/hello.txt");
            //从本地上传到文件服务器上
            fs.copyFromLocalFile(src,dest);
        } catch (URISyntaxException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    //3.递归显示文件
    public static void listFile(Path path){
        //定义一个配置对象
        Configuration conf = new Configuration();
        try {
            //URI对象
            URI uri = new URI("hdfs://192.168.55.100:9820");
            //根据配置信息获取文件系统对象
            FileSystem fs = FileSystem.get(uri, conf);
            // true 表示递归查找 ; false 表示不进行递归查找
            RemoteIterator<LocatedFileStatus> iterator = fs.listFiles(path, true);
            while (iterator.hasNext()){
                LocatedFileStatus next = iterator.next();
                System.out.println("当前文件路径是:"+next.getPath());
            }
            System.out.println("-------------------------------------");
            //将给定path路径下的所有文件元数据放到一个FileStatus的数组中
            //FileStatus对象封装了文件和目录的元数据,包括文件长度、块大小、权限等
            final FileStatus[] fileStatusArray = fs.listStatus(path);
            for (int i = 0; i < fileStatusArray.length; i++) {
                FileStatus fileStatus = fileStatusArray[i];
                System.out.println(fileStatus.getPath());
            }
        } catch (URISyntaxException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    //4.下载文件
    public static void downloadFile(){
        //定义一个配置对象
        Configuration conf = new Configuration();
        try {
            //URI对象
            URI uri = new URI("hdfs://192.168.55.100:9820");
            //根据配置信息获取文件系统对象
            FileSystem fs = FileSystem.get(uri, conf);
            //定义下载文件的路径和本地存放路径
            Path src = new Path("/yunpan/hello.txt");
            Path dest = new Path("E://hello.txt");
            //从文件服务器下载到本地
            fs.copyToLocalFile(src,dest);
        } catch (URISyntaxException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    //main方法
    public static void main(String[] args) {
        //设置操作用户
        System.setProperty("HADOOP_USER_NAME","hadoop");
        //1.创建新文件夹
        //createFloder();

        //2.上传文件
        //uploadFile();

        //3.递归显示文件
        //listFile(new Path("/"));

        //4.下载文件
        downloadFile();
    }
}

注意:
1)如果报错org.apache.hadoop.security.AccessControlException: Permission denied: user=Administrator,请参考:

解决org.apache.hadoop.security.AccessControlException: Permission denied: user=Administrator

我们在使用Java API操作HDFS时如果出现如下错误提示: 表明我们没有使用正确的用户操作HDFS,即没有 […]

2)下载文件如果报错 java.io.FileNotFoundException: HADOOP_HOME and hadoop.home.dir are unset请参考:

解决java.io.FileNotFoundException: java.io.FileNotFoundException: HADOOP_HOME and hadoop.home.dir are unset

我们在使用Java API测试从Liunx上HDFS中下载文件到本地windows系统时,发现会包如下错误: […]


版权声明:本站文章,如无说明,均为本站原创,转载请注明文章来源。如有侵权,请联系博主删除。
本文链接:https://www.panziye.com/java/bigdata/3038.html
喜欢 (2)
请潘老师喝杯Coffee吧!】
分享 (0)
用户头像
发表我的评论
取消评论
表情 贴图 签到 代码

Hi,您需要填写昵称和邮箱!

  • 昵称【必填】
  • 邮箱【必填】
  • 网址【可选】