赞
踩
目录
文章内容来自:南京大学 / 星环科技课程,大数据理论与实践课程Ⅰ
对细节部分引用其他网络资源进行补充。
概念
设计目标
高容错、高可用、高扩展
海量数据存储
构建成本低、安全可靠
适合大规模离线批处理
不适合低延迟数据访问
不适合存储小文件
不支持并发写入
不支持随机修改
Active NameNode(AN)
Standby NameNode(SN)
DataNode(DN)
Client
角色分工
数据存储
1,Block数据块
1)HDFS的最小存储单元
2)多Block多副本
文件被切分为若干个Block,每个Block有多个副本(默认3副本)
Block以DataNode为存储单元,即一个DataNode上只能存放Block的一个副本
机架感知:尽量将副本存储到不同的机架上,以提升数据的容错能力
副本均匀分布:DataNode的Block副本数和访问负荷要比较接近,以实现负载均衡
3)Block大小
默认128M,可设置(若Block中数据的实际大小<设定值 ,则Block大小 = 实际数据大小)
如何调整Block大小。目标:①最小化寻址开销,降到1%以下;②任务并发度和集群负载比较适中,作业运行速度较快
2,Block副本放置策略
副本1:放在Client所在节点上。对于远程Client,系统会随机选择机架和节点
副本2:放在与副本1不同的机架上
副本3:放在与副本2同一机架的不同节点上
副本N:在遵循相关原则的前提下,随机选择
节点选择原则
-避免选择访问负荷太重的节点
-避免选择存储空间太满的节点
-将副本分散在不同的机架上
3,Block文件
Block数据文件:DataNode本地磁盘中名为“blk_blockId”的Linux文件
Block元数据文件:DataNode本地磁盘中名为“blk_blockId_*.meta”的Linux文件,由一个包含版本、类型信息的头文件和一系列校验值组成
Block文件目录:DataNode启动时自动创建,无需格式化
1,元数据
目录/文件的基本属性(如名称、所有者)、Block相关信息(如文件包含哪些Block、Block放在哪些节点上)、DataNode相关信息
2,内存元数据
Active NameNode:最新的元数据(= fsimage + edits)
Standby NameNode:通过QJM定期(默认60s)同步AN的元数据
3,文件元数据
1)内存元数据持久化后生成的文件,包括edits和fsimage
2)edits(编辑日志文件)
记录文件系统的每一个变更操作,并定期瘦身
先写edits,再写内存
edits文件名通过“txid前后缀”标记所包含变更操作的范围(txid为变更操作的Transaction id)
3)fsimage(元数据检查点镜像文件)
检查点(Checkpoint):① 时间间隔(默认1小时),② 变更操作次数(默认100万)
在检查点定期对内存中的元数据进行持久化,生成fsimage镜像文件(速度较慢)
fsimage文件名标记出最后一个变更操作的txid,以下图为例,只要在内存中载入fsimage_19,然后执行edits_inprogress_20,即可还原出最新的元数据
在检查点,当fsimage生成后,删除“edits last txid < (fsimage last txid - txns)”的edits旧文件,从而实现定期瘦身(txns默认为100万)
4,edits与fsimage持久化(Hadoop 1.x)
基于远程合并的持久化
缺点
5,edits与fsimage持久化(Hadoop 2.x)
QJM(Quorum Journal Manager)共享存储系统
基于QJM的edits持久化
基于QJM的fsimage持久化
注意:
1,文件在客户端client被切分为块,块的大小一般由磁盘传输速率决定。太小的话增加寻址时间,太大的话磁盘传输时间大于定位块所需时间,导致程序处理数据较慢;
2,HDFS先写block后写元数据(edits日志落盘、写内存),这样才完成。因为block写入时间比较长,出错概率大,所以先写block;
3,从图中可以看出,数据是由DN依次传给其他DN的(8.1-》8.2),而不是由客户端传送给各个DN。这样可以避免客户端无效等待(等最慢的一个DN数据传输结束)
4,如何确认数据传输完毕?按照数据传输的倒序传递成功信号(9.1-》9.2)
下图为尚硅谷课程中关于HDFS写数据流程的介绍,可以相互补充:
下图为尚硅谷课程中关于HDFS读数据流程的介绍,可以相互补充:
注意,选择节点读取数据时有两个因素需要考虑:与客户端所在节点间距离,当前DN的负载情况。
安全模式是HDFS的一种特殊状态(只读),在该状态下HDFS只接收读请求,不接收写入、删除和修改等变更请求
安全模式是HDFS确保Block数据安全的一种保护机制
Active NameNode启动时,HDFS会自动进入安全模式,DataNode主动向NameNode上报可用Block信息,在达到安全标准前,HDFS一直处于“只读”状态
Block上报率:DataNode上报的可用Block个数 ÷ NameNode元数据记录的Block个数
当Block上报率 >= 阈值时,HDFS才能离开安全模式(默认阈值为0.999)
不建议手动强制退出安全模式
NameNode重启
NameNode磁盘空间不足
DataNode无法正常启动
Block上报率低于阈值
日志中出现严重异常
用户操作不当,如强制关机(特别注意)
在HDFS分布式文件系统中,NameNode是系统核心节点,存储各类元数据信息,并负责管理文件系统的命名空间和客户端对文件的访问。若NameNode发生故障,会导致整个Hadoop集群不可用,即单点故障问题。为了解决单点故障,Hadoop2.0中HDFS中增加了对高可用的支持。
在高可用HDFS中,通常有两台或两台以上机器充当NameNode,无论何时,都要保证至少有一台处于活动(Active)状态,一台处于备用(Standby)状态。Zookeeper为HDFS集群提供自动故障转移的服务,给每个NameNode都分配一个故障恢复控制器(简称ZKFC),用于监控NameNode状态。若NameNode发生故障,Zookeeper通知备用NameNode启动,使其成为活动状态处理客户端请求,从而实现高可用。
1,基于ZK实现Master选举
(1)AN或AN-ZKFC宕机,其创建的临时Znode被删除,但永久Znode(存储AN地址)被保留
(2)Watcher触发,通知所有SN-ZKFC去竞争创建临时Znode,SN1-ZKFC创建成功,SN1被选举为New AN
(3)其他SN-ZKFC在临时Znode上注册监听器,等待下一次选举
2,通过AN-Fencing防止脑裂
选主结束后,会创建临时Znode和永久Znode。如果ActiveNode异常,由于捆绑删除了临时Znode,但永久Znode仍会存在,所以当再次选主时发现有永久Znode存在,表明属于故障切换,就需要通过fencing避免脑裂。fencing后standBy节点才能进行状态转换
(4)若New-AN-ZKFC发现永久Znode,则通过RPC调用AN-ZKFC的服务,将AN从Active切换为Standby
(5)若步骤④失败,则New-AN-ZKFC直接调用SSL命令(或者执行自定义Shell脚本),Kill AN进程
(6)若步骤④⑤均失败,则需要人工干预
(7)AN-Fencing成功后,New-AN-ZKFC将New AN从Standby切为Active,并正式对外服务(HDFS只读)
3,基于QJM实现元数据恢复
(8)New AN从QJM edits中下载最新的(≤60s)变更操作,并在内存中执行一遍,即可恢复
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。