1.1. Hadoop架构
Hadoop1.0版本两个核心:HDFS+MapReduce
Hadoop2.0版本,引入了Yarn。核心:HDFS+Yarn+Mapreduce
Yarn是资源调度框架。能够细粒度的管理和调度任务。此外,还能够支持其他的计算框架,比如spark等。
1.2. HDFS设计
单台机器的硬件扩展
纵向扩展的问题,是有硬件瓶颈的,包括成本也会指数型增长。
1.3. namenode工作职责:
1.要知道管理有哪些机器节点,即有哪些datanode。比如ip信息等。
2.要管理文件信息,文件名、文件多大、文件被切成几块、以及每一块的存贮位置信息(存在哪个datanode节点上了),即管理元数据信息。
3.要有一个机制要知道集群里datanode节点的状态变化。可以rpc心跳机制来做到。
4.namenode存在单点故障问题,可以再引入一台管理者节点。
5.datanode挂掉后,可能数据就丢失,文件就不完整了,要有一个备份机制,一般来说,一个文件块,有3个备份,本机一份,同一机架的其他datanode有一份,另外一机器的机器上有一份。
1.4. HDFS细节说明
1.4.1. Hadoop块概念
Hadoop1.0是按64MB切,BlockSize=64MB
Hadoop2.0 BlockSize=128MB
1.4.2. namenode
管理元数据信息,文件名,文件大小,文件块信息等。
namdenode把元数据信息存到内存里,为了快速查询,此外为了应对服务宕机而引起的元数据丢失,也要持久化到本地文件里。
namdenode不存储具体块数据,只存储元数据信息;datanode用于负责存储块数据。
1.4.3. fsimage、edits
fsimage 文件,记录元数据信息的文件
edits文件,记录元数据信息改动的文件。只要元数据发生变化,这个edits文件就会有对应记录。
fsimage和edits文件会定期做合并,这个周期默认是3600s。fsimage根据edits里改动记录进行元数据更新。
元数据信息如果丢失,HDFS就不能正常工作了。
hadoop namenode -format 这个指令实际的作用时,创建了初始的fsimage文件和edits文件。
1.4.4. Secondarynamenode
负责将fsimage文件定期和edits文件做合并,合并之后,将合并后的元数据文件fsimage传给namenode。这个SN相当于namenode辅助节点。
Hadoop集群最开始启动的时候,创建Fsimage和edits文件,这个namenode做的,此外,namenode会做一次文件合并工作,这么做的目的是确保元数据信息是最新的,以为上次停集群的时候,可能还没来的及做合并。但以后的合并工作,就交给SN去做了。这种SN机制是Hadoop1.0的机制。
结论:Hadoop1.0的SN达不到热备效果,达不到元数据的实时更新,也就意味着了当namenode挂了的时候,元数据信息可能还会丢失,所以,Hadoop1.0版本的namenode还是单点故障问题。
1.5. HDFS架构图
1.5.1. namenode
名字节点。要管理元数据信息(Metadata),注意,只存储元数据信息。
namenode对于元数据信息的管理,放在内存一份,供访问查询,也会通过fsimage和edits文件,将元数据信息持久化到磁盘上。Hadoop1.0版本利用了SecondaryNamenode做fsimage和edits文件的合并,但是这种机制达不到热备的效果。Hadoop1.0的namenode存在单点故障问题。
1.5.2. datanode
数据节点。用于存储文件块。为了防止datanode挂掉造成的数据丢失,对于文件块要有备份,一个文件块有三个副本。
1.5.3. rack
机架
1.5.4. client
客户端,凡是通过API或指令操作的一端都可以看做是客户端
1.5.5. blockSize
数据块。Hadoop1.0:64MB。Hadoop2.0 :128MB。
块大小的问题。从大数据处理角度来看,块越大越好。所以从技术的发展,以后的块会越来越大,因为块大,会减少磁盘寻址次数,从而减少寻址时间
1.6. HDFS读流程图
5.
1.客户端发出读数据请求,Open File指定读取的文件路径,去找namenode要元数据信息。
2.namenode将文件的元数据信息返回给客户端。
3. 3客户端根据返回的元数据信息,去对应的datanode去读块数据。
假如一个文件特别大,比如1TB,会分成好多块,此时,namenode并是不一次性把所有的元数据信息返回给客户端。
4. 4客户端读完此部分后,再去想namenode要下一部分的元数据信息,再接着读。
5.读完之后,通知namenode关闭流
1.7. HDFS写流程
1.发起一个写数据请求,并指定上传文件的路径,然后去找namenode。namenode首先会判断路径合法性,然后会判断此客户端是否有写权限。然后都满足,namenode会给客户端返回一个输出流。此外,namenode会为文件分配块存储信息。注意,namenode也是分配块的存储信息,但不做物理切块工作。
2.客户端拿到输出流以及块存储信息之后,就开始向datanode写数据。因为一个块数据,有三个副本,所以图里有三个datanode。packet初学时可以简单理解为就是一块数据。
pipeLine:[bl1,datanode01-datanode03-datanode-07]
3.数据块的发送,先发给第一台datanode,然后再有第一台datanode发往第二台datanode,……。实际这里,用到了pipeLine 数据流管道的思想。
4.通过ack确认机制,向上游节点发送确认,这么做的目的是确保块数据复制的完整性。
5.通过最上游节点,向客户端发送ack,如果块数据没有发送完,就继续发送下一块。如果所有块数据都已发完,就可以关流了。
6.所有块数据都写完后,关流。
扩展:
数据流管道的目的:
我们的目标
是充分利用每台机器的带宽,避免网络瓶颈和高延时的连接,最小化推送所有数据的延时。 此外,利用通信的通信双工,能够提高传输效率。
packet 是一个64kb大小的数据包