大数跨境

音智达企业文稿:系统的梳理HDFS

音智达企业文稿:系统的梳理HDFS 广东省数字化学会
2018-07-18
2
导读:音智达是一家专注于帮助企业做数字化转型与数据驱动管理的大数据公司。公司总部位于上海,运营遍及大中华与东南亚地区。在十余年的发展历史中,音智达为亚洲地区数以百计的跨国企业及本土客户提供数据服务,拥有丰富


企业介绍

音智达是一家专注于帮助企业做数字化转型与数据驱动管理的大数据公司。公司总部位于上海,运营遍及大中华与东南亚地区。在十余年的发展历史中,音智达为亚洲地区数以百计的跨国企业及本土客户提供数据服务,拥有丰富的数据分析与业务实施经验,在生命科学、快消品、汽车、零售、电子消费产品、金融、保险、以及运输行业享有众多实践成功案例。



大家好,今天给大家分享的是Hadoop中较为重要的一个部分:HDFS,我们将会进行一次较为系统的梳理,方便大家以后工作中使用到。


HDFS

设计理念


1.存储超大文件

这里的“超大文件”指几百MB、GB甚至TB级别的文件

 

2.一次写入多次读取(流式数据访问)

HDFS存储的数据集作为Hadoop的分析对象在数据集生成后长时间在此数据集上进行各种分析,每次分析都将设计该数据集的大部分数据甚至全部数据。因此读取整个数据集的时间延迟比读取第一条记录的时间延迟更重要。

 

3.可以运行

运行在普通廉价的服务器HDFS设计理念之一就是让他能运行。在普通的硬件之上,即便硬件出现故障,也可通过容错策略来保证数据的高可用。

元数据合并


HDFS元数据存放于NameNode节点,主要包含两块元数据,一块是文件与数据块的信息,一块是数据块与节点的信息,在这里主要说明的是文件与数据块的元数据合并原理,即fsimage和edits合并原理。


 

1、NameNode初始化时会产生一个edits文件和一个fsImage文件,edits文件用于记录操作日志,比如文件的删除或添加等操作信息,fsImage用于存储文件与目录对应的信息以及edits合并进来的信息,即相当于fsImage文件在这里是一个总的元数据文件,记录着所有的信息;

 

2、随着edits文件不断增大,当达到设定的一个阀值的时候,这时 SecondaryNameNode会将edits文件和fsImage文件通过采用http的方式进行复制到SecondaryNameNode下(在这里考虑到网络传输, 所以一般将NameNode和SecondaryNameNode放在相同的节点上,这样就无需走网络带宽了,以提高运行效率),同时NameNode会产生一个新的edits文件替换掉旧的 edits 文件,这样以保证数据不会出现冗余;

 

3、SecondaryNameNode拿到这两个文件后,会在内存中进行合并成一个fsImage.ckpt的文件,合并完成后,再通过http的方式将合并后的文件fsImage.ckpt复制到NameNode下,NameNode文件拿到fsImage.ckpt文件后,会将旧的fsimage文件替换掉,并且改名成fsimage文件。

 

通过以上几步则完成了edits和fsImage文件的合并,依此不断循环,从而到达保证元数据的正确性。

 

edits文件的作用

主要是为了减轻NameNode节点的压力,提高效率,采用分开管理的方式,fsImage文件在存在过程不需要一边去管理操作信息,又一边去考虑目录结构信息,fsImage只需要关注存储即可,相关操作信息写入交由edits文件去负责。

写操作

1、HDFS 客户端提交写操作到NameNode上,NameNode收到客户端提交的请求后,会先判断此客户端在此目录下是否有写权限,如果有,然后进行查看,看哪几个DataNode适合存放,再给客户端返回存放数据块的节点信息,即告诉客户端可以把文件存放到相关的DataNode节点下;

 

2、客户端拿到数据存放节点位置信息后,会和对应的DataNode 节点进行直接交互,进行数据写入,由于数据块具有副本replication,在数据写入时采用的方式是先写第一个副本,写完后再从第一个副本的节点将数据拷贝到其它节点,依次类推,直到所有副本都写完了,才算数据成功写入到HDFS上,副本写入采用的是串行,每个副本写的过程中都会逐级向上反馈写进度,以保证实时知道副本的写入情况;

 

3、随着所有副本写完后,客户端会收到数据节点反馈回来的一个成功状态,成功结束后,关闭与数据节点交互的通道,并反馈状态给NameNode, 告诉NameNode文件已成功写入到对应的 DataNode。

 

例:

有一个文件FileA,100M大小。Client将FileA写入到HDFS上。

HDFS按默认配置。

HDFS分布在三个机架上Rack1,Rack2,Rack3。

