XY个人笔记
序
这里有Google三篇论文中英文的下载地址:
Hadoop的两大核心架构是HDFS(Hadoop Distributed File System) 分布式文件系统和MapReduce(Map - 映射-对逻辑业务并行处理 Reduce - 归约-合并统计数据结果)。MapReduce提供了对数据的计算,一个并行计算框架,HDFS提供了对海量数据的存储,一个为访问应用数据提供高吞吐量的分布式文件系统。HDFS是根据Google的GFS论文概念模型设计实现的。
在论文中GFS的整体架构图:
HDFS参考了它的大部分设计架构,两个在架构上是类似的,比如HDFS的NameNode和GFS的Master,HDFS的DataNode和GFS的chunkserver。拿Google论文里面的图出来,主要是因为他比较强大,毕竟原始HDFS的起源嘛。只贴图不介绍 哈哈,对于GFS架构就不具体详细的介绍了,需要了解的话可以看看GFS的论文,里面有详细的介绍。
一、HDFS
HDFS能提供高吞吐量的数据访问,非常适合大规模数据集上的应用,有着高容错性的特点,并且设计用来部署在低廉的硬件上。而且它提供高吞吐量(high throughput)来访问应用程序的数据,适合那些有着超大数据集(large data set)的应用程序。
HDFS采用主从(Master/Slave)结构模型,HDFS中的文件在物理上是分块存储(block),块的大小可以通过配置参数( dfs.blocksize)来规定,默认大小在hadoop2.x版本中是128M,之前的版本中是64M。支持文件形式的数据主要由3个组件构成,分别是NameNode、SecondaryNameNode和DataNode,其中NameNode、SecondaryNameNode 运行在master节点,DataNode运行slave节点。一个HDFS集群是由一个NameNode和若干个DataNode组成的。
HDFS的架构图:
下面来说一下HDFS的三个组件:
fsimage保存了最新的元数据检查点,包含了整个HDFS文件系统的所有目录和文件的信息。对于文件来说包括了数据块描述信息、修改时间、访问时间等;对于目录来说包括修改时间、访问权限控制信息(目录所属用户,所在组)等。
editlog主要是在NameNode已经启动情况下对HDFS进行的各种更新操作进行记录,HDFS客户端执行所有的写操作都会被记录到editlog中。
简单一点理解,NameNode维护了文件与数据块的映射表以及数据块与数据节点的映射表,也就是说一个文件,切分成多个block,这些block分别存放在哪些DataNode上,都是有NameNode记录的。。fsimage就是在某一时刻,整个hdfs的快照,就是这个时刻hdfs上所有的文件块和目录,分别的状态,位于哪些个datanode,各自的权限,各自的副本个数。然后客户端对hdfs所有的更新操作,比如说移动数据,或者删除数据,都会记录在editlog中。
为了避免editlog不断增大,secondaryNamenode会周期性(周期可以自己设置)合并fsimage和edits成新的fsimage和editlog,新生成的fsimage和editlog会替换旧的。
HDFS读、写数据流程
文件写入:
a).Client向NameNode发起文件写入的请求,以确认可以写文件并获得接收文件block的DataNode。
b).Client将文件划分为多个Block,根据DataNode的地址信息,按顺序写入到每一个DataNode块中,NameNode接收到block后把对应上传的数据节点返回给客户端。
c).NameNode根据文件大小和文件块配置情况,返回给Client它所管理部分DataNode的信息(也可以理解为文件需要上传的节点)。
d).建立传输通道,开始上传。
e).由接收到block的DataNode负责向其他DataNode复制block的副本。
文件读取:
a).Client向NameNode发起文件读取的请求。
b).NameNode检查文件是否存在,如果存在则获取文件的元信息(blockid以及对应的datanode列表),并返把元数据返回给客户端。
c).客户端收到元信息后选取一个网络距离最近的datanode,依次请求读取每个数据块。客户端首先要校检文件是否损坏,如果损坏,客户端会选取另外的datanode请求。
d).Client通过socket读取文件信息,并把文件写入本地文件。
文件Block复制:
a).NameNode发现部分文件的Block不符合最小复制数或者部分DataNode失效。
b).通知DataNode相互复制Block。
c).DataNode开始直接相互复制。
安全模式:
等待过程,处于安全模式,safemode安全模式下HDFS文件系统是只读的,进入"只读不写"的状态,Namenode每次启动的时候,在等待的过程中都是处于安全模式,并且安全模式下HDFS不能响应外部客户端的写操作请求(上传、删除等修改类操作),安全模式下客户端读取HDFS文件和下载HDFS文件到本地是可以的。Namenode从所有的 Datanode接收心跳信号和块状态报告。块状态报告包括了某个Datanode所有的数据块列表。每个数据块都有一个指定的最小副本数。当Namenode检测确认某个数据块的副本数目达到这个最小值,那么该数据块就会被认为是副本安全(safely replicated)的;在一定百分比(这个参数可配置)的数据块被Namenode检测确认是安全之后(加上一个额外的30秒等待时间),Namenode将退出安全模式状态。接下来它会确定还有哪些数据块的副本没有达到指定数目,并将这些数据块复制到其他Datanode上。