Hadoop - HDFS

news2024/11/15 1:28:35

Hadoop - HDFS

1. HDFS介绍

1.1 定义

HDFS是一个分布式文件系统,适合一次写入,多次读出的场景

  • 数据可以保存在多个副本当中,可以通过增加副本的数量来增加容错

  • 不适用于低延时数据访问的场景

  • 不能高效的对小文件进行存储

因为会占用NameNode的大量内存,而NameNode的内存是有限的

小文件存储的寻址时间会超过读取时间

  • 不支持并发写入和文件的随机修改

一个文件只能有一个写,不允许多个线程同时写入

仅支持数据的追加操作

1.2 组成架构

请添加图片描述

1.2.1 NameNode

是一个管理者,负责管理HDFS的元数据、数据块映射信息

处理客户端的读写请求

1.2.2 DataNode

针对NameNode下达的命令,DataNode执行实际的操作

存储实际的数据块

执行数据块的读写操作

请添加图片描述

1.2.3 Client

客户端

文件上传HDFS上时,client将文件切分成block进行上传

与NameNode进行交互,获取文件的存储位置

与DataNode进行交互,读取或者写入数据

通过一些命令来管理和访问HDFS

1.2.4 Secondary NameNode

辅助NameNode来管理元数据

每隔一段时间获取NameNode的快照

定期合并Fsimage和Edis并返回给NameNode

NameNode出现故障,可辅助恢复NameNode

1.3 文件块大小

HDFS中的文件分块进行存储,2.x和3.x默认为128M,1.x默认为64M

文件块大小主要取决于磁盘的传输速率

寻址时间为查找到目标block所需要的时间

寻址时间为传输时间的1%为最佳状态

如果寻址时间为10ms,传输时间就为1s

磁盘传输速率为100M/s

则block大小:100M

如果block设置的太小,会增加寻址时间,程序一直在寻找块开始的位置

如果block设置的太大,传输时间会明显大于寻址时间,导致处理数据非常慢

2 HDFS的读写流程

2.1写数据流程

请添加图片描述

  1. client通过DistributedFIleSystem(分布式文件系统)向NameNode请求上传文件,NameNode检查目标文件是否存在,父目录是否存在,返回是否可以上传
  2. client请求第一个block该上传到哪些DataNode上
  3. NameNode根据配置文件中的备份数量和机架感知返回可以用DataNode的地址
  4. client通过FSDataOutputStream(数据输出流),向其中一个DataNode :A 请求上传数据,A收到请求之后会继续调用B,B调用C,逐级返回client(本质就是RPC调用,建立pipeline)
  5. client开始向A上传以一个block(先从磁盘读取数据放到一个本地内存缓存),以packet为单位(默认64kb),A收到一个packet就会传给B,B传给C,A每传一个packet会放入一个应答队列等待应答
  6. 在pipeline的反方向上,会逐个发送ack,最终由A将ack发送给client
  7. 一个bloeck传输完成之后,重复2,继续传输下一个block

2.2 网路拓扑

NameNode会选择距离上传数据最近距离的DataNode接收数据

节点距离:两个节点到达共同祖先的距离总和

请添加图片描述

请添加图片描述

2.3 机架感知

第一个 block 副本放在 Client 所在的服务器,如果 client 不在集群服务器中,则这第一个 DataNode 会随机选择。

第二个副本放置在与第一个节点不同的机架中的节点中,保证机架间的高可用。

第三个有不同机房则跨机房随机放置在某个节点上;只有一个机房则和第二副本在同一个机架,随机放在不同的节点中。

更多的副本,则继续随机放置,需要注意的是一个节点最多放置一个副本。

2.4 读数据流程

请添加图片描述

  1. client通过DisributedFileSystem向NameNode请求下载文件
  2. NameNode会返回文件的部分或者全部的block列表,对于每个block。NameNode都会返回含有该block的DataNode地址,通过网络拓扑得出DataNode与client的距离,进行排序,网络拓扑中距离client近的靠前,心跳机制超时汇报的靠后
  3. client选择排序考前的DataNode来读取block,如果client本身就是DataNode,就直接从本地获取数据
  4. 底层本质是建立Socket Stream(FsDataInputStream),重复调用父类的DataInputStream的read方法,知道这个块上的数据读取完毕
  5. 读取完毕之后,会继续向NameNode获取下一批的block列表
  6. 读取完一个block都会进行checksum验证,如果获取DataNode出现错误,client会通知NameNode,向下一个拥有该bloeck的DataNode继续读取
  7. read方法并行读取block信息,不是一块一块的读取
  8. 最终读取的所有的block会合并成一个完整的文件

3. NameNode工作机制及元数据管理

请添加图片描述

3.1 NameNode工作机制

3.1.1 NameNode启动

  1. 第一次启动NameNode格式化之后,创建Fsimage和Edis文件,如果不是第一次启动,则直接加载编辑日志和镜像文件
  2. client对元数据进行增删改的请求
  3. NameNode记录操作日志,更新滚动日志
  4. NameNode在内存对元数据进行增删改

