随便说说HDFS(Hadoop Distributed File System)

HDFS

Hadoop Distributed File System

NameNode

作为HDFS的核心、大脑,NameNode负责记录文件的元数据与Block块及其副本存储的DataNode的位置信息。

由于NameNode在一个HDFS集群中仅有一个,且访问频率高(每次读写操作都需要去访问它),所以NameNode将数据存放在内存中,加快访问速度。

持久化

由于数据都存放在内存中,所以就需要进行持久化操作,防止NameNode突然宕机而导致内存中的数据丢失,HDFS使用了两种策略进行内存的记录。

EditsLogs

以操作日志的形式记录

优点

实时性高,完整性强

缺点

恢复速度慢,需要NameNode一条一条去执行操作

FsImage

以镜像文件的形式将NameNode中的数据存在磁盘中

优点

恢复速度快

缺点

生产镜像的过程慢,实时性差,完整性差

两种的操作之间的优缺点互补,HDFS将这二者进行了结合,具体方式在SecondNameNode中会讲解

DataNode

存储文件的Block文件(整个文件的某一块)及其校验数据,并定时向NameNode发送心跳信息与当前结点的一些Block信息。

负责结点之间副本的复制。

SecondNameNode

在非HA模式下,SecondNameNode只有一个,只负责去帮助NameNode做合并FsImage + EditsLog成一个新的FsImage这件事而在NameNode宕机后也不顶替NameNode工作

工作流程

  1. 定期询问NameNode需不需要合并数据
  2. 需要的话,拷贝NameNode上的FsImage与EditsLog到2NN中
  3. 将FsImage加载到内存代替NameNode去执行EditsLog
  4. 生成新的FsImage,并持久化到磁盘上
  5. 将新的FsImage拷贝回NameNode,并替换掉旧的FsImage
  6. 此时可以将旧的EditsLog删掉,因为EditsLog中的数据已经被持久化到镜像FsImage中了

安全模式

  • 启动(重启)NameNode时,进入安全模式,将本地的FsImage加载到内存中,再将EditsLog的内容进行执行后,再将内存中的FsImage持久化到磁盘上,删除旧的EditsLog
  • 不进行Block的复制
  • 接受来自DataNode的心跳与相应的Block信息,当Block的副本数达到设定值,则代表该Block副本安全
  • 当达到副本安全的Block的数量达到总数量的一定百分比时,等待30s后退出安全模式
  • 并确定哪些块未达到副本安全,开始以副本放置策略增加副本数

HDFS写流程

Block的副本放置策略

  • 第一个副本:若Client在集群内,则放置在本机的DataNode上;若在集群外部,则随机选一台空闲(磁盘不太满,CPU不太忙)的DataNode
  • 第二个副本:放置在不同于第一个副本的不同机架的DataNode上
  • 第三个副本:与第二个副本相同机架的节点;
    • 为什么不是和第一个副本相同机架?因为是HDFS写流程是流式传输的机制,见下文具体流程
  • 剩下的副本:随机结点

写流程详解

  1. 假如Client要写一个大的文件(大于64G),刚好需要分为多个Block(64G)
  2. Client向NameNode登记元数据信息
  3. NameNode检查元数据是否合法
  4. Client向NameNode请求第一个Block的传输
  5. NameNode以Block的副本放置策略返回一个DataNode的列表,以机架的路由距离依次排序
  6. Client与第一个DataNode建立起一个pipeline的通道,第一个再与第二个DataNode建立起一个pipeline的通道,第二个再与第三个DataNode建立起一个pipeline的通道……
  7. Client再将Block切分成packet(64KB),并使用chunk(512B) + chunkSum(4B)填充,Client把packet放在DataQueue中等待发送
  8. 第一个DataNode收到一个Packet时,保存到本地并发给第二个DataNode -> 第二个DataNode收到一个Packet时,保存到本地并发给第三个DataNode
  9. 在此过程中,上游同时发一个Packet给下游 ——(类比生活中的流水线,结论:流式也是变种的并行计算)
  10. 而这个流水线过程可能某一个结点会发生传输失败,所以NameNode登记的Block信息并不以第一次传输给Client的为准,而是以DataNode的每次心跳传输给NameNode本机上的Block信息为准。
  11. 当一个Block传输完毕后,DataNode自动汇报本机上的Block信息,Client也可以开始下一个Block的传输,这两个操作也是并行(互不影响的)。

HDFS读流程

读流程详解

  1. Client需要去读某一个文件时,首先去NameNode取出对应的元数据与对应的多个块及其副本的位置(FileBlockLocation)
  2. 每个块中的副本存储在不同的DataNode,DataNode按照机架距离排序,首先先去访问机架距离较近的位置去下载文件
  3. Client可以选择只读(下载)其中的一块或者多块数据并校验数据完整性;且也可以并行读取多块数据,相互之间不会被干扰

并行计算的核心

  • HDFS支持Client给出对应的offset去自定义地连接哪些DataNode的Block,自定义获取数据
  • 这个是支持计算层的分治,并行计算的核心

你可能感兴趣的:(Hadoop,hadoop,java,hdfs,大数据,数据库)