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

已得到原博主转载允许


推荐阅读
  • 本文深入探讨了IO复用技术的原理与实现,重点分析了其在解决C10K问题中的关键作用。IO复用技术允许单个进程同时管理多个IO对象,如文件、套接字和管道等,通过系统调用如`select`、`poll`和`epoll`,高效地处理大量并发连接。文章详细介绍了这些技术的工作机制,并结合实际案例,展示了它们在高并发场景下的应用效果。 ... [详细]
  • 本文提供了 RabbitMQ 3.7 的快速上手指南,详细介绍了环境搭建、生产者和消费者的配置与使用。通过官方教程的指引,读者可以轻松完成初步测试和实践,快速掌握 RabbitMQ 的核心功能和基本操作。 ... [详细]
  • IIS 7及7.5版本中应用程序池的最佳配置策略与实践
    在IIS 7及7.5版本中,优化应用程序池的配置是提升Web站点性能的关键步骤。具体操作包括:首先定位到目标Web站点的应用程序池,然后通过“应用程序池”菜单找到对应的池,右键选择“高级设置”。在一般优化方案中,建议调整以下几个关键参数:1. **基本设置**: - **队列长度**:默认值为1000,可根据实际需求调整队列长度,以提高处理请求的能力。此外,还可以进一步优化其他参数,如处理器使用限制、回收策略等,以确保应用程序池的高效运行。这些优化措施有助于提升系统的稳定性和响应速度。 ... [详细]
  • ZeroMQ在云计算环境下的高效消息传递库第四章学习心得
    本章节深入探讨了ZeroMQ在云计算环境中的高效消息传递机制,涵盖客户端请求-响应模式、最近最少使用(LRU)队列、心跳检测、面向服务的队列、基于磁盘的离线队列以及主从备份服务等关键技术。此外,还介绍了无中间件的请求-响应架构,强调了这些技术在提升系统性能和可靠性方面的应用价值。个人理解方面,ZeroMQ通过这些机制有效解决了分布式系统中常见的通信延迟和数据一致性问题。 ... [详细]
  • MongoDB Aggregates.group() 方法详解与编程实例 ... [详细]
  • MySQL:不仅仅是数据库那么简单
    MySQL不仅是一款高效、可靠的数据库管理系统,它还具备丰富的功能和扩展性,支持多种存储引擎,适用于各种应用场景。从简单的网站开发到复杂的企业级应用,MySQL都能提供强大的数据管理和优化能力,满足不同用户的需求。其开源特性也促进了社区的活跃发展,为技术进步提供了持续动力。 ... [详细]
  • 深入理解Spark框架:RDD核心概念与操作详解
    RDD是Spark框架的核心计算模型,全称为弹性分布式数据集(Resilient Distributed Dataset)。本文详细解析了RDD的基本概念、特性及其在Spark中的关键操作,包括创建、转换和行动操作等,帮助读者深入理解Spark的工作原理和优化策略。通过具体示例和代码片段,进一步阐述了如何高效利用RDD进行大数据处理。 ... [详细]
  • 在Python 3环境中,当无法连接互联网时,可以通过下载离线模块包来实现模块的安装。具体步骤包括:首先从PyPI网站下载所需的模块包,然后将其传输到目标环境,并使用`pip install`命令进行本地安装。此方法不仅适用于单个模块,还支持依赖项的批量安装,确保开发环境的完整性和一致性。 ... [详细]
  • Linux学习精华:程序管理、终端种类与命令帮助获取方法综述 ... [详细]
  • PJSIP 编译与开发指南:深入解析 PJSIP 库的应用与优化
    PJSIP 编译与开发指南:深入解析 PJSIP 库的应用与优化 ... [详细]
  • Elasticsearch 嵌套调用中动态类导致数据返回异常分析与解决方案 ... [详细]
  • 利用Jenkins与SonarQube集成实现高效代码质量检测与优化
    本文探讨了通过在 Jenkins 多分支流水线中集成 SonarQube,实现高效且自动化的代码质量检测与优化方法。该方案不仅提高了开发团队的代码审查效率,还确保了软件项目的持续高质量交付。 ... [详细]
  • 在探索 Unity Shaders 的过程中,我逐渐意识到掌握 OpenGL 基础知识的重要性。本文将详细介绍 OpenGL 的核心概念和基本操作,帮助读者从零开始理解这一图形编程技术。通过实例和代码解析,我们将深入探讨如何利用 OpenGL 创建高效的图形应用。无论你是初学者还是有一定经验的开发者,都能从中受益匪浅。 ... [详细]
  • DNS解析流程详解
    在网络通信中,大多数数据交换依赖于TCP/IP协议,该协议以IP地址为基础。因此,计算机在互联网上进行通信时,主要通过如“202.96.134.133”这样的IP地址来识别目标设备。然而,为了提高用户体验和便于记忆,DNS(域名系统)应运而生,将易于理解的域名转换为IP地址,确保高效且准确的网络连接。本文详细解析了DNS解析的整个流程,包括域名查询、缓存机制及递归解析等关键环节,帮助读者深入了解这一核心网络技术。 ... [详细]
  • 利用 Python Paramiko 库在远程服务器上高效执行 Shell 脚本的方法与技巧 ... [详细]
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社区 版权所有