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

hdfs读写流程_大数据笔记HDFS

1HDFS基础1.1NameNode文件fsimage:保存文件系统目录树信息以及文件与块的对应关系,每次namenode启动的时候,都会
89256179d91eb93fdedeb7539fa5b1b8.png
e9f2c427c9bf7e2f992331531712a5ce.png

1 HDFS 基础

1.1 NameNode

  1. 文件 fsimage:保存文件系统目录树信息以及文件与块的对应关系,每次namenode启动的时候,都会读取fsimage,将目录树信息装载到内存中。
  2. 文件 edits.log 日志:储存日志信息。在namenode启动后,所有对目录结构的增加,删除,修改等操作都会记录到edits.log文件中,不会同步记录到 fsimage

1.2 DataNode

  1. DataNode 存储数据按block 为单位读写的。blockhdfs读写数据的基本单位。大小从2.7.3版本开始后为128m。寻址时间(假设12ms)为传输时间(1.2秒)的1%为最佳,目前传输速率为100MB/s,传输大概(120M)。
  2. block为逻辑概念不真正存储数据,只是划分文件,一般副本为3个

1.3 Secondary NameNode

​ 工作流程: SecondaryNameNode 询问NameNode是否需要checkpoint。直接带回NameNode是否检查结果 , SecondaryNameNode请求执行checkpointNameNode滚动正在写的edits.log日志 , 将滚动前的编辑日志和镜像文件拷贝到SecondaryNameNode , SecondaryNameNode加载编辑日志和镜像文件到内存,并合并。 生成新的镜像文件fsimage.chkpoint , 拷贝fsimage.chkpointNameNode, NameNodefsimage.chkpoint重新命名成 fsimage 。主要是解决NameNode启动的时候,edits.log过大需要合并太久问题。

2 HDFS的读写流程

2.1 读流程:

HDFS 调用 open() 返回 FileSystem 调用 open() 返回 distributedFilesystem 调用 DFSInputStream() 返回DFSInputStream 调用openInfo() 调用NameNodeRpcServer 获取到block位置,将block信息写入输出流,保存到DFSInputStream输入流对象中的成员变量中,交给IOUtil,下载文件到本地

5512cffdaf79d96e0913bc986c5b3c0f.png
0b494da456ac7d7d0edf67507ae60586.png
1a6ff257f710c9c460510d3d40a10260.png
f6695669260e97775a7d9141895d3296.png
8dea50e95f6cd345e958bd697ef4f0f2.png
2e97d376be106f7034ed65291f1990d0.png
41185de21a13afadcd4d4b4428cd9d54.png

2.2 写流程:

​ (源码可以参照读流程自己看看)

HDFS client 调用文件系统(distributed filesystem)的 create 方法,远程调用 NameNode 中的 create 方法。此时 NameNode 进行4个操作检测自己是否正常,文件是否存在,客户端权限与写日志。此时create的返回值为FSData outputstream对象,此时 HDFS client 调用 write 方法和 NameNode 进行连接,调用 addblock 方法返回 block 分配的 Datanode 列表

​ 主要放在 DFSOutputStream.class 先写入 writeChunk (32768)后 queueCurrentPacket (),置入 createBlockOutputStream , 向DataNode传输,DataNode传输结束会检测checkSum,成功就删除 ack queuepackage,否则放回 data queue 重传, 结束后关闭流,告诉NameNode,调用complete方法结束

2d4f684c9b3196747a09c7ced3c1f048.png

2.3 疑点:

​ 读取数据的完整性:DataNode的存储的除了数据还附带checkSum检验(CRC32算法 32位4个字节大小) , 每次读取完数据后,都会对数据做一次checkSum对比,保证数据传输的完整性

3 NameNode HA 高可用实现

743dd8a5182cff84d44be99fdc9a3cc8.png

3.1 解决单点故障问题

  1. 使用两台NameNode互备,Active NN 与 Standby NN 形成互备。某时间段都只有一个台NameNode状态为Active,一台为Standby
  2. ZKFailoverController 作为独立的进程运行,对 NameNode 的主备切换进行总体控制。ZKFailoverController 能及时检测到 NameNode 的健康状况,在主 NameNode 故障时借助 Zookeeper 实现自动的主备选举和切换,当然 NameNode 目前也支持不依赖于 Zookeeper 的手动主备切换。

