教程目录


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. 把多余的东西删掉,最后的样子:

Java API实现HDFS的相关操作_hdfs

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命令行创建文件的副本系数都是几份。

作者简介:​邵奈一​

大学大数据讲师、大学市场洞察者、专栏编辑

公众号、微博:​​邵奈一​

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