一.hdfs设计原则
1.非常大的文件:
这里的非常大是指几百MB,GB,TB.雅虎的hadoop集群已经可以存储PB级别的数据
2.流式数据访问:
基于一次写,多次读。
3.商用硬件:
hdfs的高可用是用软件来解决,因此不需要昂贵的硬件来保障高可用性,各个生产商售卖的pc或者虚拟机即可。
二. hdfs不适用的场景
1.低延迟的数据访问
hdfs的强项在于大量的数据传输,递延迟不适合他,10毫秒以下的访问可以无视hdfs,不过hbase可以弥补这个缺陷。
2.太多小文件
namenode节点在内存中hold住了整个文件系统的元数据,因此文件的数量就会受到限制,每个文件的元数据大约150字节
1百万个文件,每个文件只占一个block,那么就需要300MB内存。你的服务器可以hold住多少呢,你可以自己算算
3.多处写和随机修改
目前还不支持多处写入以及通过偏移量随机修改
三 . hdfs block
为了最小化查找时间比例,hdfs的块要比磁盘的块大很多。hdfs块的大小默认为64MB,和文件系统的块不同,
hdfs的文件可以小于块大小,并且不会占满整个块大小。
查找时间在10ms左右,数据传输几率在100MB/s,为了使查找时间是传输时间的1%,块的大小必须在100MB左右
一般都会设置为128MB
有了块的抽象之后,hdfs有了三个优点:
1.可以存储比单个磁盘更大的文件
2.存储块比存储文件更加简单,每个块的大小都基本相同
3.使用块比文件更适合做容错性和高可用
四. namenodes和datanodes
hdfs集群有两种类型的节点,一种为master及namenode,另一种为worker及datanodes。
namenode节点管理文件系统的命名空间。它包含一个文件系统的树,所有文件和目录的原数据都在这个树上,这些
信息被存储在本地磁盘的两个文件中,image文件和edit log文件。文件相关的块存在哪个块中,块在哪个地方,这些
信息都是在系统启动的时候加载到namenode的内存中,并不会存储在磁盘中。
datanode节点在文件系统中充当的角色就是苦力,按照namenode和client的指令进行存储或者检索block,并且周期性
的向namenode节点报告它存了哪些文件的block
namenode节点如果不能使用了,那么整个hdfs就玩完了。为了防止这种情况,有两种方式可供选择
1.namenode通过配置元数据可以写到多个磁盘中,最好是独立的磁盘,或者NFS.
2.使用第二namenode节点,第二namenode节点平时并不作为namenode节点工作,它的主要工作内容就是定期根据编辑
日志(edit log)合并命名空间的镜像(namespace image),防止编辑日志过大,合并后的image它自己也保留一份,等着
namenode节点挂掉,然后它可以转正,由于不是实时的,有数据上的损失是很可能发生的。
五 .hdfs Federation
namenode节点保持所有的文件和块的引用在内存中,这就意味着在一个拥有很多很多文件的很大的集群中,内存就成为了一个
限制的条件,hdfs federation在hadoop 2.x的被实现了,允许hdfs有多个namenode节点,每个管hdfs的一部分,比如一个管/usr,
另一个管/home,每个namenode节点是相互隔离的,一个挂掉不会影响另外一个。
六 .hdfs的高可用
不管namenode节点的备份还是第二namenode节点都只能保证数据的恢复,并不能保证hdfs的高可用性,一旦namenode节点挂掉
就会产生单点故障,这时候要手动去数据备份恢复,或者启用第二节点,新的namenode节点在对外服务器要做三件事:
1.把命名空间的镜像加载到内存中
2.重新运行编辑日志
3.接受各个datanode节点的block报告
在一个大型一点的hdfs系统中,等这些做完需要30分钟左右。
2.x已经支持了高可用性(HA),通过一对namenode热备来实现,一台挂掉,备机马上提供无中断服务
要实现HA,要做三点微调:
1.namenode节点必须使用高可用的共享存储。
2.datanode节点必须象两个namenode节点发送block报告
3.客户端做改动可以在故障时切换到可用的namenode节点上,而且要对用户是无感知的
七 failover和fencing
将备份namenode激活的过程就叫failover��管理激活备份namenode的系统叫做failover controller,
zookeeper就可以担当这样的角色,可以保证只有一个节点处于激活状态。
必须确认原来的namenode已经真的挂掉了,很多时候只是网络延迟,如果备份节点已经激活了,
原来的节点又可以提供服务了,这样是不行的,防止原来namenode活过来的过程就叫fencing。
可以用STONITH实现, STONITH可以做到直接断电把原namenode节点fencing掉
该贴被刘伟编辑于2013-6-27 12:52:03