热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

HDFS基础知识与数据读写机制详解

本文详细介绍了HDFS的基础知识及其数据读写机制。首先,文章阐述了HDFS的架构,包括其核心组件及其角色和功能。特别地,对NameNode进行了深入解析,指出其主要负责在内存中存储元数据、目录结构以及文件块的映射关系,并通过持久化方案确保数据的可靠性和高可用性。此外,还探讨了DataNode的角色及其在数据存储和读取过程中的关键作用。

1:架构

2:角色功能

2.1:Namenode


  • 完全基于内存存储元数据、目录结构、文件block的映射
  • 需要持久化方案来保证数据可靠性
  • 提供副本放置策略

2.2:Datandode


  • 基于本地磁盘存储block(文件的形式)
  • 并保存block的校验和数据,保证block的可靠性
  • 与NameNode保持心跳,汇报block列表状态

注意:


  • 一个文件上传完后块的大小不能改变,但是副本数可以改变
  • 阿里的推荐:一个集群最好不要超过5k台–网络通信会不好管
  • 往内存放的存储组件:hbase、namenode、elasticsearch、redis;这些都需要持久化- 方案保存数据可靠性
  • hdfs并没有帮我们存数据,而是起到一个管理映射的作用
  • block的校验和 是用来算文件是否完整,是否被破坏

3:元数据的持久化


  • 任何对HDFS元数据产生修改的操作,NameNode都会使用一种称为EditLog的事务日志记录下来
  • 使用FSImage存储内存所有的元数据状态
  • 使用本地磁盘保存EditLog和FSImage
  • EditLog具有完整性,数据丢失少,但恢复速度慢,并有体积膨胀风险
  • FSImage具有恢复速度快,体积与内存数据相当,但不能实时保存,数据丢失多
  • NameNode使用了FSImage+Editlog整合的方案;滚动的将增量的EditLog更新到FSImage,以保证更近时点的FSImage和更小的EditLog体积

问题

那么,FSImage时点是怎么滚动更新的!?

如果由NN,8点溢写,9点溢写。。。。太耗NN的CPU/IO了

寻求办法就是找一台机子来做 -----SNN(SecondaryNameNode)

4:安全模式

NN存元数据有文件的属性、每个块存在哪个DN上

在持久化的时候,文件属性会持久化,但是文件的每一个块位置信息不会持久化 ,如果持久化了的话,下次服务重启恢复数据的时候,DN挂掉就会造成块的位置信息错误,从而丢失数据。那么应该怎么办呢?

分布式时代讲究的就是数据一致性!!

NN会等,等DN,因为DN会与他建立心跳,汇报块信息!!从而保证块位置信息等是最新的,这个等的过程NN会进入安全模式


  • NN启动后会进入一个称为安全模式的特殊状态
  • 处于安全模式的NN是不会进行数据块的复制的
  • NN从所有DN接受心跳信号和块状态报告
  • 每当NN检测确认某个block的副本数目达到这个最小值,那么该数据块就会被认为是副本安全的(safely replicated)
  • 在一定百分比(参数可配置)的数据块被NN检测确认安全之后(加上一个额外的30s等待时间),NN就会退出安全模式
  • 接下来NN会确定哪些数据块的副本没有达到指定数目,并将这些数据块复制到其他的DN上

5:SecondaryNameNode


  • 在非HA模式下,SNN一般是独立的节点,周期完成对NN的EL向FI合并,减少EL大小,减少NN启动时间
  • 根据配置文件设置的时间间隔fs.checkpoint.period默认3600秒
  • 根据配置文件设置EL的大小fs.checkpoint.size,规定EL文件的最大默认值为64M

他的出现解决了3中的问题!

6:副本放置策略

Hadoop2.x中放置策略如下

第二个副本放在与第一个副本不同机架中的服务器上,(而Hadoop1.x中第二个副本默认放在第一个副本同机架上了,2.x为了防止副本数为2而导致副本丢失的情况,特意将第二个机架做如此调整)

第三个副本放在与第二个副本在一块的机架下

因为在同一个交换机中,网速快。

放在其他机架,就会有网络资源消耗

7:写流程

如下图是某一时间点,客户端在传某一文件的一个块的三个副本的时刻


  • Client和NN连接创建文件元数据
  • NN会判定元数据是否有效,比如文件目录是否存在等等
  • NN给Client发送副本放置策略,返回一个有序的DN列表
  • Client跟DN通信,建立PipeLine连接
  • Client将块切分成packet(64KB),并使用chunk(512B)+chunksum(4B)填充
  • Client将packet放入发送队列dataqueue中,并向第一个DN发送
  • 第一个DN收到packet后本地保存并发送给第二个DN
  • 第二个DN收到packet后本地保存并发送给第三个DN
  • 这一过程中,上游节点同时发送下一个packet
  • 生活中类比工厂的流水线,结论:流式其实也是变种的并行计算
  • HDFS用这种传输方式,副本数对于Client是透明的
  • 当block传输完成,DN们各自向NN汇报,同事Clietn继续传输下一个block
  • 所以Client的传输和block块的汇报也是并行的

Client跟DN通信,建立PipeLine连接

8:读流程


  • 为了降低整体的带款消耗和读取延时,HDFS会尽量让读取程序读取离他最近的副本
  • 如果在读取程序的同一个机架上有一个副本,那么就读取该副本
  • 如果一个HDFS集群跨越多个数据中心,那么客户端也将首先读取本地数据中心的数据
  • 语义:下载一个文件:

- Client 和NN交互文件元数据信息来获取fileBlockLocation

- NN会按距离策略排序返回

- Client尝试下载block并校验数据完整性


  • 语义:下载一个文件其实是获取文件的所有block元数据,那么获取某些block也应该成立的(是子集操作)

- HDFS支持Client输出文件的offset自定义连接哪些block的DN,自定义来获取某些数据

- 这个是支持计算层的分治思想,并行计算的核心

————————————————

原文链接:https://blog.csdn.net/qq_37865420/article/details/106364463

已得到原博主转载允许


推荐阅读
author-avatar
北人南漂记
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有