分布式文件系统

64 阅读9分钟

单机处理大数据问题:因为内存一般较小,而处理数据需要从磁盘取数据,所以性能瓶颈一般在 IO 上 以下这些点是学习大数据技术时需要关心的重点:

  • 分而治之
  • 并行计算
  • 计算向数据移动
  • 数据本地化读取

HDFS

存储模型

  1. 文件线性按字节切割成块(block),具有 offset,id
  2. 文件与文件的 block 大小可以不一样
  3. 一个文件除最后一个 block,其他 block 大小一致
  4. block 的大小依据硬件的 I/O 特性调整
    1. 每个版本对支持的 I/O 有提升或是调整,因为磁盘是在进步的,但是如果 Block 设置过大,在MapReduce 任务中,Map或者Reduce任务的个数 如果小于集群机器数量,会使得作业运行效率很低
    2. 在 1.X 时,一个块默认是 64MB 大小
    3. 在 2.X 时,一个块默认是 128MB 大小
    4. 在 3.X 时,一个块默认是 256MB 大小
  5. block 被分散存放在集群节点中,具有位置(location),用来记录 block 在哪,以此用来还原
  6. block 具有副本,没有主从概念,副本不能出现在同一节点,副本之间没有主从概念
  7. 副本是满足可靠性和性能的关键
    1. 性能的关键:在一个文件会被多个程序计算这个文件的副本,如果副本足够的话,别的程序计算不需要从别的节点拉取这个文件,计算向数据移动
  8. 文件上传可以指定 block 大小和副本数,上传后只能修改副本数
  9. 一次写入多次读取,不支持修改数据
    1. 因为每个块基本上占用的空间是固定的,如果修改会导致后续的文件进行重新计算偏移量与切割
  10. 支持追加数据

架构设计

  • HDFS 是一个主从(Master/Slaves)架构
  • 由一个 NameNode 和一些 DataNode 组成
  • 面向文件包含:文件数据(data)和文件元数据(metadata)
  • NameNode 负责存储和管理文件元数据,并维护了一个层次级的文件目录树,要存储或读取文件数据需要先经过 NameNode
  • DataNode 负责存储文件数据(block 块),并提供 block 的读写
  • DataNode 与 NameNode 维持心跳,并汇报自己持有的 block 信息
  • Client 和 NameNode 交互文件元数据,和 DataNode 交互文件 block 数据

角色功能

NameNode

  • 完全基于内存存储文件元数据、目录结构、文件 block 的映射,原因:所有存储与读取都会经过 NameNode ,所以一定要快
  • 需要持久化方案保证数据可靠性
  • 提供副本放置策略
元数据持久化

  注意:NameNode 持久化不包含每个文件的块的位置,因为文件块的位置由 DataNode 主动进行上报,主要是解决一致性问题,比如:从 EditLog 和 FsImage 中得到块的信息后,对应的 DataNode 不存在,那么这个块信息就是个异常的。

  • EditsLog
    • 日志、体积大,完整性好 FsImage
    • 镜像、快照,体积小,有可能丢失一部分数据,记录少,能够更快的回滚 HDFS 使用的方式是:FsImage + EditsLog
    • 最近时点的 FsImage + 增量的 EditsLog
安全模式

NameNode 启动时:

  1. HDFS 搭建时会格式化,格式化操作会产生一个空的 FsImage,防止第二步读取时异常
  2. 当 NameNode 启动时,它从硬盘中读取 EditLog 和 FsImage
  3. 将所有的 EditLog 中的事务作用于内存中的 FsImage 上
  4. 并将这个最新版本的 FsImage 从内存中保存到本地磁盘上
  5. 然后删除旧的 EditLog,因为这个旧的 EditLog 已经作用在 FsImage上了

NameNode 启动后:

  1. 会进入一个被称为安全模式的特殊状态
  2. 处于安全模式的 NameNde 不会向 DataNode 发出任何数据块信息的复制或块删除的指令
  3. 在安全模式下,所有的 DataNode 会向 NameNode发送心跳信号和块状态报告
  4. 每当 NameNode 检测确认某个数据块的副本数目达到设置的最小值,那么该数据块就会被认为是副本安全(safely replicated)的
  5. 在一定时间比(可以配置)的数据块会被 NameNode 检测确认是安全之后,等待额外 30s NamNode就会退出安全模式状态
  6. 接下来会确定还有哪些数据块的副本没有达到指定数目,并将这些数据块复制到其他 DataNode 上
SecondaryNameNode(SNN)

Ha(high availability)模式没有 SecondaryNameNode ,HDFS 2.X 才有 Ha 模式

blog.csdn.net/sfiven7/art…

  • 在非 Ha (高可用)模式下,SNN 一般是独立的节点,周期的完成对 NameNode 的 EditLog 向 FsImage 合并,减少 EditLog 大小,减少 NameNode 启动时间
  • 根据配置文件设置的时间间隔 fs,checkpoint.period 默认 3600 秒
  • 根据配置文件设置的 EditLog 大小 fs.checkpoint.size,规定 edits 文件的最大值默认为 64MB,超过这个值就会进行
