HDFS相关基础知识

NameNode详情

存着元数据,元数据包括 目录树和DataNode信息池

NameNode职责

  1. 响应客户端的请求
  2. 维护元数据

DataNode职责

  1. 存储和管理用户的文件块数据
  2. 定期向NameNode汇报自身所持有的block信息(心跳机制)

读写流程

写流程

在这里插入图片描述

  1. client向NameNode请求写入数据(请求信息包括:上传的文件夹,文件名等)
  2. NameNode检查目录树,响应可以上传
  3. client解封文件成块(block),请求上传第一个block,请NameNode返回可以存储的DataNode列表
  4. NameNode查询DataNode信息并返回可以存储的DataNode列表(dn1,dn2,dn3)

首先就近选择一台
第二台优选另一个机架上的DataNode
第三台就在本机架上随机选一台 \

  1. client向DataNode发出数据请求,建立pipline(client->dn1->dn2->dn3)
  2. DateNode响应client(ack),pipline建立成功 (dn3->dn2->dn1->client)
  3. client开始向DataNode写入第一个block

这里会把一个block分成一个个packet(64k),依次在dn1,dn2,dn3中写入缓存(逐级传输和响应队列来等待传输结果,队列响应完成之后返回给client),落地到磁盘的时候会校验写入的数据chunk(512Byte)

  1. 开始写下一个block,直到的全部写完

读流程

在这里插入图片描述

  1. client向NameNode请求读取文件(请求信息包括:文件路径等)
  2. NameNode检测元数据,看路径是否存在,如果存在则获取文件的元信息

元信息: blockID以及对应的DN列表 block-01:dn1,dn1,dn3;block-02:dn1,dn2,dn3

  1. NameNode返回元数据信息给client
  2. client收到元信息后选取一个网络位置最近的DataNode,依次请求每个数据块,client首先要检验文件是否损坏,如果损坏,client会选取另外的DataNode请求
  3. DataNode与client建立socket连接,传输对应的数据块,数据以packet为单位依次写入client中的缓存,合并后落地到磁盘

HDFS启动流程

NameNode在磁盘上两类文件组成

fsimage文件:保存文件系统至上一次checkpoint位置目录和文件的元数据
edits文件:保存文件系统从上次checkpoint起对hdfs的所有操作记录日志信息 \

首次安装格式化(format)主要作用是在本地文件系统生成fsimage文件。

首次启动hdfs过程:

启动namenode:读取fsimage,生成内存中元数据镜像
启动datanode:向namenode注册,向name发送blockreport,启动成功后client可以对HDFS操作

一般情况下启动HDFS

  1. 读取fsimage元数据镜像文件,加载到内存。还原了上次checkpoint之前的元数据(包括目录结构,文件大小,块的大小,块的ID等信息),不包含块的存储位置信息
  2. 读取edits文件,加载到内存,此时还原了上次checkpoint直到集群停止之间的元数据,不包含块的存储位置,(至此namenode还原的元数据唯一缺失的就是块的存储位置)
  3. datanode启动后,向namenode注册,向namenode发送blockreport(发送自己所管理的块和块的id,)namenode根据块的id还原块的存储位置
  4. 在blockreport结束之后,集群会判断datanode的启动数量(默认0),丢失的块的占比(默认0.999f),是否满足退出安全模式的条件,如果满足30秒之后退出安全模式,安全模式下namenode会删除多余的块,会复制低于副本数的块

NameNode和SecondaryNameNode的工作机制

在这里插入图片描述

  1. client向NamenNode发起对元数据镜像增删改的请求
  2. NameNode记录操作日志,更新滚动日志
  3. NameNode在内存中对数据镜像进行操作
  4. Secondary Namenode通知NameNdoe,准备执行checkpoint
  5. NameNode正在滚动edits日志文件
  6. Secondary Namenode从NameNode下载滚动后的edits和fsimage文件
  7. Secondary Namenode读取fsimage和edits的数据在内存进行合并(checkpoint)
  8. 将合并后的元数据系列化到磁盘生成 fsimage.checkpoint镜像文件
  9. 拷贝fsimage.checkpoint到NameNode,将其重命名为fsimage成为了最新的镜像文件,同时清除旧的edits文件(不清除的话edits会越来越大,导致namenode启动变慢)

NameNode调用getMeteData()方法用于给client返回元数据信息
调用updataMetData()方法更新内存中的元数据信息

checkpoint操作的触发条件配置参数(hdfs-site.xml)

dfs.namenode.checkpoint.check.period=60  #检查触发条件是否满足的频率,60秒
		dfs.namenode.checkpoint.dir=file://${hadoop.tmp.dir}/dfs/namesecondary  #secondary namenode的本地工作目录
		dfs.namenode.checkpoint.max-retries=3  #最大重试次数
		dfs.namenode.checkpoint.period=3600  #两次checkpoint之间的时间间隔3600秒
		dfs.namenode.checkpoint.txns=1000000 #两次checkpoint之间最大的操作记录

DataNode工作机制

在这里插入图片描述

  1. 一个数据块在DataNode上以文件形式存储在磁盘上,包括两个文件,一个数据本身,一个是元数据包括数据块的长度,块数据的校验以及时间戳
  2. DataNode启动后向NameNode注册,通过后,周期性(1小时)向NameNode上报所有块的信息
  3. 心跳是每3秒一次,心跳返回结果带有NameNode给该DataNode的命令(如复制块数据到另一台机器,或删除某个数据块),如果超过10分钟没有收到某个DataNoe的心跳,则认为该节点不可用
  4. 集群运行中可以安全加入和退出一些机器

注意

1个block(128M)–> 1条metadata(150Byte) 1G数据 --> 1.2k 1T --> 1.2M 1P --> 1.2G 50P --> 60G