This commit is contained in:
luoxiang 2019-06-02 16:31:43 +08:00
parent ec1484f891
commit bf90aea602

View File

@ -21,9 +21,7 @@
## 一、 简介
Hadoop提供了简单易用的Java API用于操作HDFS。通过这些API我们可以通过编程来更灵活的操作HDFS。同时从编程体验上来说这些API的设计确实非常人性化基本上你只需要一行代码就能完成相应的操作。
想要使用HDFS API你只需要导入`hadoop-client`这个依赖包即可。以下关于API的操作我均使用单元测试的方法进行演示完整的POM文件如下
想要使用HDFS API需要导入依赖`hadoop-client`。如果是CDH版本的Hadoop还需要额外指明其仓库地址
```xml
<?xml version="1.0" encoding="UTF-8"?>
@ -77,7 +75,7 @@ Hadoop提供了简单易用的Java API用于操作HDFS。通过这些API
### 2.1 FileSystem
FileSystem是操作HDFS的入口通过FileSystem我们可以完成对HDFS上文件和目录的所有操作。在使用前需要获取它这里由于之后的每个单元测试都需要用到FileSystem所以使用`@Before`注解进行标注。
FileSystem是所有HDFS操作的主入口。由于之后的每个单元测试都需要用到它这里使用`@Before`注解进行标注。
```java
private static final String HDFS_PATH = "hdfs://192.168.0.106:8020";
@ -88,7 +86,7 @@ private static FileSystem fileSystem;
public void prepare() {
try {
Configuration configuration = new Configuration();
// 这里我启动的是单节点的Hadoop,副本系数可以设置为1,不设置的话默认值为3
// 这里我启动的是单节点的Hadoop,所以副本系数设置为1,默认值为3
configuration.set("dfs.replication", "1");
fileSystem = FileSystem.get(new URI(HDFS_PATH), configuration, HDFS_USER);
} catch (IOException e) {
@ -111,7 +109,7 @@ public void destroy() {
### 2.2 创建目录
这里目录可以是多级,支持递归创建。
支持递归创建目录:
```java
@Test
@ -124,7 +122,7 @@ public void mkDir() throws Exception {
### 2.3 创建指定权限的目录
这里`FsPermission(FsAction u, FsAction g, FsAction o)` 的三个参数分别对应创建者权限,同组其他用户权限,其他用户权限,可以使用`FsAction`枚举类中的值进行指定
`FsPermission(FsAction u, FsAction g, FsAction o)` 的三个参数分别对应创建者权限,同组其他用户权限,其他用户权限,权限值定义在`FsAction`枚举类中
```java
@Test
@ -169,7 +167,7 @@ public void exist() throws Exception {
### 2.6 查看文件内容
这里我们查看的是一个小文件的内容,所以直接转换成字符串后输出,对于大文件,还是应该从输出流中读取数据,分批处理。
查看小文本文件的内容,直接转换成字符串后输出:
```java
@Test
@ -180,7 +178,7 @@ public void readToString() throws Exception {
}
```
inputStreamToString 是一个自定义方法,实现如下:
`inputStreamToString`是一个自定义方法,代码如下:
```java
/**
@ -314,7 +312,7 @@ public void listFiles() throws Exception {
}
```
FileStatus中包含了文件的基本信息比如文件路径是否是文件夹修改时间访问时间所有者所属组文件权限是否是符号链接等输出内容示例如下(这里为了直观,我对输出进行了换行显示)
`FileStatus`中包含了文件的基本信息,比如文件路径,是否是文件夹,修改时间,访问时间,所有者,所属组,文件权限,是否是符号链接等,输出内容示例如下:
```properties
FileStatus{
@ -343,7 +341,7 @@ public void listFilesRecursive() throws Exception {
}
```
这里输出和上面类似,只是多了文本大小,副本系数,块大小信息。
和上面输出类似,只是多了文本大小,副本系数,块大小信息。
```properties
LocatedFileStatus{
@ -375,16 +373,16 @@ public void getFileBlockLocations() throws Exception {
}
```
块输出信息比较简单,第一个值是文件的起始偏移量(offset),第二个值是文件大小(length),第三个是块所在的主机名(hosts)。
块输出信息有三个值,分别是文件的起始偏移量(offset),文件大小(length)块所在的主机名(hosts)。
```
0,57028557,hadoop001
```
这里我上传的文件比较小,只有57M(小于128M)且程序中设置了副本系数为1所有只有一个块信息,如果文件很大,则这里会输出文件所有块的信息。
这里我上传的文件只有57M(小于128M)且程序中设置了副本系数为1所有只有一个块信息。
<br/>
<br/>
**以上所有测试用例可以从本仓库进行下载**[HDFS Java API](https://github.com/heibaiying/BigData-Notes/tree/master/code/Hadoop/hdfs-java-api)
**以上所有测试用例下载地址**[HDFS Java API](https://github.com/heibaiying/BigData-Notes/tree/master/code/Hadoop/hdfs-java-api)