HDFS的一些杂谈

P.S.:主要内容均参考<Hadoop权威指南 第4版>,自己会做少许润色.

Hadoop带有一个自己的文件系统:HDFS(Hadoop DirstributedFileSystem,Hadoop分布式文件系统), HDFS在设计上很大程度上借鉴了谷歌的Google File System(GFS).在谷歌描述GFS的论文中,可以看到很多HDFS的影子.比如,GFS论文的关键词是,容错,可伸缩性,数据存储,集群存储,是不是很熟悉,因为这就是HDFS的设计啊.

下面就分别说说GFS这4个关键词在HDFS的实现是什么样的.

1.容错

HDFS采取了一份数据,多次存储的策略.然而多次存储的机器也不是随意选择的,这个可以参考<权威指南> 73页底部深色框内文字.在这里我对Hadoop存储文件的默认策略稍作描述.

默认是最少存有3个复本.第1个复本存放在运行客户端的节点上.如果客户端不在集群上,就随便选择一个;第2个复本存放在与第1个不同机架上的一个节点上;第3个在与第2个复本的同机架不同节点上.若要存储更多副本,系统会尽量保证在同一机架上不会存放过多的相同复本.

2.可伸缩性

这个理解起来比较简单,集群中可以随时添加或减少机器,只是在操作之前要做好准备工作.

3.数据存储

HDFS就是用来存储数据的~

4.集群存储

HDFS的存储不是由一台机器实现的,而是用集群内很多机器实现的,是分散开来的.毕竟名字就叫Hadoop分布式文件系统.

 

HDFS的设计

说了这么多,来看看<权威指南>上对HDFS设计的描述吧(42-44页):

HDFS以流式数据访问来存储超大文件,运行于商用硬件集群上.

很好理解,HDFS存取文件是以数据流的形式来进行的."商用硬件",指的就是我们在使用的硬件,市面上可以购买到的,而不必使用价格高昂的服务器硬件.

1.超大文件 

在这里指具有几百MB,几百GB,甚至几百TB的文件.目前已经有存储PB级文件的集群.

我们用自己电脑搭建的集群都不大,所以没什么概念.我自用的台式机硬盘容量是3TB,而1PB需要这样的硬盘370多个(1048576GB除以实际容量2790GB),然而这样大的文件,在HDFS上也可以高效的存储.而且HDFS设计就是用来存储大文件,存储大量小文件不太适合用HDFS.

2.流式数据访问

HDFS的设计思路是这样的:一次写入,多次读取是最高效的访问模式.数据集通常由数据源生成或从数据源复制过来,接着长时间在此数据集上进行各种分析.每次分析都将涉及该数据集的大部分数据甚至全部,因此读取整个数据集的时间延迟比读取第一条记录的时间延迟更重要.

这里提到了一个数据分析,可能指的是Hadoop的另一个主要组件:MapReduce.斜体字基本上描述了MapReduce的数据流动方式.MapReduce也是基于谷歌的论文,同样也叫做MapReduce.

3.商用硬件

Hadoop不需要运行在昂贵且可靠的硬件上.它是设计运行在商用硬件集群上的,因此至少对于庞大的集群来说,节点故障的几率还是非常高的.HDFS遇到上述故障时,被设计成能够继续运行且不让用户察觉到明显的中断.

 

这个也说明了Hadoop普及的其中一个原因:无需十分昂贵的服务器硬件.所谓的商用硬件就是我们自己电脑里面装的硬件,价格一般不是很高,尤其是硬盘.那么既然不用稳定的服务器硬件,那么在拥有大量机器的情况下,故障率就一定是比较高的,HDFS的设计就是为了避免频繁的故障对用户体验造成影响.

当然,HDFS也不是万能的,也有不适合做的事情.

同样,那些不适合在HDFS上运行的应用也值得探究.目前HDFS对某些应用领域并不适合,不过以后可能会有所改进.

1.低延迟的数据访问

要求低延迟的数据访问(几十毫秒),不适合在HDFS上运行.记住,HDFS是为高数据吞吐优化的,这个可能会以提高时间延迟为代价.目前,对于低延迟的访问需求,HBase是更好的选择.

这里又提到了HBase,这里要再次提到谷歌的三篇论文,里面有一篇BigTable,HBase就是基于这个实现的.

2.大量的小文件

由于namenode将文件系统元数据存储在内存中,因此该文件系统所能存储的文件总数受限于namenode的内存容量.根据经验,每个文件,目录和数据块的存储信息大约150字节...

这里提到了namenode(名字节点),它相当于整个集群文件的管理者,那么存储数据的叫什么呢?显而易见叫datanode(数据节点).namenode与datanode是属于主从机制,由namenode管理所的datanode.这里的150字节非常关键,要牢牢记住.

3.多用户写入,任意修改文件

HDFS的文件写入只支持单个写入者,而且写操作总是以只添加的方式在文件末尾写数据.它不支持多个写入者的操作,也不支持在文件任意位置修改.可能以后会支持这些操作,但是这些操作相对低效.

这个比较好的说明了HDFS设计思路:一次写入,多次读取.

猜你喜欢

转载自blog.csdn.net/bujiujie8/article/details/86550770