目录
一、HDFS切分Block如果一个单词被切分为一半会有什么影响。(分布式文件系统结构PDF第二块知识点)
一、HDFS切分Block如果一个单词被切分为一半会有什么影响。(分布式文件系统结构PDF第二块知识点)
-
字节数组是文件在磁盘真实存储文件的抽象概念,数组可以进行拆分和组装,源文件不会受到影响,通过下表便宜量可以很快定位数据。
-
数据存储的原理: 不管文件的的大小,所有的文件都是由字节数组构成 如果我们要切分文件,就是将一个字节数组分成多份 我们将切分后的数据拼接到一起,数据可以继续使用 我们需要根据数据的偏移量将他们重新拼接到一起
-
引出Block切分标准
-
拆分的数据块需要等大,通过文件大小变知道切分为几个块,块与块之间差了几个块,通过偏移量定位块在文件的位置。等大方便计算切分等等。
-
HDFS中一旦文件被存储,数据不允许被修改
-
一个Block有多个副本
-
二、Hadoop1.X系统架构
1.NameNode功能作用
-
存放信息,文件的元数据信息,文件与Block块的映射信息,块与DataNode的映射关系。其中关闭集群时,文件的元数据信息和文件和Block块的映射会被实例化到磁盘上。都是固定的内容。但是Block块玉DataNode的映射关系不会被持久化保存,因为并不能保证每次重启的时候每个DN都能正常启动,有可能客户端访问NN得到文件Block对应DN地址是失效的。为了解决这个问题,为保证每一个Block块与DataNode的映射是有效的,每次集群启动,DN都会汇报当前节点信息给NN节点,当所有DN都成功启动后,NN也就收集好了Block与DN的有效映射关系。如果启动中由部分DN失败了,导致有的Block副本数达不到最小要求,NN会将Block复制到其他DN上。
-
心跳机制
-
当集群启动完毕后,NN与DN保存心跳机制,每3秒发送一次,如果超过三次本次心跳失败,暂时标记当前DN节点不可用,当DN超过10分钟+30S,那么NN会将DN存储的数据转存到其他DN节点上。
-
-
接受客户的请求,客户端访问与上传文件都会询问NN并得到对应的DN位置。
-
存放日志文件,NN为了追寻效率,所有数据都存放在内存中。
2.DataNode功能作用
-
存储数据,Block都会存放在DN节点上。
-
HDFS特别害怕小文件,因为小文件可能还没有映射文件大。
-
-
心跳机制,DN启动后,检测当前节点Block的信息及完整性,如果没有问题,就将其汇报给NN节点。
3.SecondaryNameNode功能作用
-
帮助NN,进行日志的合并于拍摄快照。
4.SNN进行日志文件合并的过程
-
当NN日志文件达到64MB或者经过3600S之后,会创建新的日志文件。SNN会拉取最新的日志文件和上一次的快照信息,然后对快照进行日志的操作,并拍摄新的快照,并复制到NN节点。
-
三、HDFS启动流程
1.安全模式
-
是集群启动中的一个中间状态,安全模式是HDFS的一种工作状态,处于安全模式的状态下,只向客户端提供文件的只读视图,不接受对命名空间的修改;同时NameNode节点也不会进行数据块的复制或者删除
-
各个DataNode会向NameNode发送自身的数据块列表
-
NameNode有足够的数据块信息后,便在30秒后退出安全模式
-
NameNode发现数据节点过少会启动数据块复制过程
2.机架感知策略
-
为了保证副本在集群的安全性
-
第一个节点
-
集群内部(优先考虑和客户端相同节点作为第一个节点)
-
集群外部(选择资源丰富且不繁忙的节点为第一个节点)
-
-
第二个节点 选择和第一个节点不同机架的其他节点
-
第三个节点 与第二个节点相同机架的其他节点
-
第N个节点 与前面节点不重复的其他节点
四、HDFS的写数据流程
复述流程
-
HDFS的写入过程,首先客户端向NameNode发送一个请求,NN检测请求的合法性,是否有足够的空间创建这个文件,是否有权限上传文件,上传的文件夹路径是否存在,文件是否存在等问题,如果问题又问题返回一个异常给客户端。如果没有问题,在NN上创建一个文件对应的entry文件用来保存文件的元数据信息,文件与Block块的映射信息,Block块与DataNode节点的映射信息,给客户端创建一个输出流用来向HDFS传递文件数据。
-
客户端向NN,询问第一个Block存放的位置信息,NN通过机架感知策略,返回Block及其副本存放的DN的信息。【机架感知策略,为了保证副本在集群中的安全性,第一个节点[ (如果集群内,优先考虑与客户端同节点),(集群外,选择一个资源丰富且不忙碌的节点)] 第二个节点 选择与第一个节点不同机架上的其他节点。 第三个节点 选择与第二个节点相同机架的其他节点 )其它节点 与前面不充分的节点】 客户端通过得到的DN信息与DN节点之间创建管道,客户端连接DN1,DN1连接DN2,DN2连接DN3。减少客户端带宽,增加传输速率。
-
管道(管道本质就算Socket连接)建立之后,按packet包发送数据。好处是,如果发送数据的过程中出现了错误了,只需要重写发送失败的packet包,不需要重新发送整个Block块。
-
讲一下packet包是 什么 ,由什么构成的。packet数据分为两类。一类是header,packet头信息,存放packet 的的数据长度,在Block中的偏移量,packet序列号,是否为最后一个packet等等信息,另一类是实际的数据包,由若干个chunk 与 checksum构成,一个chunk512B,存放文件数据,一个checksum4B,存放chunk的检验文件,检验chunk数据片段是否合法正确。
-
当chunk与checksum填满一个packet后,这个packet会被挂载到DataQueue队列上,等待守护线程DataStreamer取出发送给管道,当packet取出后不会被删除,而是挂载到了AckQueue应答队列上,如果传输中packet出现错误,会将packet重新加载到DataQueue中等待重新发送。那如何判断成功失败的呢?
-
Packet Ack机制是这样子的,举个例子,一主两备,当客户端传递packet到第一个节点后,同时给予节点一 1个ack状态,第一个节点接受数据后将数据继续发送给第二个节点,同时给予节点二1个ack状态,第二个节点接受数据后将数据继续发送给第三个节点,第三个节点接受成功后,向节点二响应一个成功的ack状态,然后节点二接到到节点三成功的应答后,向节点一响应一个成功的ack状态,然后节点一接受到节点二成功的应答后,向客户端响应一个成功的ack状态,当客户端接到到成功的ack状态时,就认为这个packet发送成功,接受发送下一个packet。如果由一个ack状态为失败,则表示此packet发送失败,将应答队列中的所有packet重新挂载到发送队列,放在发送队列首位,因为要按顺序进行packet的发送。
-
当所有packet发送成功后,表示当前block发送成功。所有的chunk文件 形成了block 的mate文件,所有checksum文件形成了 block的校验文件。
-
然后重复上述过程将block全部传输成功,则此文件保存到HDFS中
五、HDFS的读数据流程
复述流程
-
客户端发送消息给NameNode,申请读取一个文件,NN先判断有没有权限,有没有此文件。
-
如果没有返回异常,如果有则返回成功并为客户端创建一个输入流,用来读取文件。
-
客户端获得文件第一个Block的信息,从主备Block中选一个最近进行读取,我查了一下读取过程,也是按packet为单位读取的。
-
读取完一个block之后,对这个block进行一次checksum的验证,验证这个block的数据总量是否正确,如果不一致,说明这个block产生损坏,客户端会通知namenode,再从其他节点上读取该block,NameNode收到消息从新备份一次,发指令给这个DataNode让他把这个坏的删除。
-
以此类推将所有的block块全部读出,合并成一个文件,就完成了读取过程。
六、Hadoop1的困境
-
单点故障
-
水平扩展
-
NameNode内存随着时间占满问题
-
业务隔离性差
-
项目后期namenode的吞吐量将会是集群的瓶颈
解决方法 HA高可用框架 与 联邦机制的引入
七、Hadoop-HA
1.HA解决的问题(好处)
-
解决了单点故障的问题,启用主备切换模式,当主节点宕机后,集群直接将备用节点切换成主节点。
2.ANN的功能作用
-
Active NameNode 的功能和原理的NN的功能是一样的
-
接受客户端请求,查询数据块DN信息
-
存储数据的元数据信息,文件于Block的映射关系,Block与DN的映射关系
-
启动时:接受DN的block汇报 运行时:和DN保持心跳(3s,10m30s)
-
完全基于内存 优点:数据处理效率高 缺点:数据的持久化(日志edits+快照fsimage)
-
3.SNN的功能作用
-
Standby NameNode:NN的备用节点
-
他和主节点做同样的工作,但是它不会发出任何指令
-
替代了SNN,并接替了合并日志的工作。
4.DataNode的功能作用
-
存储,文件的Block数据
-
启动时:同时向两个NN汇报Block信息
-
运行中:同时和两个NN节点保持心跳机制
5.QJM的功能作用
-
Quorum JournalNode Manager 共享存储系统,NameNode通过共享存储系统实现日志数据同步。
-
JournalNode是一个独立的小集群,它的实现原理和Zookeeper的一致( Paxos)
-
ANN产生日志文件的时候,就会同时发送到 JournalNode的集群中每个节点上
-
JournalNode不要求所有的jn节点都接收到日志,只要有半数以上的(n/2+1)节点接受收到日志,那么本条日志就生效
-
SNN每间隔一段时间就去QJM上面取回最新的日志
-
SNN上的日志有可能不是最新的,因为不上所有jn节点都是全部的最新数据
-
-
在原来的模式下,这些日志文件都是放在active的NameNode(NN) 中,又starndy 的NN 定期来合并这些日志文件(压缩等待),然后将合并后的文件合并到active 的NN,关键问题是,如果这个NN挂掉了那么整个集群就挂掉了,为了解决这个问题。
-
将日志文件由NN写到几台机器上journalnode,几台的原因是担心有机器挂掉.
-
设置两个NN,一个是active的,一个是backup的,如果active的挂掉了,通过zookeeper,让backup的NN变成active的NN,通过重播journalnode上的日志,让backup的NN的数据同步到active NN 挂掉的状态, 这样集群的容错能力更强。
-
6.ZKFC作用
-
Failover Controller(故障转移控制器)
-
对 NameNode 的主备切换进行总体控制,能及时检测到 NameNode 的健康状况
-
在主 NameNode 故障时借助 Zookeeper 实现自动的主备选举和切换
-
为了防止因为NN的GC失败导致心跳受影响,ZKFC作为一个deamon进程从NN分离出来
-
-
启动时
-
当集群启动时,主备节点的概念是很模糊的
-
当ZKFC只检查到一个节点是健康状态,直接将其设置为主节点
-
当zkfc检查到两个NN节点是的健康状态,发起投票机制
-
选出一个主节点,一个备用节点,并修改主备节点的状态
-
-
运行时
-
当主节点选举成功后,zookeeper中创建一个临时数据并watch,但主节点出现异常问题时,会被watch到,然后回进行主备切换
-
当宕机的主节点上线后,会转变为备用节点
-
7.Zookeeper
-
辅助投票,辅助NN节点的主备切换
-
和ZKFC保持心跳机制,确定ZKFC的存活
8.脑裂问题解决办法
解决脑裂的核心是隔离,将旧的主节点进行隔离操作
方法一
-
每次NN发生指令时,会携带一个序列号
-
每次选举,ANN都会将序列号发送给DN
-
出现脑裂后,多个NN发送指令,DN只以最新的指令为准
方法二
-
每次ANN选举后,都会在Zookeeper生成一个临时节点和一个正常节点。
-
当ANN正常下线,临时与正常节点都会被删除
-
当ANN被动下线时,只有临时节点会被删除
-
SNN发现临时与正常节点都不在,放心的切换为主节点
-
SNN发现只有临时节点不在时,可能是发生了脑裂现象。
-
首先会联系以前的ANN,PRC调用ANN的ActiveBreadCrumb方法,尝试主切换为备。
-
如果切换失败,会执行预定义的隔离措施 sshfence或者shellfence将ANN杀死 然后SNN调用BecomeActive成为主节点,开始对外提供服务。并在Zookeeper上创建临时与正常节点。
-
核心 就是先杀旧主,在立新主
-
八、Hadoop-Federation联邦机制
1.联邦机制解决的问题
-
单NN局限性
-
整个HDFS文件系统的吞吐量受限于单个Namenode的吞吐量
-
资源的隔离性,HDFS上的一个实验程序就很有可能影响整个HDFS上运行的程序
-
纵向扩展目前的Namenode不可行
-
单点故障,Namenode的宕机无疑会导致整个集群不可用。
-
后期NN节点内存会被占满
-
2.联邦机制的实现
-
允许一个集群中有多个NN节点,并且每一个NN节点都是HA高可用的。
-
所有的nn共享dn,但是每一个namespace会单独管理自己的块,会创建一个管理块的机制:blocks pool
-
每个NN节点有一个命名空间,每个命名空间有对应的块池
-
块池Block Pool,存放该NN节点管理的Block块与DN的映射关系
-
块池是一个逻辑概念
-
-
通过多个namenode/namespace把元数据的存储和管理分散到多个节点中
-
namenode/namespace可以通过增加机器来进行水平扩展
九、Hadoop3.X新特性
-
EC技术,减少文件的存储空间,但执行远程读取时数据重建带来额外的开销,所有用于不太频繁访问的数据。
-
在Hadoop3中允许用户运行多个备用的NameNode。
-
早些时候,多个Hadoop服务的默认端口位于Linux端口范围以,因此,具有临时范围冲突端口已经被移除该范围
-
DataNode可能会因为文件的添加或者替换导致节点存储出现偏移,但3.X会平衡功能来处理这种情况
||
V
-
Hadoop3中,最低版本要求是JDK8
十、面试题
1 请说下 HDFS 读写流程
2 HDFS 在读取文件的时候,如果其中一个块突然损坏了怎么办
3 HDFS 在上传文件的时候,如果其中一个 DataNode 突然挂掉了怎么办
4 NameNode 在启动的时候会做哪些操作
5 Secondary NameNode 了解吗,它的工作机制是怎样的
6 Secondary NameNode 不能恢复 NameNode 的全部数据,那如何保证 NameNode 数据
存储安全
7 在 NameNode HA 中,会出现脑裂问题吗?怎么解决脑裂
8 小文件过多会有什么危害,如何避免
9 请说下 HDFS 的组织架构