HDFS简易剖析
一、HDFS主从架构
namenode :nn 名称节点
- 包含内容:
- 文件的名称
- 文件的目录结构
- 文件的属性(权限、副本数、创建时间)
- 一个文件被对应切割哪些数据块(包含副本数的块)--> 对应分布在哪些datanode
- 映射关系:blockmap(块映射)维护在内存中,nn是不会持久化存储这种映射关系。集群在启动和运行时,dn定期汇报blockreport给nn,然后在内存中动态维护这种映射关系。
- 作用:管理文件系统的命名空间,其实就是维护文件系统树的文件和文件夹
- 读写操作的保存:fsimage(镜像文件)、editlogs(编辑日志文件)
secondary namenode: snn 辅助名称节点
- 作用:把fsimage、editlog文件拿过来合并、备份,推送给nn。
- 早期为了解决nn单点故障(SPOF),因而增加一个snn,1小时或者1000000次读写的的checkpoint,虽然能够减轻单点故障的带来的数据丢失风险,但是我在生产上不使用snn,而是High Availability高可用。后续会详细介绍。
- checkpoint依据:
dfs.namenode.checkpoint.period 3600
dfs.namenode.checkpoint.txns 1000000
datanode:dn 数据节点
- 用来存储数据块 和 数据块(blk_XXX)的校验和(blk_XXX.meta)
- 每隔一定的时间去发送blockreport
- 依据:
dfs.blockreport.intervalMsec 21600000=6h
- 与namenode通信:
- 每隔3秒发送一次心跳包
- 每10次心跳发送一次块位置信息
- 作用:主要用作读写文件的数据块。
二、HDFS读写
- HDFS读写对用户而言是无感知的
- 写是output
- 读是input
HDFS写流程
- 描述:
- HDFS Client调用FileSystem.create(filePath)方法和namenode进行RPC通信。namenode去check这个文件是否存在,是否有权限创建该文件。检查通过后,创建一个新的文件,这时没有数据,不关联任何block。namenode根据文件大小、块大小、副本数,计算要上传多少块和对应在哪些datanode节点上。最终这个信息返回给客户端FSDataOutputStream对象。
- Client 调用客户端FSDataOutputStream对象的write方法,根据副本放置策略,将第一个块的第一个副本写到DN1,写完复制到DN2,写完再复制到DN3。当DN3写完,返回一个ack package确认包给DN2,DN2接收到ack加上自己写完,发送ack给DN1,DN1接收到ack加上自己写完,就发送ack给客户端FSDataOutputStream对象,告诉它第一个块三副本写完了。以此类推。
- 当所有的块全部写完,Client调用FSDataOutputStream对象的close方法,关闭输出流。调用FileSystem.complete方法 ,告诉namenode节点文件写成功。
HDFS读流程
- 描述:
- HDFS Client调用FileSystem.open(filePath)方法和与namenode进行rpc通信,返回该文件的部分或者全部的block列表也就是返回FSDataInputStream对象。
- Client调度FSDataInputStream对象的read方法,从第一个块的最近的DN节点进行读取,读取完成后check,通过后关闭与DN通信。假如没有通过,会记录块和DN的信息,下次如果读取自动略过此DN,从下一个DN读取。以此类推。然后从第二个块的最近的DN的进行读取,以此类推。假如当block的列表全部读取完成,文件还没结束,就调用FileSystem从NN获取下一批次的block列表。
- Client调用FSDataInputStream对象的close方法,关闭输入流。
三、SNN工作流程
- 描述:
-
- SNN执行checkpoint动作时,NN会停止使用当前的edit文件515-516,暂时将读写操作记录到一个新的edit文件517中。
-
- SNN将NN的fsimage 514和edits文件515-516远程下载到本地。
-
- SNN将fsimage 514加载到内存中,将edits文件515-516内容在内存中完整执行一次,创建一个新的fsimage文件516。
-
- SNN将新的fsimage 516推送给NN。
-
- NN接受到fsimage 516.checkpoint滚动为fsimage 516,新的edit17.new文件滚动为edit517,为最新文件。
HDFS_DownLoad
HDFS_Upload
namenode工作机制
datanode工作机制