《Hadoop权威指南》第三章Hadoop分布式文件系统

本文深入探讨了Hadoop分布式文件系统(HDFS)的设计理念与核心技术,包括超大文件存储、流式数据访问、商用硬件支持等内容。同时介绍了HDFS中的关键组件如namenode和datanode的作用与工作原理,以及如何通过联邦HDFS和高可用性配置实现系统扩展与容错。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

3.1HDFS的设计

存储超大文件;流式数据访问;商用硬件;低时间延迟的数据访问,HDFS是为提高数据吞吐量应用优化的,这可能以提高时间延迟为代价,对于低延迟的访问HBase是更好的选择;大量的小文件;不支持多用户写入,任意修改文件;

3.2HDFS概念

3.2.1数据块

HDFS有类似于硬盘的块的概念,默认大小为64M。如此之大的原因是,最小化寻址开销。
对分布式文件系统的块进行抽象会带来很多好处:第一个是一个文件的大小可以大于集群上的任意一个磁盘进行存储。第二个好处是,使用抽象块而非整个文件作为存储单元。另外,块还非常适用于数据备份进而提供数据容错能力和提高可用性。

3.2.2namenode和datanode

HDFS集群有两类节点以管理者-工作者模式运行,即一个namenode和多个datanode。
namenode管理文件系统的命名空间,维护着文件系统树及整棵树内所有的文件和目录。这些信息的文件形式永久保存在本地磁盘上:命名空间镜像文件和编辑日志文件。
datanode是文件系统的工作节点。根据需要存储并检索数据块,并且定期向namenode发送他们所存储的块的列表。
namenode是指挥部是核心,因此要实现容错。第一种方式是:备份那些组成文件系统元数据持久状态的文件。另外一种是:运行一个辅助的namenode,但他不能作为namenode运行。

3.2.3联邦HDFS

namenode需要记录所有的文件与数据块的引用关系,内存将成为限制。2.x发行版本系列中引入的联邦HDFS允许系统添加namenode实现扩展。
在联邦环境下,每个namenode维护一个命名空间,包括该命名空间的文件以及所有数据块。

3.2.4HDFS的高可用性

增加HDFS的高可用的办法是,配置活动-备用namenode。实现这一目标需要在架构上做如下修改:
a.namenode之间需要通过高可用的共享存储实现编辑日志的共享。
b.datanode需要同时向两个namenode发送数据块的处理报告。
c.客户端需要特定的机制来处理namenode失效问题。

故障切换与规避
故障转移控制器将活动namenode转换为备用的namenode。每一个namenode运行着一个轻量级的故障转移控制器。
当网络不稳时,也有可能启动备用namenode,这样就会可能造成系统的崩溃,规避机制能够杀死以前的namenode进程使之不影响系统的运行。

3.3命令行接口

3.4Hadoop文件系统

Hadoop有一个抽象的文件系统的概念,HDFS只是其中的一个实现。Java抽象类org.apache.hadoop.fs.FileSystem定义了一个文件系统接口,并且有几个具体实现,如下
Hadoop文件系统
文件系统URI方案java实现描述       
Localfilefs.LocalFileSystem使用了客户端校验和的本地文件
系统。没有使用校验和的本地磁盘文件系统RawLocalFileSystem
HDFShdfshdfs.DistributedFileSystemHadoop的分布式文件系统。将HDFS设计成与MapReduce结合使用,可以提高性能
HFTPhftphdfs.hftpFileSystem一个在HTTP上提供对HDFS只读访问的文件系统
HSFTPhsftphdfs.hsftpFileSystem在HTTPS上提供对HDFS只读访问的文件系统
WebHDFSwebhdfsHdfs.web.WebHdfsFileSystem基于HTTP,对HDFS提供读写访问的文件系统
HARharfs.harFileSystem一个构建在其他文件系统上用于文件存档的文件系统
hfskfsfs.kfs.kosmosFileSystem类似于HDFS或是谷歌的GFS的文件系统,用C++写
FTP ftp fs.ftp.FTPFileSystem由FTP服务器支持的文件系统
S3(原生)S3nfs.s3native.NativeS3FileSystem由Amazon S3支持的文件系统
S3(基于块)S3fs.sa.S3FileSystem由Amazon S3支持的文件系统,以块格式存储文件,以解决S3的5GB文件大小限制
分布式RAIDhdfshdfs.DistributedRaiFileSystem 
Viewviewfsviewfs.ViewFileSystem 

通过HTTP访问HDFS的方式有两种:
直接访问,依靠一个或者多个独立代理服务器通过HTTP访问。
FUSE,用户文件系统(FileSystem in Userspace)允许按照用户空间实现的文件系统整合成一个Unix系统。

3.5Java接口


3.5.1从Hadoop URL读取数据
InputStream in = new URL(“hdfs://post/path”).openStream();
让java程序识别Hadoop的hdfs URL方案,还需要一些额外的工作。一种方式是通过FsUrlStreamHandlerFactory调用java.net.URL对象的setURLStreamHandlerFactory方法。每个java虚拟机只能调用一次这个方法。如果一个第三方的组件已经调用,你将无法从Hadoop总读取数据。另外一种方式就是利用FileSystem来读取文件。

3.6数据流

3.6.1剖析文件读取



3.6.2剖析文件写入





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值