暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

使用 Java API 操作 HDFS 文件系统

我们的编程日记 2018-09-10
431
Java API 操作 HDFS 文件系统
9月10日

前面我介绍了,使用命令来操作 HDFS 系统,今天来介绍一下使用 Java API 来操作吧。也可阅读前面的介绍:Hadoop Shell 命令介绍


我们首先需要 执行:start-all.sh 或者 start-dfs.sh 来启动 Hadoop 


使用 IDEA 创建 maven 项目后,需要先配置我们需要的依赖,这里我使用 hadoop2.6.5。


如果你还没使用过 IDEA 来创建项目,我写了一点简单介绍:学习使用 IDEA 创建项目


先用一张图来说明一下 IDEA 的界面:



如果没有看见maven project 窗口,可以在 View –> Tool Windows –> Maven Project 中打开。

添加完依赖后,如果点击了IDEA 的 Enable Auto-Import 则会自动下载(前提是配置正确),也可以手动下载,在 Maven Project 窗口右键菜单有下载选项。等待下载完成,Pom.xml 文件里的配置信息不是红色异常的时候说明配置成功了。接下来就可以写代码了。


这次我们使用单元测试的方式来,调用 hadoop 的 Java api 来操作 hdfs 系统,这样我们可以一个一个方法来运行查看效果,我也顺便介绍一下junit单元测试,当然我也只是小白入门阶段,一方面是为了做点笔记有点产出,也希望能帮助和一样的编程小白。


我首先创建了一个 hdfsDemo class:



我先在图片上讲解几个方法,然后后面给出源代码



下面我们编写 mkdir() 方法在hdfs上创建目录进行测试:


光标移到 mkdir() 方法出,右键点击 Run‘mkdir()’,当看到,绿条出现的时候说明执行成功了,出现红条说明没有成功。执行成功后就可以使用命令到 安装了Hadoop的服务器 中查看效果了。后面的方法都可以这样一个个操作运行来进行测试。



如果出现报错:Connetction refused 说明你的端口或者ip或者用户名错了,要仔细检查一下。

java.net.ConnectException: Call From zran/192.168.91.1to hadoop1:8070 failed on connection exception: java.net.ConnectException: Connection refused: no further information; For more details see:  http://wiki.apache.org/hadoop/ConnectionRefused

下面是源代码,代码来自我看视频学习中练习记下的,如有侵权请联系我删除。


1
pom.xml
<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

  <modelVersion>4.0.0</modelVersion>

  <groupId>hdfsapi</groupId>
  <artifactId>hdfsapi</artifactId>
  <version>1.0</version>

  <name>hdfsapi</name>
  <url>http://www.example.com</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.7</maven.compiler.source>
    <maven.compiler.target>1.7</maven.compiler.target>
  </properties>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>

    <dependency>
      <groupId>org.apache.hadoop</groupId>
      <artifactId>hadoop-client</artifactId>
      <version>2.6.5</version>
    </dependency>

  </dependencies>


</project>


2
hdfsDemo.java


package hdfsapi;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.*;
import org.apache.hadoop.io.IOUtils;
import org.apache.hadoop.util.Progressable;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.net.URI;

public class hdfsDemo {

    public static final String HDFS_PATH = "hdfs://192.168.91.111:9000";

    @Before
    public void setUp() throws Exception {
        System.out.println("测试开始");
        configuration = new Configuration();
        fileSystem = FileSystem.get(new URI(HDFS_PATH), configuration, "hadoop");
    }

    @After
    public void tearDown() throws Exception {
        configuration = null;
        fileSystem = null;
        System.out.println("测试完毕");
    }

    FileSystem fileSystem = null;
    Configuration configuration = null;
    /**
     * 创建HDFS目录
     */

    @Test
    public void mkdir() throws Exception {
        fileSystem.mkdirs(new Path("/test"));
    }
    /**
     * 创建文件
     */

    @Test
    public void create() throws Exception {
        FSDataOutputStream output = fileSystem.create(new Path("/test/a.txt"));
        output.write("hello hadoop".getBytes());
        output.flush();
        output.close();
    }

     /*
     * 查看HDFS文件的内容
     * */

    @Test
    public void cat() throws Exception {
        FSDataInputStream in = fileSystem.open(new Path("/test/a.txt"));
        IOUtils.copyBytes(in, System.out, 1024);
        in.close();
    }

    /**
     * 重命名
     */

    @Test
    public void rename() throws Exception {
        Path oldPath = new Path("/test/a.txt");
        Path newPath = new Path("/test/b.txt");
        fileSystem.rename(oldPath, newPath);
    }

    /**
     * 上传文件到HDFS
     */

    @Test
    public void copyFromLocalFile() throws Exception {
        Path localPath = new Path("/home/hadoop/hello.txt");
        Path hdfsPath = new Path("/test");
        fileSystem.copyFromLocalFile(localPath, hdfsPath);
    }

    /**
     * 上传文件到HDFS
     */

    @Test
    public void copyFromLocalFileWithProgress() throws Exception {
        InputStream in = new BufferedInputStream(
                new FileInputStream(
                        new File("F:\\BigData\\jdk-8u181-linux-x64.tar.gz")));

        FSDataOutputStream output = fileSystem.create(new Path("/test/jdk8.tgz"),
                new Progressable() {
                    public void progress() {
                        System.out.print(".");  //带进度提醒信息
                    }
                });


        IOUtils.copyBytes(in, output, 4096);
    }

    /**
     * 删除
     */

    @Test
    public void delete() throws Exception{
        fileSystem.delete(new Path("/"), true);
    }


}


个人能力水平有限,如上述有错欢迎批评指正

同时也欢迎与我交流,由于公众号刚开不久,还没有留言功能,如有问题可以后台联系我,我看到会回复的。


又是新的一周了,加油!


推荐阅读:

学习使用 IDEA 创建项目

Hadoop Shell 命令介绍

Hadoop3.1.0集群环境搭建(CentOS 7)





文章转载自我们的编程日记,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论