HDFS 的 java 访问接口

4.5. HDFS 的 java 访问接口
4.5.1. 搭建 Hadoop 开发环境
我们在工作中写完的各种代码是在服务器中运行的, HDFS 的操作代码也不例外。在开
发阶段, 我们使用 windows 下的 eclipse 作为开发环境, 访问运行在虚拟机中的 HDFS。 也就
是通过在本地的 eclipse 中的 java 代码访问远程 linux 中的 hdfs。
要使用宿主机中的 java 代码访问客户机中的 hdfs,需要保证以下几点:
确保宿主机与客户机的网络是互通的
确保宿主机和客户机的防火墙都关闭,因为很多端口需要通过,为了减少防火墙配置,
直接关闭
确保宿主机与客户机使用的 jdk 版本一致。如果客户机使用 jdk6,宿主机使用 jdk7, 那
么代码运行时会报不支持的版本的错误
宿主机的登录用户名必须与客户机的用户名一直。比如我们 linux 使用的是 root 用户,
那么 windows 也要使用 root 用户,否则会报权限异常
在 eclipse 项目中覆盖 hadoop 的 org.apache.hadoop.fs.FileUtil 类的 checkReturnValue 方
法,如图

如果读者在开发过程中出现权限等问题,请按照本节的提示检查自己的环境。

4.5.2. 使用 FileSystem api 读写数据
在 hadoop 的 HDFS 操作中,有个非常重要的 api,是 org.apache.hadoop.fs.FileSystem,
这是我们用户代码操作 HDFS 的直接入口,该类含有操作 HDFS 的各种方法,类似于 jdbc 中
操作数据库的直接入口是 Connection 类。
那我们怎么获得一个 FileSystem 对象哪?

 

 以上代码中,要注意调用的是 FileSystem 的静态方法 get,传递两个值给形式参数,第
一个访问的 HDFS 地址,该地址的协议是 hdfs, ip 是 192.168.1.240,端口是 9000.。 这个地
址的完整信息是在配置文件 core-site.xml 中指定的, 读者可以使用自己环境的配置文件中的
设置。第二个参数是一个配置对象。
4.5.2.1. 创建文件夹
使用 HDFS 的 shell 命令查看一下根目录下的文件情况,如图 4-67 所示。

我们在 HDFS 的根目录下创建文件夹,代码如下

以上代码中,我们决定创建的文件夹完整路径是“/d1”。第二行代码是使用方法 exitst
判断文件夹是否存在;如果不存在,执行创建操作。创建文件夹,调用的是 mkdirs 方法,
返回值是布尔值,如果是 true,表示创建成功;如果是 false,表示创建失败。
现在查看一下是否成功了,如图 4-68,可见创建成功了。

4.5.2.2. 写文件
我们可以向 HDFS 写入文件,代码如下:

第一行代码表示创建的文件是在刚才创建的 d1 文件夹下的文件 f1;
第二行是调用 create 方法创建一个通向 HDFS 的输出流;
第三行是通过调用 hadoop 的一个工具类 IOUtils 的静态方法 copyBytes 把一个字符串发
送给输出流中。 该静态方法有四个参数, 第一个参数输入流, 第二个参数是输出流, 第三个
参数是配置对象,第四个参数是布尔值,如果是 true 表示数据传输完毕后关闭流。
现在看一下是否创建成功了,如图 4-69 所示。

4.5.2.3. 读文件
现在我们把刚才写入到 HDFS 的文件“/d1/f1” 读出来,代码如下:

第二行表示调用方法 open 打开一个指定的文件,返回值是一个通向该文件的输入流;
第三行还是调用 IOUtils.copyBytes 方法,输出的目的地是控制台。见图 4-70

 

4.5.2.4. 查看目录列表和文件详细信息
我们可以把根目录下的所有文件和目录显示出来,代码如下

调用listStatus方法会得到一个指定路径下的所有文件和文件夹,每一个用FileStatus表示。我
们使用for循环显示每一个FileStatus对象。 FileStatus对象表示文件的详细信息,里面含有类型、
副本数、权限、长度、路径等很多信息,我们只是显示了一部分。结果如图4-71所示。

4.5.2.5. 删除文件或目录
我们可以删除某个文件或者路径,代码如下

第三行代码表示删除文件“/d1/f1”,注释掉的第二行代码表示递归删除目录“/d1” 及
下面的所有内容。
除了上面列出的 fs 的方法外,还有很多方法,请读者自己查阅 api。

 

posted @ 2016-04-17 11:58  Runny_Hao  阅读(833)  评论(0)    收藏  举报