[摘要] Hadoop是由java编写的,所以HDFS提供了完整的java程序应用接口,其他的访问都是建立在这些应用接口之上。要能访问HDFS,则HDFS客户端必须有一份hdfs的配置文件hdfs-site.xml,以获取NameNode的相关信息,每个应用程序也必须能访问Hadoop的程序库JAR文件,也就是前面说的配置环境变量。

java.net.URL

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
package com.diudiu.hdfs.api;

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

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

/**
* Description hadoop.
* <p/>
* Time 2017/5/6 上午11:09
*
* @author zhoujunwen
* @version 1.0.0.0
* @see com.diudiu.hdfs.api
*/
public class UrlCat {
static {
URL.setURLStreamHandlerFactory(new FsUrlStreamHandlerFactory());
}
public static void main(String[] args) throws IOException {
InputStream in = null;
try {
in = new URL(args[0]).openStream();
IOUtils.copyBytes(in, System.out, 4096,false);
} finally {
IOUtils.closeStream(in);
}
}
}

上述代码中,URL.setURLStreamHandlerFactory是注册自定协议。这里FsUrlStreamHandlerFactory注册了hdfs协议。有关setURLStreamHandlerFactory的一些问题:《java:解决URL.setURLStreamHandlerFactory只能被jvm调用一次的问题》

编译代码并打包:

1
gradle clean build

生成jar包hdfs-1.0.0.jar,在hdfs的target/libs目录下,至于jar文件的名称,是在build.gradle中配置(可以参考【附录】),可根据自己的情况而定。命令行运行时,需要指定Main方法入口类,hdfs://master:30010这个是在core-site.xml中配置的,配置内容如下。需要注意的是我的部分文章使用的是9000端口,有些是30010端口,原因是在某些机器上安装了php-fpm,该进程使用了9000端口。

1
2
3
4
5
6
7
<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://master:30010</value>
</property>
<!-- ...其他配置 -->
</configuration>

/input/word是hdfs上的一个文件,写入了一些内容上传到hdfs的,如果不确定有哪些文件,可以使用命令hadoop fs -ls /来查看。

完整命令如下:

1
hadoop jar hdfs/target/libs/hdfs-1.0.0.jar com.diudiu.hdfs.api.UrlCat hdfs://master:30010/input/word

运行结果:


【附录】
build.gradle

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
group 'com.diudiu'
version '1.0.0'

apply plugin: 'java'

sourceCompatibility = 1.8

repositories {
mavenCentral()
}

dependencies {
compile 'org.apache.hadoop:hadoop-client:2.8.0'
compile 'org.apache.hadoop:hadoop-hdfs:2.8.0'

testCompile 'junit:junit:4.11'
}