热门标签 | 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

已得到原博主转载允许


推荐阅读
  • 本文详细介绍了 Dockerfile 的编写方法及其在网络配置中的应用,涵盖基础指令、镜像构建与发布流程,并深入探讨了 Docker 的默认网络、容器互联及自定义网络的实现。 ... [详细]
  • MySQL缓存机制深度解析
    本文详细探讨了MySQL的缓存机制,包括主从复制、读写分离以及缓存同步策略等内容。通过理解这些概念和技术,读者可以更好地优化数据库性能。 ... [详细]
  • Hadoop入门与核心组件详解
    本文详细介绍了Hadoop的基础知识及其核心组件,包括HDFS、MapReduce和YARN。通过本文,读者可以全面了解Hadoop的生态系统及应用场景。 ... [详细]
  • Spring Cloud学习指南:深入理解微服务架构
    本文介绍了微服务架构的基本概念及其在Spring Cloud中的实现。讨论了微服务架构的主要优势,如简化开发和维护、快速启动、灵活的技术栈选择以及按需扩展的能力。同时,也探讨了微服务架构面临的挑战,包括较高的运维要求、分布式系统的复杂性、接口调整的成本等问题。最后,文章提出了实施微服务时应遵循的设计原则。 ... [详细]
  • 本文探讨了随着并发需求的增长,MySQL数据库架构如何从简单的单一实例发展到复杂的分布式系统,以及每一步演进背后的原理和技术解决方案。 ... [详细]
  • 58同城的Elasticsearch应用与平台构建实践
    本文由58同城高级架构师于伯伟分享,由陈树昌编辑整理,内容源自DataFunTalk。文章探讨了Elasticsearch作为分布式搜索和分析引擎的应用,特别是在58同城的实施案例,包括集群优化、典型应用实例及自动化平台建设等方面。 ... [详细]
  • 构建高性能Feed流系统的设计指南
    随着移动互联网的发展,Feed流系统成为了众多社交应用的核心组成部分。本文将深入探讨如何设计一个高效、稳定的Feed流系统,涵盖从基础架构到高级特性的各个方面。 ... [详细]
  • 本文介绍了Java并发库中的阻塞队列(BlockingQueue)及其典型应用场景。通过具体实例,展示了如何利用LinkedBlockingQueue实现线程间高效、安全的数据传递,并结合线程池和原子类优化性能。 ... [详细]
  • 1.如何在运行状态查看源代码?查看函数的源代码,我们通常会使用IDE来完成。比如在PyCharm中,你可以Ctrl+鼠标点击进入函数的源代码。那如果没有IDE呢?当我们想使用一个函 ... [详细]
  • 深入探讨CPU虚拟化与KVM内存管理
    本文详细介绍了现代服务器架构中的CPU虚拟化技术,包括SMP、NUMA和MPP三种多处理器结构,并深入探讨了KVM的内存虚拟化机制。通过对比不同架构的特点和应用场景,帮助读者理解如何选择最适合的架构以优化性能。 ... [详细]
  • 科研单位信息系统中的DevOps实践与优化
    本文探讨了某科研单位通过引入云原生平台实现DevOps开发和运维一体化,显著提升了项目交付效率和产品质量。详细介绍了如何在实际项目中应用DevOps理念,解决了传统开发模式下的诸多痛点。 ... [详细]
  • Spring Boot单元测试中Redis连接失败的解决方案
    本文探讨了在Spring Boot项目中进行单元测试时遇到Redis连接问题的原因及解决方法,详细分析了配置文件加载路径不当导致的问题,并提供了有效的解决方案。 ... [详细]
  • 优化Flask应用的并发处理:解决Mysql连接过多问题
    本文探讨了在Flask应用中通过优化后端架构来应对高并发请求,特别是针对Mysql 'too many connections' 错误的解决方案。我们将介绍如何利用Redis缓存、Gunicorn多进程和Celery异步任务队列来提升系统的性能和稳定性。 ... [详细]
  • 本文详细介绍了 Apache ZooKeeper 的 FileTxnLog 类中的 setPreallocSize 方法,并提供了多个实际应用中的代码示例。通过这些示例,读者可以更好地理解如何在不同场景下合理设置日志文件的预分配大小。 ... [详细]
  • 时序数据是指按时间顺序排列的数据集。通过时间轴上的数据点连接,可以构建多维度报表,揭示数据的趋势、规律及异常情况。 ... [详细]
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社区 版权所有