HDFS架构
狭义的Hadoop主要包括HDFS、MapReduce和Yarn,首先我们来了解下HDFS。
如上图所示,HDFS主要包括namenode(nn)、datanode(dn)和secondary namenode(snn,上图没有表示)。
1.1 namenode
namenode主要存放HDFS的元数据,主要包括文件名称、文件的目录结构、文件的副本数、文件对应数据块以及数据块的分布(这部分信息由dn定期向nn发送)等,nn主要接受客户端的请求。
如图所示,表示文件系统中存在/test/a.log 文件,且副本数为3 ,他的每个文件分为两个block块,每个存在哪些dn上面。
1.2 namenode的元数据
Metadata是存储在Namenode上的元数据信息,它存储到磁盘的文件名为:fsimage。并且有个叫edits的文件记录对metadata的操作日志。总体来说,fsimage与edits文件记录了Metadata中的权限信息和文件系统目录树、文件包含哪些块、确定块到DataNode的映射、Block存放在哪些DataNode上(由DataNode启动时上报)。
NameNode将这些信息加载到内存并进行拼装,就成为了一个完整的元数据信息2.1 datanode(数据节点)
(1)负责具体数据的存储,其中数据是以block块的形式存储的
(2)负责接受来自文件系统客户端的读写请求
(3)每隔3秒向nn发送一次心跳
(4)每隔10次心跳向nn报告自身block情况(启动时也做一次该操作)
(5)数据块的校验:这个暂时不知道是啥
(6)数据块的创建与删除
2.2 HDFS的基本存储单元(block)
文件在HDFS上被分成若干个block块,, 默认的bocksize=128M , 若文件258M,则共有block=3,实际占有存储258M,最后一块只占用2M。如果设置的副本数为3的话,则整个集群上存在9个block,放置位置随机。
2.3 Block的副本放置策略
副本的存放是HDFS可靠性和性能的关键。优化的副本存放策略是HDFS区分于其他大部分分布式文件系统的重要特性。这种特性需要做大量的调优,并需要经验的积累。HDFS采用一种称为机架感知(rack-aware)的策略来改进数据的可靠性、可用性和网络带宽的利用率。目前实现的副本存放策略只是在这个方向上的第一步。实现这个策略的短期目标是验证它在生产环境下的有效性,观察它的行为,为实现更先进的策略打下测试和研究的基础。
大型HDFS实例一般运行在跨越多个机架的计算机组成的集群上,不同机架上的两台机器之间的通讯需要经过交换机。在大多数情况下,同一个机架内的两台机器间的带宽会比不同机架的两台机器间的带宽大。
通过一个机架感知的过程,Namenode可以确定每个Datanode所属的机架id。一个简单但没有优化的策略就是将副本存放在不同的机架上。这样可以有效防止当整个机架失效时数据的丢失,并且允许读数据的时候充分利用多个机架的带宽。这种策略设置可以将副本均匀分布在集群中,有利于当组件失效情况下的负载均衡。但是,因为这种策略的一个写操作需要传输数据块到多个机架,这增加了写的代价。
在大多数情况下,副本系数是3,HDFS的存放策略是将一个副本存放在本地机架的节点上,一个副本放在同一机架的另一个节点上,最后一个副本放在不同机架的节点上。这种策略减少了机架间的数据传输,这就提高了写操作的效率。机架的错误远远比节点的错误少,所以这个策略不会影响到数据的可靠性和可用性。于此同时,因为数据块只放在两个(不是三个)不同的机架上,所以此策略减少了读取数据时需要的网络传输总带宽。在这种策略下,副本并不是均匀分布在不同的机架上。三分之一的副本在一个节点上,三分之二的副本在一个机架上,其他副本均匀分布在剩下的机架中,这一策略在不损害数据可靠性和读取性能的情况下改进了写的性能。
3.1 SecondaryNameNode