3.1.2 Secondary NameNode工作

  1. Secondary NameNode询问NameNode是否需要CheckPoint,直接返回NameNode的检查结果
  2. Secondary NameNode请求执行checkpoint
  3. NameNode滚动当前写的edits日志
  4. 将滚动前的编辑日志和镜像文件拷贝到Secondary NameNode
  5. Secondary NameNode加载编辑日志和镜像文件到内存,并进行合并
  6. 生成新的镜像文件fsimage.chkpoint
  7. 拷贝fsimage.chkpoint到NameNode
  8. NameNode将fsimage.chkpoint重新命名成fsimage

3.2 Fsimage和Edits

Fsimage:NameNode中元数据的镜像,包含HDFS的所有目录和文件inode的序列化信息

Edis:存放HDFS中所有更新操作的路径,client执行的所有操作会先被记录到Edits中

seen_txid:保存最后一个edits_的数字

NameNode每次启动都会将Fsimage读入内存,加载Edits里面的操作,保证内存中的元数据是最新的

4 DataNode

4.1 DataNode工作机制

请添加图片描述

  1. 数据块在DataNode以文件的形式存储在磁盘上,包括两个文件,一个是数据本身,另一个是元数据。包括数据块的长度、校验和、时间戳
  2. DataNode启动之后向NameNode进行注册,成功之后,周期性(默认6小时)的向NameNode上报所有的块信息
  3. 心跳每三秒进行一次,心跳返回带有NameNode给DataNode的命令,如果超过10分钟没有收到某个DataNode的心跳,就会认为这个DataNode不可用
  4. 集群在运行的过程中可以加入和退出一些机器

4.2 数据完整性

  • 当DataNode读取block的时候,会计算checkSum(校验和)
  • 如果计算之后的CheckSum与创建时的不同,说明block已经损坏
  • client读取其他DataNode上的block
  • DataNode在文件创建之后周期性验证checkSum

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/358585.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MySQL —— 内外连接

目录 表的内外连接 一、内连接 二、外连接 1. 左外连接 2. 右外连接 表的内外连接 表的连接分为内连和外连 一、内连接 内连接实际上就是利用where子句对两种表形成的笛卡儿积进行筛选,我们前面博客中的查询都是内连接,也是在开发过程中使用的最多…

为GDI+增加类似QPainter的Save和Restore功能

文章目录一、实现思路1、功能设计2、大体实现思路二、代码实现1、实现IList2、实现功能函数3、调用测试原文出处: https://blog.csdn.net/haigear/article/details/129116662在使用GDI绘图时,不得不说QT中的QPainter有些功能是让人羡慕的,比如…

【Java基础】泛型

泛型 generic 泛型的好处 编译器自动检查&#xff0c;减少了出错减少了转换次数&#xff0c;提高效率不再提示编译警告使程序员能够实现通用算法 定义 接口和类&#xff0c;方法都可以定义泛型 //泛型类会被在创建实例的时候被确定 // 泛型可以有多个 class Person<T,…

3分钟带您快速了解HIL测试及其架构

什么是HIL测试硬件在环&#xff08;HIL&#xff09;仿真是一种用于测试导航系统的技术&#xff0c;其中测试前并不知道车辆轨迹。在这种情况下&#xff0c;车辆轨迹被实时馈送到GNSS模拟器。HIL可用于复杂实时系统的开发和测试&#xff0c;如卫星控制系统、军事战术导弹、飞机飞…

从JDK源码中探究Runtime#exec的限制

前言 遇到很多次在调用Runtime.getRuntime().exec方法进行弹shell的时候遇到的各种限制&#xff0c;都没好好的认识认识原理&#xff0c;这次主要是总一个总结和原理上的分析。 环境搭建 之后使用docker起一个具有反序列化的漏洞的Java服务(能够执行命令就行)。 之后开启调…

深度学习神经网络基础知识(三)前向传播,反向传播和计算图

专栏&#xff1a;神经网络复现目录 深度学习神经网络基础知识(三) 本文讲述神经网络基础知识&#xff0c;具体细节讲述前向传播&#xff0c;反向传播和计算图&#xff0c;同时讲解神经网络优化方法&#xff1a;权重衰减&#xff0c;Dropout等方法&#xff0c;最后进行Kaggle实…

第47章 后端管理首页与Axios拦截守卫原理

1 404全局拦截 1.1 定义布局页&#xff1a;src\views\ 404View.vue <template> <el-container> <el-main> </el-main> <el-footer> <h1>大人&#xff0c;你要找的页面离家出走了&#xff01;小的正在努力寻找中…</h1> </el-fo…

Node多版本管理工具(轻松切换本地环境Node版本)

引言 在项目 Vue2 升级 Vue3 的过程中&#xff0c;因兼顾新老版本的项目而需不同版本的Node 环境&#xff0c;这种情况下 NVM【nodejs version manager(Node版本管理工具)】是一个很好的选择&#xff0c;它可以很方便的切换 node 环境。 安装 NVM 访问 ⬇ NVM 下载地址 &…

