Hadoop之HDFS基础理论
Hadoop__HDFS

1. HDFS保存文件过程
1.1. 文件切块(Block)
1.2. HDFS将Block备份(副本replication 默认为3个)
2. HDFS特点
2.1. 存储超大文件(切块)
2.2. 快速检测故障并应对(心跳)
2.3. 数据节点高可用(副本)
2.4. 可动态构建(随时增加删除节点)
2.5. 一次写入多次读取
2.6. 不支持事务
2.7. 不建议存储小文件
3. HDFS组件分类
3.1. Block
3.1.1. 大小
· 2.X版本中默认为128M
· 可以通过 dfs.blocksize(hdfs-site.xml)属性(字节)来设置Block的大小
· 灵活切割
• 文件超过128M就切快,文件小于128M有多少存多少
• 129M的文件,128M作为一个Block存储起来,余下的1M作为另一个Block
3.1.2. 为什么要切块
· 存储大文件
· 快速备份
3.1.3. 副本数量
· 在完全分布式下,一个Block三个备份
· 在伪分布式下,一个Block一个备份
3.1.4. Block存储
· 可能存储在相同机器节点或者机器不节点上
3.1.5. 编号ID
· 每一个Block都有一个全局递增BlockID
3.2. 元数据
3.2.1. 基本特征
· 内容
• 对上传数据的描述
• 文件存储路径
• 文件操作权限
• 文件副本数量
• 文件和Block关系(切分为几块,文件大小,Block大小)
• Block与DataNode映射关系
· 格式
• FileName replicas block-Ids id2host
例如: /test/a.log,3,{b1,b2},[{b1:[h0,h1,h3]},{b2:[h0,h2,h4]}]
· 大小
• 每一条大概150B
· 存储位置
• 内存
• 用于快速查询
• 磁盘
• 持久化文件位置
• NameNode节点下的磁盘空间
• 默认:/temp路径下 (/tmp/dfs/name/current)
• 配置:core-site.xml 文件中的 dfs.tmp.dir属性
• 持久化文件分类以及作用
• edits_inprogress_XXX
• 记录所有操作
• edits_XXX
• 记录写操作
• fsimage_XXX
• NameNode内存数据快照
• 作用
• 用于崩溃回复数据持久化
3.2.2. 内存和持久化文件更改先后顺序
· 问题描述:为何接受写操作后要先修改磁盘Edit文件而不是更改内存
· 问题答案:更改内存后,在数据写入磁盘前有可能会发生机器宕机,数据此时可能会不一致
3.2.3. 写操作的处理
· 图解工作流程
· *1.NameNode将接受到的写操作记录到edits_inprogress中
*2.记录成功后修改内存中的元数据
*3.修改成功后返回修改成功信号
*4.fsimage一定条件下更新数据
3.2.4. 镜像文件更新问题
· 问题描述
由于fsimage的持久化是定时执行的,所以edits文件和fsimage文件存在数据不一致的问题
· 解决方案:定时更新fsimage
• 更新流程
• 1.将edits_inprogress文件滚动为edits_xxx文件
• 2.将edits_XX文件转化为命令执行到fsimage中
• 更新条件
• 时间
• 周期性更新
• 缺省
• 3600s一小时
• 配置
• core-site.xml
fs.chechpoint.period
• 空间
• edist_inprogress文件内容(初始为1M)到达指定大小后会触发更新
• 缺省
• 64M
• 配置
• core-site.xml
fs.checkpoint.size
• 强制更新
• 命令:Hadoop dfsadmin -rollEdits
• 重启更新
• NameNode 重新启动的时候会触发更新(少见)
• 更新结果
• 会生成一个新的edits_inprogress文件
3.3. 节点分类
3.3.1. NameNode
· 作用
• 管理DataNode
• 存储元数据
· 启动NameNode时的安全模式
• 进入条件
• 集群启动
• 校验流程
• NameNode
• 1.将Edits文件中记录的操作更新到Fsimage镜像文件中
• 2.将Fsimage中的元数据加载到内存中
• 3.DataNode发送心跳信息给NameNode
• 4.NameNode收起了心跳后校验各个DataNode上Block的数据和备份数据,保证数据的完整性,如果数据丢失了要重新备份数据
• 5.如果有的DataNode无法心跳即为Lost NameNode会备份该DataNode的信息到另一个DataNode
• 注意要点
• 完成所有校验后才能退出安全模式对外服务
• 集群越大故障可能性越大处于安全模式下的时间越久
• 强制退出命令
• Hadoop dfsadmin -safemode leave
• 有可能会由于数据丢失,无法找回副本,试图恢复数据而导致HDFS久处安全模式不退出,会一直重写校验数据,超过一定时间后强制退出安全模式
· DataNode和NameNode沟通的心跳机制
• 原理
• RPC请求发送心跳
• 心跳方向
• DataNode->NameNode
• 心跳信息
• 当前DataNode中的Block信息(BlockID组成的队列)
• 当前DataNode节点状态信息
• 心跳间隔
• 缺省3s
• 配置:hdfs-site.xml
dfs.heartbeat.interval
• 节点丢失(Lost)
• 问题发生
• 在指定时间(默认时间10mins/200次心跳)内没有收到心跳(网络问题),就会认为该节点Lost
• 数据处理
• NameNode会将Lost节点的数据迁移到另一个DataNode节点上,保证集群中Block数量足够
· 高可用的NameNode
• 允许分布式中存在两台NameNode
• 机制
• 舍弃机制
• HD2.0版本 完全分布式只能有1一个NN
• NameNode是HDFS集群中的效率瓶颈
• 加强NameNode配置
• 联邦Hdfs
• DN 对应一类 数据
• 一类DataNode 对应一个NameNode
• 缺陷
• 目录结构固化
• 一个访问路径对应一个节点
3.3.2. DataNode
· DataNode副本放置策略
• 完全分布式默认3个
• 有固定位置的副本
• 第一副本
• 内部上传数据
• 哪个DataNode上传到NameNode的就保存在哪个DataNode上(DataNode作为客户端上传数据给NameNode)
• 外部上传数据
• 找相对空闲(空间)DataNode来存储副本
• 第二副本
• 2.7之前
• 第二副本放置在第一副本不同机架节点上
• 2.7之后
• 第二副本放置在与第一副本相同的机架节点上
• 第一第二副本已经形成了数据的保证
第二第三副本避免跨机架传输数据以提高速度
• 第三副本
• 其他副本
• 往空闲节点上存放
• 伪分布式节点副本只能有1个
• 第二第三副本有特定的位置但是当前只有一个节点
如果设置副本数量 >1 会一直保持在安全模式下 (找不到数据)
· 当前DataNode节点状态
• 服役
• 正在工作的节点
• 预服役
• 添加到白名单
• 预退役
• 将数据备份到其他节点
• 不再存储数据
• 添加到黑名单中
• 退役
• 不工作
3.4. NameNode