3.2 数据同步共享问题

  1. 共享存储系统是实现 NameNode 的高可用最为关键的部分,共享存储系统保存了 NameNode 在运行过程中所产生的 HDFS 的元数据。Active NameNode 和 Standby NameNode 通过共享存储系统实现元数据同步。在进行主备切换的时候,新的主 NameNode 在确认元数据完全同步之后才能继续对外提供服务。
  2. 基于 QJM 的共享存储系统主要用于保存 EditLog,并不保存 FSImage 文件。FSImage 文件还是在 NameNode 的本地磁盘上。QJM 共享存储的基本思想来自于 Paxos 算法,采用多个称为 JournalNode 的节点组成的 JournalNode 集群来存储 EditLog。每个 JournalNode 保存同样的 EditLog 副本。每次 NameNode 写 EditLog 的时候,除了向本地磁盘写入 EditLog 之外,也会并行地向 JournalNode 集群之中的每一个 JournalNode 发送写请求,只要大多数 (majority) 的 JournalNode 节点返回成功就认为向 JournalNode 集群写入 EditLog 成功。如果有 2N+1 台 JournalNode,那么根据大多数的原则,最多可以容忍有 N 台 JournalNode 节点挂掉。

4 NameNode 局限 和 Federation 架构设计

4.1 局限:

1. 命名空间的限制,NameNode 上存储着整个 HDFS 上的文件的元数据,NameNode 是部署在一台机器上的,因为单个机器硬件的限制,必然会限制 NameNode 所能管理的文件个数,制约了数据量的增长。
2. 数据隔离问题, 整个 HDFS 上的文件都由一个 NameNode 管理,所以一个程序很有可能会影响到整个 HDFS 上的程序,并且权限控制比较复杂。
3. 性能瓶颈, 单个NameNode 时 HDFS文件系统的吞吐量受限于单个 NameNode 的吞吐量。因为 NameNode 是个 JVM 进程,JVM 进程所占用的内存很大时,性能会下降很多。

4.2 方案Federation架构

Federation 中的多个 NameNode 是不同的,可以理解为将一个 NameNode 切分为了多个 NameNode,每一个 NameNode 只负责管理一部分数据。HDFS Federation 中的多个 NameNode 共用 DataNode。

5 补充:

5.1 HDFS快照

​ 快照是一个只读的基于时间点文件系统拷贝,是整个文件系统的也可以是一部分,用于数据备份,防止用户错误操作和容灾恢复,snapshot 并不影响hdfs的正常操作,修改会按照时间的反序记录,是当前数据减去修改的部分计算出来的,快照会存储在snapshottable的目录下

5.2 namenode 宕机后的恢复

secondaryNamenode 通过http get 方式把edit.log 和 fsimage信息拉取过来 , 合并产生新文件fsimage.ckpt,再回传给namenode。而客户端对namenode的操作也会产生新日志,单独放在edits.new 文件中。传回fsimage.ckpt会被分解成fsimage edits.log,edits.log和合edits.new的日志文件一同合并作为一份完整的edits.log文件

5.3 hdfs 心跳机制

​ 1 namenode 全权管理数据块的复制,周期性从集群中的每个dataname接收心跳信号和块状态报告,接收心跳信号意味着该datanode工作状态正常,块状态包含datanode上所有数据块的列表

​ 2 DataNode启动时向NameNode注册,通过后周期性地向NameNode上报blockReport,每3秒向NameNode发送一次心跳,NameNode返回对该DataNode的指令,如将数据块复制到另一台机器,或删除某个数据块等···而当某一个DataNode超过10min还没向NameNode发送心跳,此时NameNode就会判定该DataNode不可用,此时客户端的读写操作就不会再传达到该DataNode上

​ 3 hadoop集群刚开始启动时会进入安全模式&#xff08;99.99%&#xff09;&#xff0c;就用到了心跳机制&#xff0c;其实就是在集群刚启动的时候&#xff0c;每一个DataNode都会向NameNode发送blockReport&#xff0c;NameNode会统计它们上报的总block数&#xff0c;除以一开始知道的总个数total&#xff0c;当 block/total <99.99% 时&#xff0c;会触发安全模式&#xff0c;安全模式下客户端就没法向HDFS写数据&#xff0c;只能进行读数据。



