Hadoop(5):HDFS 的应用开发

1、HDFS的JAVA API操作

HDFS在生产应用中主要是客户端的开发,其核心步骤是从HDFS提供的api中构造一个HDFS的访问客户端对象,然后通过该客户端对象操作(增删改查)HDFS上的文件。

2、搭建开发环境

2.1创建Maven工程

引入pom依赖

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

2.1构造客户端对象
在 java 中操作 HDFS,主要涉及以下 Class:
        Configuration:该类的对象封转了客户端或者服务器的配置;
        FileSystem:该类的对象是一个文件系统对象,可以用该对象的一些方法来
对文件进行操作,通过 FileSystem 的静态方法 get 获得该对象。
        FileSystem fs = FileSystem.get(conf)
        get 方法从conf中的一个参数fs.defaultFS的配置值判断具体是什么类型的文件系统。如果我们的代码中没有指定 fs.defaultFS,并且工程classpath下也没有给定相应的配置,conf中的默认值就来自于hadoop的 jar包中的core-default.xml , 默 认 值 为:file:/// ,则获取的将不是一个
DistributedFileSystem的实例,而是一个本地文件系统的客户端对象。
创建文件夹
    public static void main(String[] args) throws Exception{
        Configuration conf=new Configuration();
        //这里指定使用的是 hdfs 文件系统
        conf.set("fs.defaultFS","hdfs://xiongpeng:9000");
        //通过如下的方式进行客户端身份的设置
        System.setProperty("HADOOP_USER_NAME","root");
        //通过 FileSystem 的静态方法获取文件系统客户端对象
        FileSystem fs = FileSystem.get(conf);
        //也可以通过如下的方式去指定文件系统的类型 并且同时设置用户身份
        //FileSystem fs = FileSystem.get(new URI("hdfs://node-21:9000"), conf, "root");
        //创建一个文件夹
        fs.mkdirs(new Path("/hdfsbyjavas"));
        //关闭我们的文件系统
        fs.close();
    }

注意:hdfs操作需要进行客户端身份的设置

第一种方法如下:

System.setProperty("HADOOP_USER_NAME","root");

还有一种是指定文件系统的类型并且同时设置用户身份,如下:

FileSystem fs = FileSystem.get(new URI("hdfs://node-21:9000"), conf, "root");

创建一个文件

    public static void main(String[] args) throws Exception{
        Configuration conf=new Configuration();
        //这里指定使用的是 hdfs 文件系统
        conf.set("fs.defaultFS","hdfs://xiongpeng:9000");
        //通过如下的方式进行客户端身份的设置
        System.setProperty("HADOOP_USER_NAME","root");
        //通过 FileSystem 的静态方法获取文件系统客户端对象
        FileSystem fs = FileSystem.get(conf);
        //也可以通过如下的方式去指定文件系统的类型 并且同时设置用户身份
        //FileSystem fs = FileSystem.get(new URI("hdfs://node-21:9000"), conf, "root");
        //创建一个文件
        fs.create(new Path("/hdfsbyjava"));
        //关闭我们的文件系统
        fs.close();
    }

上传文件

    public static void main(String[] args) throws Exception {
        Configuration conf=new Configuration();
        //这里指定使用的是 hdfs 文件系统
        conf.set("fs.defaultFS","hdfs://xiongpeng:9000");
        //通过如下的方式进行客户端身份的设置
        System.setProperty("HADOOP_USER_NAME","root");
        //通过 FileSystem 的静态方法获取文件系统客户端对象
        FileSystem fs = FileSystem.get(conf);
        //也可以通过如下的方式去指定文件系统的类型 并且同时设置用户身份
        //FileSystem fs = FileSystem.get(new URI("hdfs://node-21:9000"), conf, "root");

        //上传一个文件
        fs.copyFromLocalFile(new Path("e:/sql.txt"), new Path("/hdfsbyjavas/sql.txt"));
        //关闭我们的文件系统
        fs.close();
    }

下载文件

    public static void main(String[] args) throws Exception {
        Configuration conf=new Configuration();
        //这里指定使用的是 hdfs 文件系统
        conf.set("fs.defaultFS","hdfs://xiongpeng:9000");
        //通过如下的方式进行客户端身份的设置
        System.setProperty("HADOOP_USER_NAME","root");
        //通过 FileSystem 的静态方法获取文件系统客户端对象
        FileSystem fs = FileSystem.get(conf);
        //也可以通过如下的方式去指定文件系统的类型 并且同时设置用户身份
        //FileSystem fs = FileSystem.get(new URI("hdfs://node-21:9000"), conf, "root");

        fs.copyToLocalFile(new Path("/hdfsbyjavas/sql.txt"),new Path("d://"));
        //关闭我们的文件系统
        fs.close();
    }

注意:windows平台可能会出现如下报错

Failed to locate the winutils binary in the hadoop binary path java.io.IOException: Could not locate executable null\bin\winutils.exe in the Hadoop binaries.

这是因为在windows上做HDFS客户端应用开发,需要设置Hadoop环境,而且要求是windows平台编译的Hadoop。

おすすめ

転載: blog.csdn.net/u013938578/article/details/118446989