《Hadoop权威指南:大数据的存储与分析》—3.4 Hadoop文件系统
3.4 Hadoop文件系统
Hadoop有一个抽象的文件系统概念,HDFS只是其中的一个实现。Java抽象类 org.apache.hadoop.fs.FileSystem定义了Hadoop 中一个文件系统的客户端接口,并且该抽象类有几个具体实现,其中和Hadoop紧密相关的见表3-1。
表3-1. Hadoop文件系统
文件系统 | URI方案 | Java实现(都在org.apache. | 描述 |
Local | file | fs.LocalFileSystem | 使用客户端校验和的本地磁盘文件系统。使用RawLocalFileSystem表示无校验和的本地磁盘文件系统。详情参见5.1.2节 |
HDFS | hdfs | hdfs.DistributedFileSystem | Hadoop 的分布式文件系统。将HDFS设计成与MapReduce结合使用,可以实现高性能 |
文件系统 | URI方案 | Java实现(都在org.apache. | 描述 |
WebHDFS | Webhdfs | Hdfs.web.WebHdfsFileSystem | 基于HTTP的文件系统,提供对HDFS的认证读/写访问。详情参见3.4节相关内容 |
Secure WebHDFS | swebhdfs | hdfs.web.SWebHdfsFileSystem | WebHDFS的HTTPS版本 |
HAR | har | fs.HarFileSystem | 一个构建在其他文件系统之上用于文件存档的文件系统。Hadoop存档文件系统通常用于将HDFS中的多个文件打包成一个存档文件,以减少namenode内存的使用。使用hadoop的achive命令来创建HAR 文件 |
View | viewfs | viewfs.ViewFileSystem | 针对其他Hadoop文件系统的客户端挂载表。通常用于为联邦namenode创建挂载点,详情参见3.2.4节 |
FTP | ftp | fs.ftp.FTPFileSystem | 由FTP 服务器支持的文件系统 |
S3 | S3a | fs.s3a.S3AFileSystem | 由Amazon S3 支持的文件系统。替代老版本的s3n(S3 原生)实现 |
Azure | wasb | fs.azure.NativeAzure | 由Microsoft Azure支持的文件系统 |
Swift | swift | fs.swift.snative. | 由OpenStack Swift支持的文件系统 |
Hadoop 对文件系统提供了许多接口,它一般使用URI 方案来选取合适的文件系统实例进行交互。举例来说,我们在前一小节中遇到的文件系统命令行解释器可以操作所有的Hadoop 文件系统命令。要想列出本地文件系统根目录下的文件,可以输入以下命令:
% hadoop fs -ls file:///
尽管运行的MapReduce程序可以访问任何文件系统(有时也很方便),但在处理大数据集时,建议你还是选择一个有数据本地优化的分布式文件系统,如HDFS(参见2.4节)。
接口
Hadoop是用Java写的,通过Java API可以调用大部分Hadoop文件系统的交互操作。例如,文件系统的命令解释器就是一个Java 应用,它使用Java 的FileSystem类来提供文件系统操作。其他一些文件系统接口也将在本小节中做简单介绍。这些接口通常与HDFS一同使用,因为Hadoop中的其他文件系统一般都有访问基本文件系统的工具(对于FTP,有FTP客户端;对于S3,有S3工具,等等),但它们大多数都能用于任何Hadoop 文件系统。
1. HTTP
Hadoop以Java API的形式提供文件系统访问接口,非Java开发的应用访问HDFS会很不方便。由WebHDFS协议提供的HTTP REST API则使得其他语言开发的应用能够更方便地与HDFS交互。注意,HTTP接口比原生的Java客户端要慢,所以不到万不得已,尽量不要用它来传输特大数据。
通过HTTP来访问HDFS有两种方法:直接访问,HDFS守护进程直接服务于来自客户端的HTTP请求;通过代理(一个或多个)访问,客户端通常使用DistributedFileSystem API访问HDFS。这两种方法如图3-1所示。两者都使用了WebHDFS协议。
图3-1. 通过HTTP直接访问HDFS或者通过多个HDFS代理访问HDFS
在第一种情况中,namenode和datanode内嵌的web服务器作为WebHDFS的端节点运行。(由于dfs.webhdfs.enabled被设置为true,WebHDFS默认是启用状态。)文件元数据操作由namenode管理,文件读(写)操作首先被发往namenode,由namenode发送一个HTTP重定向至某个客户端,指示以流方式传输文件数据的目的或源datanode。
第二种方法依靠一个或者多个独立代理服务器通过HTTP访问HDFS。(由于代理服务是无状态的,因此可以运行在标准的负载均衡器之后。)所有到集群的网络通信都需要经过代理,因此客户端从来不直接访问namenode或datanode。使用代理服务器后可以使用更严格的防火墙策略和带宽限制策略。通常情况下都通过代理服务器,实现在不同数据中心中部署的Hadoop集群之间的数据传输,或从外部网络访问云端运行的Hadoop集群。
HttpFS 代理提供和WebHDFS相同的HTTP(和HTTPS)接口, 这样客户端能够通过webhdfs(swebhdfs) URI访问这两类接口。HttpFS 代理的启动独立于namenode和datanode的守护进程,使用httpfs.sh脚本,默认在一个不同的端口上监听(端口号14000)。
2. C语言
Hadoop提供了一个名为libhdfs的C语言库,该语言库是Java FileSystem接口类的一个镜像(它被写成访问HDFS的C语言库,但其实它可以访问任何一个Hadoop文件系统)。它使用Java原生接口(JNI, Java Native Interface)调用Java 文件系统客户端。同样还有一个libwebhdfs库,该库使用了前述章节描述的WebHDFS接口。
这个C语言API 与Java的API非常相似,但它的开发滞后于Java API,因此目前一些新的特性可能还不支持。可以在Apache Hapdoop二进制压缩发行包的include目录中找到头文件hdfs.h。
Apache Hapdoop二进制压缩包自带预先编译好的libhdfs二进制编码,支持64位Linux。但对于其他平台,需要按照源代码树顶层的BUILDING.txt指南自行编译。
3. NFS
使用Hadoop的NFSv3网关将HDFS挂载为本地客户端的文件系统是可行的。然后你可以使用Unix实用程序(如ls和cat) 与该文件系统交互,上传文件,通过任意一种编程语言调用POSIX 库来访问文件系统。由于HDFS仅能以追加模式写文件,因此可以往文件末尾添加数据,但不能随机修改文件。
关于如何配置和运行NFS网关,以及如何从客户端连接网关,可以参考Hadoop相关文档资料。
4. FUSE
用户空间文件系统(FUSE, Filesystem in Userspace,)允许将用户空间实现的文件系统作为Unix文件系统进行集成。通过使用Hadoop的Fuse-DFS功能模块,HDFS(或任何一个Hadoop 文件系统)均可以作为一个标准的本地文件系统进行挂载。Fuse-DFS是用C语言实现的,使用libhdfs作为访问HDFS的接口。在写操作时,Hadoop NFS网关对于挂载HDFS来说是更健壮的解决方案,相比Fuse-DFS而言应优先选择。
- 点赞
- 收藏
- 关注作者
评论(0)