Android Handler的内存抖动以及子线程创建Handler

一、介绍 Handler&#xff0c;作为一个在主线程存活的消息分发工具&#xff0c;在App开发过程使用频率很高&#xff0c;也是面试问的比较多的。 面试常见的比如&#xff1a;子线程如何创建&#xff1f;Handler的机制是什么&#xff1f;内存抖动等&#xff0c;接下来我们会针对H…

Cosmos 基础教程(二)-- Run a Node, API, and CLI

有很多不同的方法来运行Cosmos区块链的节点。您将探索如何使用simapp 进行此操作。 1、编译simapp Cosmos SDK存储库包含一个名为 simapp 的文件夹。在这个文件夹中&#xff0c;您可以找到运行Cosmos SDK模拟版本的代码&#xff0c;这样您就可以在不实际与链交互的情况下测试…

从零开始使用MMSegmentation训练Segformer

从零开始使用MMSegmentation训练Segformer 写在前面&#xff1a;最新想要用最新的分割算法如&#xff1a;Segformer or SegNeXt 在自己的数据集上进行训练&#xff0c;但是有不是搞语义分割出身的&#xff0c;而且也没有系统的学过MMCV以及MMSegmentation。所以就折腾了很久&am…

Javascript 立即执行函数

IIFE,一般称为立即执行函数。你可能会问我&#xff0c;*“嘿&#xff01;我知道正常的函数表达式是什么样子的&#xff0c;但是 IIFE 到底是什么&#xff1f;”。*好吧&#xff0c;这正是我今天要在本文中回答的问题。 函数表达式 在了解立即调用函数表达式之前&#xff0c;让…

栈与队列-算法总结

目录 基础知识 用栈实现队列 用队列实现栈 栈的拿手好戏 删除字符串中的所有相邻重复项 逆波兰表达式求值 滑动窗口最大值 前k个高频元素 基础知识 栈队列stackqueue先进后出先进先出无迭代器无迭代器容器设配器容器设配器vector deque listvector deque list C标准库版本…

“dv/dt”和“di/dt”值:这些值的水平对固态继电器有什么影响?

di/dt水平过高是晶闸管故障的主要原因之一。发生这种情况时&#xff0c;施加到半导体器件上的应力会大大超过额定值并损坏功率元件。在这篇新的博客文章中&#xff0c;我们将解释dv/dt和di/dt值的重要性&#xff0c;以及为什么在为您的应用选择固态继电器之前需要考虑它们。 让…

VMware虚拟机安装Win11最详细过程以及遇到的这台电脑无法运行Windows11的问题

准备工作 在使用VMware虚拟机安装Win11之前我们先把准备工作做好&#xff0c;以免后续思绪混乱导致出错。 1. 到VMware官网或点击链接下载正版VMware Workstation 16 Pro。 2. 双击打开安装包&#xff0c;点击下一步。 3. 阅读用户许可协议&#xff0c;勾选我接受许可协议中的…

k8s-二进制部署

文章目录一、环境二、步骤1、安装cfssl工具2、部署etcd集群3、在node节点安装docker组件4、安装flannel组件部署master节点组件部署node节点部署kube-proxy组件三、测试一、环境 角色服务器地址组件master192.168.174.140kube-apiserver&#xff0c;kube-controller-manager&a…

外包出来,朋友内推我去一家公司,问的实在是太...

外包出来&#xff0c;没想到算法死在另一家厂子&#xff0c;自从加入这家公司&#xff0c;每天都在加班&#xff0c;钱倒是给的不少&#xff0c;所以也就忍了。没想到8月一纸通知&#xff0c;所有人不许加班&#xff0c;薪资直降30%&#xff0c;顿时有吃不起饭的赶脚。 好在有…

2023赏金计划:Coremail SRC漏洞征集与样本奖励火热进行中

赏金活动一&#xff1a;Coremail SRC漏洞奖励计划 01 活动背景 2023年1月&#xff0c;Coremail安全应急响应中心&#xff08;Coremail SRC&#xff09;正式上线启用&#xff0c;面向公众收集安全漏洞信息与安全情报。Coremail SRC旨在联合众多安全专家、白帽子研究员共同发现…

MySQL 运算符及优先级

MySQL 运算符 MySQL 主要有以下几种运算符&#xff1a; 算术运算符比较运算符逻辑运算符位运算符算术运算符 MySQL 支持的算术运算符包括: 运算符作用加法-减法*乘法/ 或 DIV除法% 或 MOD取余 在除法运算和模运算中&#xff0c;如果除数为0&#xff0c;将是非法除数&#x…

分布式事务几种方案

1&#xff09;、2PC 模式 数据库支持的 2PC【2 phase commit 二阶提交】&#xff0c;又叫做 XA Transactions。 MySQL 从 5.5 版本开始支持&#xff0c;SQL Server 2005 开始支持&#xff0c;Oracle 7 开始支持。 其中&#xff0c;XA 是一个两阶段提交协议&#xff0c;该协议…