通过hadoop 提供的java api对hdfs进行操作
环境:centos7 + jdk1.7 + hadoop2.4.1(64位)+ecplise
第一部分删除操作
第一步:启动Hadoop服务
1.1 查看服务状态。在命令终端,执行命令“jps”(查看hadoop服务是否已经启动,如未启动,启动服务)。如图1所示
(process information unavaliable不用管,造成原因可能是虚拟内存机资源不足,自己会消失)
1.2通过hdfs dfs -touchz /java在HDFS上创建文件。
通过 hdfs dfs -ls /可以查看
第二步 2.1 打开ecplise开发工具,点击File选择“New”->“Java Project”新建名为“Hadoop”的java项目,点击“Hadoop”项目右键,选择“New” –>“Package”
输入名称“com.hdfs”点击完成。
新建java 类。选中包名并右键点击,选择“New”->“Class”。
在name 项输入“ HdfsTest”类名称,点击Finish完成。
2.2在创建的项目目录下右击选择“New”—“Folder”创建文件夹libs。
2.3 拷贝桌面lib文件夹下的所有hadoop jar包到libs文件夹下。
2.4 选中libs下的所有jar包,右键点击,然后选择“Build Path”下的“add to build path”即可把所有jar包添加到path环境中。
如图:
第三步:编写程序(上代码)
package com.HDFS;
import java.net.URI;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
public class HdfsTest {
// 初始化获取hdfs连接的对象
private FileSystem fileSystem;
@Before
public void init() throws Exception {
// 连接我的hdfs 192.168.2.3:9000
fileSystem = FileSystem.get(new URI("hdfs://192.168.2.3:9000"), new Configuration(), "root");
System.out.println(fileSystem);
}
@After
public void After() throws Exception {
// 释放资源
fileSystem.close();
}
@Test
public void testRMdir() throws Exception {
boolean flag = fileSystem.deleteOnExit(new Path("/java"));
System.out.println(flag ? "删除成功" : "删除失败");
}
}
第四步程序运行
4.1 在项目栏目最左侧,选中要运行的方法“testRMdir”—>点击右键—>选择“run as”—>选择“Junit Test”,等待执行结果。
其中打印结果中DFS[DFSClient[clientName=DFSClient_NONMAPREDUCE_340839249_1, ugi=root (auth:SIMPLE)]]
表示fs不为空,也就是连接hdfs成功
删除成功表示“/java”已删除。
第五步:验证
可以看到已经删除成功
第二部分:上传本地文件到hdfs
首先在本地(local)创建文件:HelloWorld.txt
然后通过java提供的API将HelloWorld.txt上传本地文件到hadoop的根目录并改名位javaApi:
代码如下:
```java
package com.HDFS;
import java.net.URI;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
public class HdfsTest {
// 初始化获取hdfs连接的对象
private FileSystem fileSystem;
@Before
public void init() throws Exception {
// 连接我的hdfs 192.168.2.3:9000
Configuration con = new Configuration();
con.setBoolean("dfs.support.append", true);
fileSystem = FileSystem.get(new URI("hdfs://192.168.2.3:9000"), con, "root");
System.out.println(fileSystem);
}
@After
public void After() throws Exception {
// 释放资源
fileSystem.close();
}
@Test
public void testUploadFile() throws Exception{
String src="D:\\HelloWorld.txt";
String hdfDst="/javaApi";
fileSystem.copyFromLocalFile(true, false, new Path(src), new Path(hdfDst));
System.out.println("upload sucess");
}
}
验证:
第三部分:下载hdfs文件到local:
首先要先上传一个文件(这里以hadoop-2.7.2.tar.gz为例)
然后用java提供的api下载我们上传的文件到D盘的hadoop.zip中(代码如下):
package com.HDFS;
import java.io.FileOutputStream;
import java.net.URI;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IOUtils;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
public class HdfsTest {
// 初始化获取hdfs连接的对象
private FileSystem fileSystem;
@Before
public void init() throws Exception {
// 连接我的hdfs 192.168.2.3:9000
Configuration con = new Configuration();
con.setBoolean("dfs.support.append", true);
fileSystem = FileSystem.get(new URI("hdfs://192.168.2.3:9000"), con, "root");
System.out.println(fileSystem);
}
@After
public void After() throws Exception {
// 释放资源
fileSystem.close();
}
@Test
public void dloadFile() throws Exception{
Path src=new Path("hdfs://192.168.2.3:9000/hadoop-2.7.2.tar.gz");
FSDataInputStream in=fileSystem.open(src);
FileOutputStream out=new FileOutputStream("D:\\hadoop.zip");
IOUtils.copyBytes(in, out, 4096, true);
}
}
``
运行结果:
可以看到已经成功下载。