a. Client将FileA按64M分块。分成两块,Block1和Block2;

b. Client向nameNode发送写数据请求,如图蓝色虚线①------>。

c. NameNode节点,记录block信息。并返回可用的DataNode,如粉色虚线②--------->。

Block1: host2,host1,host3

Block2: host7,host8,host4

 

原理:

NameNode具有RackAware机架感知功能,这个可以配置。

 

若client为DataNode节点,那存储block时,规则为:副本1,同client的节点上;副本2,不同机架节点上;副本3,同第二个副本机架的另一个节点上;其他副本随机挑选。若client不为DataNode节点,那存储block时,规则为:副本1,随机选择一个节点上;副本2,不同副本1,机架上;副本3,同副本2相同的另一个节点上;其他副本随机挑选。


d. client向DataNode发送Block1;发送过程是以流式写入。

流式写入过程,

1>将64M的Block1按64k的package划分;

2>然后将第一个package发送给host2;

3>host2接收完后,将第一个package发送给host1,同时client向host2发送第二个package;

4>host1接收完第一个package后,发送给host3,同时接收host2发来的第二个package。

5>以此类推,如图红线实线所示,直到将Block1发送完毕。

6>host2,host1,host3向NameNode,host2向Client发送通知,说“消息发送完了”。如图粉红颜色实线所示。

7>client收到host2发来的消息后,向NameNode发送消息,说我写完了。这样就真完成了。如图黄色粗实线

8>发送完block1后,再向host7,host8,host4发送Block2,如图蓝色实线所示。

9>发送完block2后,host7,host8,host4向NameNode,host7向Client发送通知,如图浅绿色实线所示。

10>client向NameNode发送消息,说我写完了,如图黄色粗实线,这样就完毕了。

 

通过写过程,我们可以了解到:


①写1T文件,我们需要3T的存储,3T的网络流量贷款

 

②在执行读或写的过程中,NameNode和DataNode通过HeartBeat进行保存通信,确定DataNode活着。如果发现DataNode死掉了,就将死掉的DataNode上的数据,放到其他节点去。读取时,要读其他节点去。

 

③挂掉一个节点,没关系,还有其他节点可以备份;甚至,挂掉某一个机架,也没关系;其他机架上,也有备份。


读操作


1、HDFS 客户端提交读操作到 NameNode 上,NameNode 收到客户端提交的请求后,会先判断此客户端在此目录下是否有读权限,如果有,则给客户端返回存放数据块的节点信息,即告诉客户端可以到相关的 DataNode 节点下去读取数据块;

 

2、客户端拿到块位置信息后,会去和相关的 DataNode 直接构建读取通道,读取数据块,当所有数据块都读取完成后关闭通道,并给NameNode 返回状态信息,告诉 NameNode 已经读取完毕。

例:

a.client向namenode发送读请求。

b.namenode查看Metadata信息,返回fileA的block的位置。

 Block1:host2,host1,host3

 Block2:host7,host8,host4

c.block的位置是有先后顺序的,先读Block1,再读Block2。而且Block1去host2上读取;然后Block2,去host7上读取;

上面例子中,client位于机架外,那么如果client位于机架内某个DataNode上,例如,client是host6。那么读取的时候,遵循的规律是:

优先读取本机架上的数据。


运行原理


1、NameNode和DataNode节点初始化完成后,采用RPC进行信息交换,采用的机制是心跳机制,即DataNode节点定时向NameNode反馈状态信息,反馈信息如:是否正常、磁盘空间大小、资源消耗情况等信息,以确保NameNode知道DataNode的情况;

 

2、NameNode会将子节点的相关元数据信息缓存在内存中,对于文件与block块的信息会通过fsImage和edits文件方式持久化在磁盘上,以确保NameNode知道文件各个块的相关信息;

 

3、NameNode负责存储fsImage和edits元数据信息,但fsImage和edits元数据文件需要定期进行合并,这时则由SecondaryNameNode进程对fsImage和 edits 文件进行定期合并,合并好的文件再交给NameNode存储。

 

《完》


One more things


数字化学会社群正在招募,旨在为数字化行业从业者、学习者和爱好者搭建一个交流平台。请仔细阅读下列分类,并准备名片。企业工程师优先入群。 


 加群方式:在公众号后台回复“加群”,按照步骤操作即可。


1、数字化学会(华为群)

2、大数据AI群

3、智能制造业群

4、数据分析师群



长按识别二维码,了解更多协会信息




【声明】内容源于网络
0
0
广东省数字化学会
帮助企业数字化转型,让数据成为生产力
内容 1127
粉丝 0
广东省数字化学会 帮助企业数字化转型,让数据成为生产力
总阅读359
粉丝0
内容1.1k