HDFS的Java API

  1. 在 eclipse 中新建一个 Java Project
  2. 导入依赖:右键 Project 名称,打开 Properties 选项卡,打开“Java Build Path”,选择“Libraries”,“Add External JARs”,将文件hadoop-1.1.2下 7 个 jar 包导入,如下图所示:
    HDFSJavaAPI_1
  3. 关联 Hadoop 源码(可选,只是为了查看代码方便):右键 Project 名称,打开 Properties 选项卡,打开“Java Build Path”,选择“Project”,选择 Hadoop 源码项目
  4. 在项目的\src下新建一个 Package,命名为“hdfs”

1 读文件

hdfs下新建一个 class,命名为“App1”

App1.java:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
package hdfs;

import java.io.InputStream;
import java.net.URL;

import org.apache.hadoop.fs.FsUrlStreamHandlerFactory;
import org.apache.hadoop.io.IOUtils;

public class App1 {
/**
* 抛异常: unknown host: hadoop
* 原因:是因为本机没有解析主机名 hadoop
*/
static final String PATH = "hdfs://hadoop:9000/hello";//本程序用来读取主机 hadoop 的 HDFS 的根目录下的文件 hello
public static void main(String[] args) throws Exception {
URL.setURLStreamHandlerFactory(new FsUrlStreamHandlerFactory());//如果没有这句,程序无法解析 hdfs

final URL url = new URL(PATH);
final InputStream in = url.openStream();
/**
* @param in 表示输入流
* @param out 表示输出流
* @param buffSize 表示缓冲大小
* @param close 表示在传输结束后是否关闭流
*/
IOUtils.copyBytes(in, System.out, 1024, true);
}
}

右键“Run As”,选择“Java Application”,可以成功运行,下面的控制台显示文件 hello 的内容

注意:这种方式只能读不能写,如果需要写,可以使用 HDFS 的 API(即 FileSystem 类)

2 FileSystem 类

可以直接调用 FileSystem 的子类完成 HDFS 操作
:Eclipse 创建方法快捷键:Shift+Alt+M
Eclipse 创建局部变量快捷键:Shift+Alt+L

App2.java:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
package hdfs;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IOUtils;

public class App2 {
static final String PATH = "hdfs://hadoop:9000/";
static final String DIR = "/d1";
static final String FILE = "/d1/hello";
public static void main(String[] args) throws Exception {
FileSystem fileSystem = getFileSystem();
//创建文件夹 hadoop fs -mkdir /f1
mkdir(fileSystem);
//创建文件
create(fileSystem);
//上传文件 -put src des
putData(fileSystem);
//下载文件 hadoop fs -get src des
//getData(fileSystem);
//浏览文件夹
list(fileSystem);
//删除文件夹或文件
//remove(fileSystem);
}
private static void list(FileSystem fileSystem) throws IOException {
final FileStatus[] listStatus = fileSystem.listStatus(new Path("/"));
for (FileStatus fileStatus : listStatus) {
String isDir = fileStatus.isDir()?"文件夹":"文件";
final String permission = fileStatus.getPermission().toString();
final short replication = fileStatus.getReplication();
final long len = fileStatus.getLen();
final String path = fileStatus.getPath().toString();
System.out.println(isDir+"\t"+permission+"\t"+replication+"\t"+len+"\t"+path);
}
}
private static void getData(FileSystem fileSystem) throws IOException {
final FSDataInputStream in = fileSystem.open(new Path(FILE));
IOUtils.copyBytes(in, System.out, 1024, true);
}
private static void putData(FileSystem fileSystem) throws IOException,
FileNotFoundException {
final FSDataOutputStream out = fileSystem.create(new Path(FILE));//创建文件
final FileInputStream in = new FileInputStream("H:/kuaipan/hadoop/classes/yy131009/day2/readme.txt");
IOUtils.copyBytes(in, out, 1024, true);
}
private static void remove(FileSystem fileSystem) throws IOException {
fileSystem.delete(new Path(DIR), true);
}
private static void mkdir(FileSystem fileSystem) throws IOException {
fileSystem.mkdirs(new Path(DIR));
}
private static FileSystem getFileSystem() throws IOException, URISyntaxException {
return FileSystem.get(new URI(PATH), new Configuration());
}
private static void create(FileSystem fileSystem) throws IOException {
fileSystem.create(new Path(FILE));
}
}