HDFS-HA 解决方案

HDFS-HA 模式概念

JournalNode 主从的职能:

  • 主:增删改查,同步给从
  • 从:查询,增删改的操作会传递给主
  • 主与从:过半数同步数据通过即可

DataNode

  • 建议不要超过 5000 台,网络的使用、通信等会对业务的访问造成影响
  • 基于本地磁盘存储 block(文件的形式)
  • 并保存 block 的校验和数据保存 block 的可靠性
  • 与 NameNode 保持心跳,汇报 block 列表状态

服务器有:塔式、机架、刀片3种。

HDFS 写原理

摘录自:读写原理
HDFS 如何保证数据的完整性呢?
HDFS 读写过程中的异常处理与恢复_datanode发生重启_午后的红茶meton的博客-CSDN博客   HDFS 的 Block 块比一般单机文件系统大得多,默认为 128M。HDFS 的文件被拆分成 block-sized 的chunk,chunk 作为独立单元存储。比 Block 小的文件不会占用整个 Block,只会占据实际大小。例如, 如果一个文件大小为 1M,则在 HDFS 中只会占用 1M 的空间,而不是 128M。

  • block:是文件传输的单位,文件分块上传,块的默认大小见:存储模型
  • pcket:是第二大的单位,是 client 向 DataNode 或 DataNode 的PipeLine 之间传数据的单位,默认是 64KB,由一个个 chunk 组成
  • chunk:是最小的单位,packet 是由一个个 chunk 组成,是 client 向 DataNode,或 DataNode 向 PipeLine 之间进行数据校验的基本单位,默认 512Byte,还带有一个校验和:checksum(4B),所以实际每个 chunk 写入 packet 的大小为 516Byte。

  1. 和 NameNode 交互
  2. NameNode 检查元数据文件的系统目录树
  3. 若系统目录树的父目录不存在该文件相关信息,返回客户端可以上传文件
  4. 请求上传第一个 block 数据块,以及数据块副本数量
  5. 触发副本放置策略,找到可用的数据节点,并对 DataNode 进行排序
  6. 将节点的 IP 地址返回给客户端
  7. 和排序的第一个 DataNode 建立 TCP 连接(Pipeline 管道),并把后续的 DataNode 传送给第一个 DataNode,然后和第二个 DataNode 建立 TCP 连接,以此类推
  8. 逐个返回建立完毕信息
  9. 客户端与 DataNode 建立数据传输流,开始发送数据包
  10. 客户端向 DataNode_01 上传第一个 Block 数据块,是以 Packet 为单位,发送数据块,所有的 Packet 依次传输
  11. Pipeline 反方向逐个发送 ACK
  12. 最终一个 block 传输完毕之后,继续下一个 block 传递

因为是流式的,DataNode_01 发送给 DataNode_02 之后,客户端还可以继续给DataNode_01 继续发送,一种变种的“并行” ,以此类推,会继续发送后续 block,直至传输完毕

Block块的N个副本的放置策略

www.cnblogs.com/bianqi/p/12…

  • 第一个副本放置:如果在集群内上传 1T 文件,就放置在该 DN 上。如果在集群外上传,则找一个磁盘空间足够、CPU 够用的节点。
  • 第二个副本:放置在和副本 1 不同机架的节点上;放置整个机架挂掉
  • 第三个副本:放在副本 2 相同机架的节点
  • 更多副本:随机机架
HDFS 读原理
  • 为了降低整体的带宽消耗与读延时,HDFS 会尽量让读取程序读取离它最近的副本
    • 如果在读取程序的同一个机架上有一个副本,那么就读取该副本
    • 如果一个 HDFS 集群跨越多个数据中心,那么客户端也将首先读取本地数据中心的副本
  • 下载文件可以不下载全部文件,可以只的某一 block 块
    • HDFS 支持 client 给出文件的 offset 自定义连接哪些 block 的 DataNode 自定义获取数据
    • 这个支持计算层分治、并行计算的核心

流程如下:

  1. 客户端向 NameNode 发起 RPC 请求,来获取请求文件 Block 数据块所在的位置
  2. NameNode 检测元数据文件,会视情况返回 Block 块信息或全部 Block 块信息,对于每个 Block 块,NameNode 都会返回该 Block 副本的 DataNode 地址
  3. 客户端会选取排序靠前的 DataNde 来依次读取 Block 块,每一个 Block 块都会进行 checkSum(完整性校验),若文件不完整,则客户端则会选取另外最近的 DataNode 进行读取,直到验证读取文件是完整的,则 Block 读取完毕

安装配置

基础设施

操作系统、环境、网络、必备软件

  1. 设置 IP 及主机名
  2. 关闭防火墙
  3. 设置 hosts 映射,一般使用 host 映射,真正执行的时候读取文件,转换成 IP 地址,在软件中引用的是名称而不是地址。所有软件引用该地址只需要修改 host 映射,解耦
  4. 时间同步,所有节点时间需要同步,不然做心跳时,可能认为有问题
  5. 安装 JDK
  6. 设置 SSH 免秘钥