HDFS原理剖析

1. HDFS工作机制

a. 概述

HDFS集群分为两大主要角色:namenodedatanode(secondarynamenode和client)
NameNode负责管理整个文件系统的元数据,并且负责相应客户端的请求
DataNode负责管理用户的文件数据块,并且通过心跳机制汇报给namenode
文件会按照固定的大小(dfs.blocksize)切成若干块后分布式存储在若干台DataNode上
每个文件可以有多个副本,并存放在不同的datanode上
datanode会定期向NameNode汇报自身所保存的文件block信息,而NameNode则会负责保存文件的副本数量
HDFS的内部工作机制对客户端保持透明,客户端请求访问HDFS都是通过向namenode申请进行


b. HDFS写数据流程

客户端要向HDFS写数据,首先要跟NameNode通信以确认可以写文件并获得接收文件block的datanode,然后,客户端按照顺序将文件逐个block传递给相应DataNode。并由接收到block的datanode负责向其他datanode复制block的副本





1)使用 HDFS 提供的客户端 Client,向远程的 namenode 发起 RPC 请求

2)namenode 会检查要创建的文件是否已经存在,创建者是否有权限进行操作,成功则会为文件创建一个记录,否则会让客户端抛出异常;

3)当客户端开始写入文件的时候,客户端会将文件切分成多个 packets,并在内部以数据队列“data queue(数据队列)”的形式管理这些 packets,并向 namenode 申请 blocks,获取用来存储 replicas 的合适的 datanode 列表,列表的大小根据 namenode 中 replication 的设定而定;

4)开始以 pipeline(管道)的形式将 packet 写入所有的 replicas 中。客户端把 packet 以流的 方式写入第一个 datanode,该 datanode 把该 packet 存储之后,再将其传递给在此 pipeline 中的下一个 datanode,直到最后一个 datanode,这种写数据的方式呈流水线的形式。 

5)最后一个 datanode 成功存储之后会返回一个 ack packet(确认队列),在 pipeline 里传递 至客户端,在客户端的开发库内部维护着"ack queue",成功收到 datanode 返回的 ack packet 后会从"data queue"移除相应的 packet。

6)如果传输过程中,有某个 datanode 出现了故障,那么当前的 pipeline 会被关闭,出现故 障的 datanode 会从当前的 pipeline 中移除,剩余的 block 会继续剩下的 datanode 中继续 以 pipeline 的形式传输,同时 namenode 会分配一个新的 datanode,保持 replicas 设定的 数量。 

7)客户端完成数据的写入后,会对数据流调用 close()方法,关闭数据流;

8)只要写入了 dfs.replication.min(最小写入成功的副本数)的复本数(默认为 1),写操作 就会成功,并且这个块可以在集群中异步复制,直到达到其目标复本数(dfs.replication 的默认值为 3),因为 namenode 已经知道文件由哪些块组成,所以它在返回成功前只需 要等待数据块进行最小量的复制。


c. HDFS读数据流程

客户端将要读取的文件路径发送给NameNode,NameNode获取文件的元信息(主要是block的存放位置信息)返回给客户端,客户端根据返回的信息找到相应datanode逐个获取文件的block并在客户端本地进行数据追加合并从而获得整个文件。




1)使用 HDFS 提供的客户端 Client,向远程的 namenode 发起 RPC 请求;

2)namenode 会视情况返回文件的全部 block 列表,对于每个 block,namenode 都会返回有该 block 拷贝的 datanode 地址;

3)客户端Client会选取离客户端最近的datanode来读取block;如果客户端本身就是datanode,那么将从本地直接获取数据;

4)读取完当前 block 的数据后,关闭当前的 datanode 链接,并为读取下一个 block 寻找最佳的 datanode;

5)当读完列表 block 后,且文件读取还没有结束,客户端会继续向 namenode 获取下一批的block 列表;

6)读取完一个 block 都会进行 checksum 验证,如果读取 datanode 时出现错误,客户端会通知 namenode,然后再从下一个拥有该 block 拷贝的 datanode 继续读。


2. NameNode工作机制

a. NameNode职责

负责客户端请求(读写数据请求)的响应
维护目录树结构(元数据的管理:查询和修改)
配置和应用副本存放策略
管理集群数据块负载均衡问题


b. NameNode元数据管理

WAL(Write ahead Log):预写日志系统,Log文件可以保存事物的执行情况。
NameNode对数据的管理采用了两种存储形式:内存和磁盘

内存中有一份完整的元数据,包括目录树结构、以及文件和数据块和副本存储的映射关系:



内存元数据,metadata(全部在内存中),在磁盘中也有一份。
数据历史操作日志文件:(可通过日志运算出元数据,存在磁盘中)
edits_0000000000000000198-0000000000000000199
数据预写操作日志文件:(存在磁盘中)
edits_inprogress_0000000000000000204
磁盘元数据镜像文件
fsimage_0000000000000000203


c. NameNode元数据存储机制

内存中有一份完整的元数据(内存 metadate)
磁盘有个“准完整”的元数据镜像(fsimage)文件
用于衔接内存metadata和持久化元数据fsimage之间的操作日志(edits)

d. 元数据的CheckPoint

每隔一段时间,会由secondary NameNode将NameNode上积累的所有edits和一个最新的fsimage下载到本地,并加载到内存进行merge(这个过程称为CheckPoint)


e. CheckPoint触发机制

dfs.namenode.checkpoint.check.period=60 ##检查触发条件是否满足的频率,60 秒


dfs.namenode.checkpoint.dir=file://${hadoop.tmp.dir}/dfs/namesecondary##以上两个参数做 checkpoint 操作时,secondary namenode 的本地工作目录dfs.namenode.checkpoint.edits.dir=${dfs.namenode.checkpoint.dir}


dfs.namenode.checkpoint.max-retries=3  ##最大重试次数


dfs.namenode.checkpoint.period=3600    ##两次 checkpoint 之间的时间间隔 3600 秒


dfs.namenode.checkpoint.txns=1000000   ##两次 checkpoint 之间最大的操作记录


f. CheckPoint附带作用

NameNode和SecondaryNamenode的工作目录储存结构完全相同,所以,当NameNode故障退出需要重新恢复时,可以从SecondaryNameNode的工作目录中将fsimage拷贝到NameNode的工作目录,以恢复NameNode的元数据。

3. DataNode工作机制

工作职责:
存储管理用户的文件块数据,定期向NameNode汇报自身所持的block信息(通过心跳信息上报)

<property>
    <!--HDFS集群数据冗余块的自动删除时长,单位ms,默认1小时-->
    <name>dfs.blockreport.intervalMsec</name>
    <description>Determines block reporting intercal in milliseconds.</description>
</property>



4. SecondaryNamenode工作机制

SecondaryNamenode的作用就是分担namenode的合并元数据的压力。所以在配置SecondaryName的工作节点是,一定切记,不要和NameNode处于同一节点上。

但事实上,只有普通分布式集群和伪分布式集群中才会出现SecondaryNamenode这个角色,在HA或者联邦集群中都不会在出现该角色,在HA和联邦集群都是有standby namenode承担。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值