前面我介绍了,使用命令来操作 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
下面是源代码,代码来自我看视频学习中练习记下的,如有侵权请联系我删除。
<?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>
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);
}
}
个人能力水平有限,如上述有错欢迎批评指正。
同时也欢迎与我交流,由于公众号刚开不久,还没有留言功能,如有问题可以后台联系我,我看到会回复的。
又是新的一周了,加油!
推荐阅读:







