HDFS简易剖析

483 阅读4分钟

一、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工作流程

  • 描述:
      1. SNN执行checkpoint动作时,NN会停止使用当前的edit文件515-516,暂时将读写操作记录到一个新的edit文件517中。
      1. SNN将NN的fsimage 514和edits文件515-516远程下载到本地。
      1. SNN将fsimage 514加载到内存中,将edits文件515-516内容在内存中完整执行一次,创建一个新的fsimage文件516。
      1. SNN将新的fsimage 516推送给NN。
      1. NN接受到fsimage 516.checkpoint滚动为fsimage 516,新的edit17.new文件滚动为edit517,为最新文件。

HDFS_DownLoad

HDFS_Upload

namenode工作机制

datanode工作机制