我是靠谱客的博主 俊秀盼望,最近开发中收集的这篇文章主要介绍大数据学习随笔2.(HDFS理论基础)HDFS理论基础,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

HDFS理论基础

  • 思考:为什么需要开发HDFS?

    • 思路:开发hdfs肯定是为了更好地去支持分布式存储和计算。
      • 1.hdfs对于分布式中的分而治之,并行计算的支持
      • 2.hdfs对于分布式中的计算向数据移动的支持。
  • 存储模型

    • 文件线性按字节切割成块(block),有offset,id
    • 不同文件的块大小可以不一样
    • 同一个文件除了最后一个块,其他的块大小一致
    • block的块大小依照硬件到I/O调整。hadoop2.x默认块大小为128MB
    • block分散在集群的节点上,有自己的location信息。
    • block有副本机制(replication),没有主从概念,副本存在不同的节点上。
    • 副本是为了满足数据可靠性和计算性能
    • 文件上传可以指定block大小和副本数,上传后只能修改副本数(增加副本数)
    • 文件支持追加数据,不支持修改数据
  • 架构设计

    • hdfs是一个主从架构(Master/Slaves)
    • 主要由NameNode和DataNode组成
    • hadoop2.x支持两种集群模式:非高可用和高可用(HA)
      • 非高可用:由一个SecondaryNameNode对NameNode进行数据备份更新FsImage和EditLog。
      • 高可用(HA):2.x支持一个Active和一个StandyBy的NameNode组成
    • 高可用系统架构图
    • NameNode负责存储和管理文件元数据,并且维护了一个层次性类Linux的文件目录树
  • 角色功能

    • NameNode:
      • 完全基于内存存储文件元数据、目录结构、文件block的映射
      • 提供持久化方案保证数据可靠性
      • 提供副本放置策略
    • DataNode:
      • 基于本地磁盘存储block文件
      • 并保存block的校验和数据保证blcok的可靠性
      • 与NameNode保持心跳,汇报block列表状态
    • Client:
      • 与NameNode交互文件元数据
      • 与DataNode交互文件blcok数据
    • 次要角色:
      • zookeeper:负责NameNode的主备管理
      • zkfc:监控NameNode的状态,并且在zookeeper上注册NameNode的临时节点
      • JournalNode:负责主备节点的数据同步
  • 元数据持久化

    • tips:元数据持久化一般有两种方式:
      • 方式1:通过镜像、快照、序列化等备份的方式:定时备份。
        • 优点:恢复备份快。
        • 缺点:I/O慢,完整性较差
      • 方式2:日志文件的方式:记录实时发生的增删改查操作
        • 优点:完整性好
        • 缺点:加载恢复数据时间慢,占用空间
    • NameNode采用FsImage和EditLog两种方式结合的方式去做元数据的持久化。
      • 滚动将增量的EditLog更新到FsImage,以保证更近时点的FsImage和更小的EditLog体积
  • 安全模式

    • NameNode启动后会进入一个称为安全模式的特殊状态。
    • 处于安全模式下的NameNode是不会进行数据块的复制的。
    • NameNode从所有的DataNode接收心跳信号和快状态报告。
    • 每当NameNode检测确认某个数据块的副本数量达到最小值(dfs.namenode.replication.min),才能确认该数据块为安全的。
    • 在一定百分比(dfs.namenode.safemode.threshold-pct)的数据块呗NameNode检测确认安全之后(加上额外的30秒的等待时间),NameNode将退出安全模式。
    • 接下来,它会确认还有哪些数据块没有达到指定副本数量,并将这些数据块复制到其他DataNode上。
  • 副本放置策略

    • 第一个副本:放置在上传文件的DN上,若是集群外上传的,则随机挑选一台磁盘不太满,CPU不太忙的DN
    • 第二个副本:放置在和第一个副本不同的机架节点上
    • 第三个副本:放置在和第二个副本相同机架的节点上
    • 更多:随机
  • 读写流程

    • 写流程
      • client会先在NameNode上创建文件元数据
      • NameNode会校验元数据的正确性
      • NameNode会返回Block的副本放置策略,返回一个有序的DataNode列表
      • Client和DataNode建立Pipeline连接
      • Client将快切分成packet(64KB),并使用chunk(512B) + chunksum(4B)填充
      • Client将packet放到发送队列中,并想第一个DataNode发送
      • 第一个DataNode收到packet后本地存储根据DataNode列表向第二个DataNode发送
      • 第二个DataNode收到packet后本地存储根据DataNode列表向第三个DataNode发送
      • 这一个过程中,上游节点同时发送第二个pacjket
      • 当block传输完成,DataNode们会向NameNode汇报,同时Client继续传输下一个block
    • 读流程
      • 为了降低整体的带宽消耗和读取延时,HDFS会尽量让Client去读取离它最近的副本块。
      • Client和NameNode交互文件元数据回去fileBlockLocation
      • NameNode会根据距离策略排序返回
      • Client尝试下载block块并检验完整性
      • HDFs支持Client输出文件的offset自定义连接哪些block的DataNode,自定义获取数据
      • 这个特性支持计算层去并行计算各个block块的数据。
  • 结论:上述红色字体部分是hdfs对于计算层去分布式并行计算的文件存储层的支持。

最后

以上就是俊秀盼望为你收集整理的大数据学习随笔2.(HDFS理论基础)HDFS理论基础的全部内容,希望文章能够帮你解决大数据学习随笔2.(HDFS理论基础)HDFS理论基础所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(62)

评论列表共有 0 条评论

立即
投稿
返回
顶部