Hadoop教程

Hadoop文件系统

Hadoop有一个抽象的文件系统概念,HDFS只是其中的一个实现。Java抽象类 org.apache.hadoop.fs. FileSystem 定义了 Hadoop 中的一个文件系统接口,并且该抽象类有几个具体实现,如表3-1所示。

表3-1.Hadoop文件系统

Hadoop对文件系统提供了许多接口,它一般使用URI方案来选取合适的文件系统实例进行交互。举例来说,我们在前一小节中遇到的文件系统命令行解释器可以操作所有的Hadoop文件系统命令。要想列出本地文件系统根目录下的文件,可以输入以下命令:

% hadoop fs -ls file:///

尽管运行的MapReduce程序可以访问任何文件系统(有时也很方便),但在处理大数据集时,你仍然需要选择一个具有数据本地优化的分布式文件系统,如HDFS或KFS。

接口

Hadoop是用Java写的,通过Java API可以调用所有Hadoop文件系统的交互操作。例如,文件系统的命令解释器就是一个Java应用,它使用Java的 FileSystem类来提供文件系统操作。其他一些接口也将在本章中做简单介绍。这些 接口通常与HDFS —同使用,因为Hadoop中的其他文件系统一般都有访问基本文件系统的工具(对于FTP,有FTP客户端;对于S3,有S3工具,等等),但它们大多数都能和任意一个Hadoop文件系统协作。

Thrift

因为Hadoop文件系统的接口是通过Java API提供的,所以其他非Java应用程序访问Hadoop文件系统会比较麻烦。thriftfs定制功能模块中的Thrift API通过把 Hadoop文件系统包装一个Apache Thrift服务来弥补这个不足,从而使任何具有 Thrift绑定(binding)的语言都能轻松地与Hadoop文件系统(比如HDFS)进行交互。

为了使用Thrift API,需要运行提供Thrift服务的Java服务器,并以代理的方式访问Hadoop文件系统。应用程序访问Thrift服务时,实际上两者是运行在同一台机器上的。

Thrift API包含有为许多其他语言实现远程过程调用的接口,包括C++, Perl, PHP, Python及Ruby。Thrift支持不同版本的Hadoop,因此我们可以通过同一个客户端代码访问不同版本的Hadoop文件系统(但是,需要针对每个不同版本的Hadoop运行相应的代理,才能实现该功能)。

关于安装与使用教程,请参阅Hadoop发行版本src/contrib/thriftfs目录的文档。

C语言

Hadoop提供了一个名为libhdfs的C语言库,该语言库是Java FileSystem接口类的一个镜像(它被编写成访问HDFS的C语言库,但它其实可以访问任意Hadoop文件系统)。它可以使用Java原生接口(Java Native Interface,JNI)调用Java文件系 统客户端。

C语言API与Java的API非常相似,但它的开发一般滞后于Java API,因此目前一些新的特性可能还不支持。

FUSE

用户空间文件系统(Filesystem in Userspace, FUSE)允许把按照用户空间实现的文件系统整合成一个Unix文件系统。通过使用Hadoop的Fuse-DFS功能模块,任意一个Hadoop文件系统(不过一般为HDFS)均可以作为一个标准文件系统进行挂载。 随后便可以使用Unix工具(如ls和cat)与该文件系统交互,还可以通过任意一种编程语言调用POSIX库来访问文件系统。

Fuse-DFS是用C语言实现的,调用libhdfs并作为访问HDFS的接口。关于如何编译和运行Fuse-DFS的文档,可以在Hadoop发行版本的src/contrib./fuse- dfs目录中找到。

WebDAV

WebDAV扩展了HTTP,并支持文件编辑和文件更新。在大部分操作系统中,WebDAV共享均可以作为文件系统进行挂载,由此通过WebDAV来向外提供HDFS(或其他Hadoop文件系统)的访问接口,并将HDFS作为一个标准文件系统进行访问。

在本书写作期间,Hadoop对WebDAV的支持(通过调用Hadoop的Java API来实现)仍在开发中,可以访问 https:〃issues,apache.org/jira/browse/HADOOP-496, 了解最新动态。

其他HDFS接口

HDFS有两种特定的接口。

HTTP

HDFS定义了一个以HTTP方式检索目录列表和数据的只读接口。嵌入在namenode中的Web服务器(运行在50070端口上)以XML格式提供目录列表服务,而嵌入在datanode的Web服务器(运行在50075端口)提供文件数据传输服务。该协议并不绑定于某个特定的HDFS版本,由此用户可以利用HTTP协议编写从运行不同版本的Hadoop HDFS集群中读取数据的客户端。 HftpFile System就是其中一种:一个通过HTTP协议与HDFS交互的Hadoop文件系统接口(HsftpFileSystem是HTTPS的变种)。

FTP

HDFS还有一个FTP接口,该接口允许使用FTP协议与HDFS进行交互,但本书写作期间尚未完成(https://issues.apache.org/jira/browse/HADOOP3199)。 该接口很方便,它使用现有FTP客户端与HDFS进行数据传输。

请不要把HDFS的FTP接口与FTPFileSystem混为一谈,因为该接口可以将任意FTP服务器展示为Hadoop文件系统。

关注微信获取最新动态