推荐阅读
  • 本文详细介绍了如何在Linux系统(以CentOS为例)上彻底卸载Zimbra邮件系统,包括停止服务、删除文件和用户等步骤。 ... [详细]
  • 本指南从零开始介绍Scala编程语言的基础知识,重点讲解了Scala解释器REPL(读取-求值-打印-循环)的使用方法。REPL是Scala开发中的重要工具,能够帮助初学者快速理解和实践Scala的基本语法和特性。通过详细的示例和练习,读者将能够熟练掌握Scala的基础概念和编程技巧。 ... [详细]
  • Kafka 是由 Apache 软件基金会开发的高性能分布式消息系统,支持高吞吐量的发布和订阅功能,主要使用 Scala 和 Java 编写。本文将深入解析 Kafka 的安装与配置过程,为程序员提供详尽的操作指南,涵盖从环境准备到集群搭建的每一个关键步骤。 ... [详细]
  • 本文探讨了 Kafka 集群的高效部署与优化策略。首先介绍了 Kafka 的下载与安装步骤,包括从官方网站获取最新版本的压缩包并进行解压。随后详细讨论了集群配置的最佳实践,涵盖节点选择、网络优化和性能调优等方面,旨在提升系统的稳定性和处理能力。此外,还提供了常见的故障排查方法和监控方案,帮助运维人员更好地管理和维护 Kafka 集群。 ... [详细]
  • Hadoop 2.6 主要由 HDFS 和 YARN 两大部分组成,其中 YARN 包含了运行在 ResourceManager 的 JVM 中的组件以及在 NodeManager 中运行的部分。本文深入探讨了 Hadoop 2.6 日志文件的解析方法,并详细介绍了 MapReduce 日志管理的最佳实践,旨在帮助用户更好地理解和优化日志处理流程,提高系统运维效率。 ... [详细]
  • 深入解析Spring Boot启动过程中Netty异步架构的工作原理与应用
    深入解析Spring Boot启动过程中Netty异步架构的工作原理与应用 ... [详细]
  • 本文详细介绍了在 React Native 开发过程中遇到的 'Could not connect to development server' 错误及其解决方法。该问题不仅影响开发效率,而且难以通过网络资源找到确切的解决方案。本文将提供详细的步骤,帮助开发者快速解决这一常见问题。 ... [详细]
  • 网站访问全流程解析
    本文详细介绍了从用户在浏览器中输入一个域名(如www.yy.com)到页面完全展示的整个过程,包括DNS解析、TCP连接、请求响应等多个步骤。 ... [详细]
  • 本文详细介绍了 InfluxDB、collectd 和 Grafana 的安装与配置流程。首先,按照启动顺序依次安装并配置 InfluxDB、collectd 和 Grafana。InfluxDB 作为时序数据库,用于存储时间序列数据;collectd 负责数据的采集与传输;Grafana 则用于数据的可视化展示。文中提供了 collectd 的官方文档链接,便于用户参考和进一步了解其配置选项。通过本指南,读者可以轻松搭建一个高效的数据监控系统。 ... [详细]
  • 如何在Linux服务器上配置MySQL和Tomcat的开机自动启动
    在Linux服务器上部署Web项目时,通常需要确保MySQL和Tomcat服务能够随系统启动而自动运行。本文将详细介绍如何在Linux环境中配置MySQL和Tomcat的开机自启动,以确保服务的稳定性和可靠性。通过合理的配置,可以有效避免因服务未启动而导致的项目故障。 ... [详细]
  • XAMPP 遇到 404 错误:无法找到请求的对象
    在使用 XAMPP 时遇到 404 错误,表示请求的对象未找到。通过详细分析发现,该问题可能由以下原因引起:1. `httpd-vhosts.conf` 文件中的配置路径错误;2. `public` 目录下缺少 `.htaccess` 文件。建议检查并修正这些配置,以确保服务器能够正确识别和访问所需的文件路径。 ... [详细]
  • 本文对SQL Server系统进行了基本概述,并深入解析了其核心功能。SQL Server不仅提供了强大的数据存储和管理能力,还支持复杂的查询操作和事务处理。通过MyEclipse、SQL Server和Tomcat的集成开发环境,可以高效地构建银行转账系统。在实现过程中,需要确保表单参数与后台代码中的属性值一致,同时在Servlet中处理用户登录验证,以确保系统的安全性和可靠性。 ... [详细]
  • 在Java项目中,当两个文件进行互相调用时出现了函数错误。具体问题出现在 `MainFrame.java` 文件中,该文件位于 `cn.javass.bookmgr` 包下,并且导入了 `java.awt.BorderLayout` 和 `java.awt.Event` 等相关类。为了确保项目的正常运行,请求提供专业的解决方案,以解决函数调用中的错误。建议从类路径、依赖关系和方法签名等方面入手,进行全面排查和调试。 ... [详细]
  • Java中不同类型的常量池(字符串常量池、Class常量池和运行时常量池)的对比与关联分析
    在研究Java虚拟机的过程中,笔者发现存在多种类型的常量池,包括字符串常量池、Class常量池和运行时常量池。通过查阅CSDN、博客园等相关资料,对这些常量池的特性、用途及其相互关系进行了详细探讨。本文将深入分析这三种常量池的差异与联系,帮助读者更好地理解Java虚拟机的内部机制。 ... [详细]
  • 构建高可用性Spark分布式集群:大数据环境下的最佳实践
    在构建高可用性的Spark分布式集群过程中,确保所有节点之间的无密码登录是至关重要的一步。通过在每个节点上生成SSH密钥对(使用 `ssh-keygen -t rsa` 命令并保持默认设置),可以实现这一目标。此外,还需将生成的公钥分发到所有节点的 `~/.ssh/authorized_keys` 文件中,以确保节点间的无缝通信。为了进一步提升集群的稳定性和性能,建议采用负载均衡和故障恢复机制,并定期进行系统监控和维护。 ... [详细]
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社区 版权所有