《Hadoop权威指南:大数据的存储与分析》—3.4 Hadoop文件系统

举报
清华大学出版社 发表于 2019/10/12 13:52:02 2019/10/12
【摘要】 本节书摘来自清华大学出版社《Hadoop权威指南:大数据的存储与分析》一书中第三章,第3.4节,作者是Tom White , 王 海 华 东 刘 喻 吕粤海 译。

3.4  Hadoop文件系统

Hadoop有一个抽象的文件系统概念,HDFS只是其中的一个实现。Java抽象类 org.apache.hadoop.fs.FileSystem定义了Hadoop 中一个文件系统的客户端接口,并且该抽象类有几个具体实现,其中和Hadoop紧密相关的见表3-1

3-1.  Hadoop文件系统

文件系

URI方案

Java实现(都在org.apache.
  hadoop
包中)

描述

Local

file

fs.LocalFileSystem

使用客户端校验和的本地磁盘文件系统。使用RawLocalFileSystem表示无校验和的本地磁盘文件系统。详情参见5.1.2

HDFS

hdfs

hdfs.DistributedFileSystem

Hadoop 的分布式文件系统。将HDFS设计成与MapReduce结合使用,可以实现高性能


                                                                                                                                            

文件系

URI方案

Java实现(都在org.apache.
 
hadoop包中)

描述

WebHDFS

Webhdfs

Hdfs.web.WebHdfsFileSystem

基于HTTP的文件系统,提供对HDFS的认证读/写访问。详情参见3.4节相关内容

Secure WebHDFS

swebhdfs

hdfs.web.SWebHdfsFileSystem

WebHDFSHTTPS版本

HAR

har

fs.HarFileSystem

一个构建在其他文件系统之上用于文件存档的文件系统。Hadoop存档文件系统通常用于将HDFS中的多个文件打包成一个存档文件,以减少namenode内存的使用。使用hadoopachive命令来创建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
  FileSystem

Microsoft   Azure支持的文件系统

Swift

swift

fs.swift.snative.
  SwiftNativeFileSystem

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

HadoopJava API的形式提供文件系统访问接口,非Java开发的应用访问HDFS会很不方便。由WebHDFS协议提供的HTTP REST API则使得其他语言开发的应用能够更方便地与HDFS交互。注意,HTTP接口比原生的Java客户端要慢,所以不到万不得已,尽量不要用它来传输特大数据

通过HTTP来访问HDFS有两种方法:直接访问,HDFS守护进程直接服务于来自客户端的HTTP请求;通过代理(一个或多个)访问,客户端通常使用DistributedFileSystem API访问HDFS。这两种方法如图3-1所示。两者都使用了WebHDFS协议。

image.png

3-1. 通过HTTP直接访问HDFS或者通过多个HDFS代理访问HDFS


       在第一种情况中,
namenodedatanode内嵌的web服务器作为WebHDFS的端节点运行。(由于dfs.webhdfs.enabled被设置为trueWebHDFS默认是启用状态。)文件元数据操作由namenode管理,文件读()操作首先被发往namenode,由namenode发送一个HTTP重定向至某个客户端,指示以流方式传输文件数据的目的或源datanode

第二种方法依靠一个或者多个独立代理服务器通过HTTP访问HDFS(由于代理服务是无状态的,因此可以运行在标准的负载均衡器之后。)所有到集群的网络通信都需要经过代理,因此客户端从来不直接访问namenodedatanode。使用代理服务器后可以使用更严格的防火墙策略和带宽限制策略。通常情况下都通过代理服务器,实现在不同数据中心中部署的Hadoop集群之间的数据传输,或从外部网络访问云端运行的Hadoop集群。

HttpFS 代理提供和WebHDFS相同的HTTP(HTTPS)接口, 这样客户端能够通过webhdfs(swebhdfs) URI访问这两类接口。HttpFS 代理的启动独立于namenodedatanode的守护进程,使用httpfs.sh脚本,默认在一个不同的端口上监听(端口号14000)

2. C语言

Hadoop提供了一个名为libhdfsC语言库,该语言库是Java FileSystem接口类的一个镜像(它被写成访问HDFSC语言库,但其实它可以访问任何一个Hadoop文件系统)。它使用Java原生接口(JNI, Java Native Interface)调用Java 文件系统客户端。同样还有一个libwebhdfs库,该库使用了前述章节描述的WebHDFS接口。

这个C语言API JavaAPI非常相似,但它的开发滞后于Java API,因此目前一些新的特性可能还不支持。可以在Apache Hapdoop二进制压缩发行包的include目录中找到头文件hdfs.h

Apache Hapdoop二进制压缩包自带预先编译好的libhdfs二进制编码,支持64Linux。但对于其他平台,需要按照源代码树顶层的BUILDING.txt指南自行编译。

3. NFS

使用HadoopNFSv3网关将HDFS挂载为本地客户端的文件系统是可行的。然后你可以使用Unix实用程序(lscat) 与该文件系统交互,上传文件,通过任意一种编程语言调用POSIX 库来访问文件系统。由于HDFS仅能以追加模式写文件,因此可以往文件末尾添加数据,但不能随机修改文件。

关于如何配置和运行NFS网关,以及如何从客户端连接网关,可以参考Hadoop相关文档资料。

4. FUSE

用户空间文件系统(FUSE, Filesystem in Userspace)允许将用户空间实现的文件系统作为Unix文件系统进行集成。通过使用HadoopFuse-DFS功能模块,HDFS(或任何一个Hadoop 文件系统)均可以作为一个标准的本地文件系统进行挂载。Fuse-DFS是用C语言实现的,使用libhdfs作为访问HDFS的接口。在写操作时,Hadoop NFS网关对于挂载HDFS来说是更健壮的解决方案,相比Fuse-DFS而言应优先选择。


【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。