Java API实现HDFS的相关操作

版权声明:原创不易,转载请标明出处谢谢。 https://blog.csdn.net/shaock2018/article/details/88717576

0x00 教程介绍

  1. 环境介绍:
    a. Hadoop版本:2.7.5(hadoop-2.7.5.tar.gz);
    b. 搭建在Centos7上,非Docker上;
    c. 客户端为Win7系统,JDK以及Maven已经安装好;
  2. 包含内容:
    a. Hadoop的Java API实操

0x01 新建maven工程

1. 新建maven工程

a. 选择maven-archetype-quickstart选项

GroupId:com.shaonaiyi.hadoop
ArtifactId:hadoop-learning
Version:1.0

b. 把多余的东西删掉,最后的样子:
在这里插入图片描述
c. 添加Hadoop的相关依赖

<properties>标签里面加:
<hadoop-version>2.7.5</hadoop-version>

<dependency>标签里面加:

<dependency>
    <groupId>org.apache.hadoop</groupId>
    <artifactId>hadoop-client</artifactId>
    <version>${hadoop-version}</version>
</dependency>

如果Hadoop是CDH版本,则需要在<properties>同级下添加CDH的仓库:

<repositories>
	<repository>
		<id>cloudera</id>
		<url>https://repository.cloudera.com/artifactory/cloudera-repos/</url>
	</repository>
</repositories>

此处不使用CDH版本,则不添加!

0x02 Hadoop的Java API实操

1. 源码
package com.shaonaiyi.hadoop.hdfs;

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

import java.net.URI;

/**
 * @Auther: 邵奈一
 * @Date: 2019/03/21 下午 4:30
 * @Description: Java API实现HDFS的相关操作
 */
public class HDFSClient {

    public static final String HDFS_PATH = "hdfs://master:9999";

    FileSystem fileSystem = null;
    Configuration configuration = null;

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

    /**
     * 创建HDFS文件
     * @throws Exception
     */
    @Test
    public void create() throws Exception {
        FSDataOutputStream output = fileSystem.create(new Path("/JavaAPI/JavaAPI.txt"));
        output.write("hello,shaonaiyi".getBytes());
        output.flush();
        output.close();
    }

    /**
     * 查看HDFS上的文件内容
     * @throws Exception
     */
    @Test
    public void cat() throws Exception {
        FSDataInputStream in = fileSystem.open(new Path("/JavaAPI/JavaAPI.txt"));
        IOUtils.copyBytes(in, System.out, 1024);
        in.close();
    }

    /**
     * 重命名HDFS上的文件
     * @throws Exception
     */
    @Test
    public void rename() throws Exception {
        Path oldPath = new Path("/JavaAPI/JavaAPI.txt");
        Path newPath = new Path("/JavaAPI/javaAPI.txt");
        fileSystem.rename(oldPath, newPath);
    }

    /**
     * 上传本地文件到HDFS
     * @throws Exception
     */
    @Test
    public void copyFromLocalFile() throws Exception {
        Path localPath = new Path("E://hello.txt");
        Path hdfsPath = new Path("/JavaAPI");
        fileSystem.copyFromLocalFile(localPath, hdfsPath);
    }

    /**
     * 下载HDFS上的文件
     * @throws Exception
     */
    @Test
    public void copyToLocalFile() throws Exception {
        Path localPath = new Path("E://hdfs.txt");
        Path hdfsPath = new Path("/JavaAPI/hello.txt");
        fileSystem.copyToLocalFile(hdfsPath, localPath);
    }

    /**
     * 查看某个目录下的所有文件
     * @throws Exception
     */
    @Test
    public void listFiles() throws Exception {
        FileStatus[] fileStatuses = fileSystem.listStatus(new Path("/"));
        System.out.println("文件夹/文件" + "\t" + "副本数" + "\t" + "长度" + "\t\t" + "路径");
        for(FileStatus fileStatus : fileStatuses) {
            String isDir = fileStatus.isDirectory() ? "文件夹" : "文件";
            short replication = fileStatus.getReplication();
            long len = fileStatus.getLen();
            String path = fileStatus.getPath().toString();
            System.out.println(isDir + "\t\t" + replication + "\t\t" + len + "\t\t" + path);
        }

    }

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

    /**
     * 初始化
     * @throws Exception
     */
    @Before
    public void setUp() throws Exception {
        System.out.println("HDFSClient - setUp");
        configuration = new Configuration();
        fileSystem = FileSystem.get(new URI(HDFS_PATH), configuration, "hadoop");
    }

    /**
     * 释放资源
     * @throws Exception
     */
    @After
    public void tearDown() throws Exception {
        configuration = null;
        fileSystem = null;
        System.out.println("HDFSApp - tearDown");
    }

}
2. 简单解释

a. 导包记得导org.apache.hadoop下的
b. 可以通过看导入的类,查看@Before@After注解是干啥用的,其实就是test开始与结束需要执行的代码
c. 此处虚拟机的用户名为:hadoop,需要改成自己的:
fileSystem = FileSystem.get(new URI(HDFS_PATH), configuration, "hadoop");
d. 用户名master和端口号9999不一样记得修改成自己的
public static final String HDFS_PATH = "hdfs://master:9999";

0xFF 总结

  1. 可以用肉眼测试一下看能不能运行哈
  2. 另外,自己可以尝试一下打包此项目,上传到Hadoop服务器上执行
  3. 思考题:请自行修改core-site.xml的副本系数为1,然后观察,通过代码创建文件与通过Shell命令行创建文件的副本系数都是几份。

作者简介:邵奈一
大学大数据讲师、大学市场洞察者、专栏编辑
公众号、微博、CSDN邵奈一

复制粘贴玩转大数据系列专栏已经更新完成,请跳转学习!

猜你喜欢

转载自blog.csdn.net/shaock2018/article/details/88717576