Hadoop 底子原理

[复制链接]
发表于 2025-10-29 23:31:17 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
Hadoop 是一个由 Apache 基金会开发的分布式体系底子架构,紧张办理海量数据的存储和盘算题目,广义上 Hadoop 指的是 Hadoop 生态圈,包罗 HDFS、Hive、MapReduce、HBase 多种组件
根本先容

Hadoop 的须要性

Hadoop 紧张办理了海量数据的存储题目


  • 高可用性:底层会维护多个数据副本,以是纵然 Hadoop 某个盘算元素或存储出现故障,也不会导致数据的丢失
  • 高扩展性: 在集群间分配使命数据,可方便的扩展数以千计的节点
  • 高效性: 在 MapReduce 的头脑下,Hadoop 是并行工作的,以加快使命处理处罚速率。
  • 高容错性: 可以大概主动将失败的使命重新分配
一个 block 块在 NameNode 中占150byte(固定),过多小文件会占用 NameNode 内存
小文件的寻址时间大于读取时间
不支持并发写和随机写
一个文件只能有一个写,不答应多线程同时写
Hadoop 焦点组件

Hadoop 焦点组件包罗以下两种


  • HDFS:是 Hadoop 的分布式文件体系,紧张负责海量数据的存储
  • MapReduce:是 Hadoop 的盘算框架,负责对数据举行分布式盘算处理处罚。处理处罚流程分为 Map 阶段(并行处理处罚输入数据,将数据转换为键值对)和 Reduce 阶段(对 Map 阶段的效果举行汇总和进一步处理处罚)
Hadoop 生态体系中的附加组件

我们后端开发打仗的比力多的是Hadoop 生态体系中的附加组件,Sqoop 以及 Hive,分别用来同步数据和查询数据


  • Sqoop:Hadoop(Hive)与传统数据库(Mysql)之间传输数据的工具,支持批量导入和导出数据
  • Flume 高可用、高可靠分布式的海量日志日志收罗、聚合和传输体系
  • Spark:是一个通用的分布式盘算框架,支持内存盘算,可以明显进步数据处理处罚速率。它支持多种盘算模式,包罗批处理处罚、流处理处罚、呆板学习等
  • HBase:HBase 是一个分布式的、面向列的 NoSQL 数据库,创建在 HDFS 之上。它提供了实时读写访问,恰当处理处罚大规模数据集
  • Hive:是基于 Hadoop 的数据堆栈工具,它提供了一种 SQL-like 的查询语言(HiveQL),利用户可以方便地举行数据查询和分析。它可以将 HiveQL 转换为 MapReduce 使命实行
底子特性

hive 表可以通过 Hive/Spark/Impala 等盘算引擎天生


  • Hive:将 SQL 翻译成 MapReduce 使命,恰当高延伸、高吞吐的批处理处罚
  • Spark:基于内存盘算,分身批处理处罚、流处理处罚、呆板学习等多种场景,性能远超传统 MapReduce
  • Impala:专为低延伸交互式 SQL 查询而生
HDFS 存放目次文件的格式是层级(树状)结构的,这是 HDFS 为了实现数据分布、并行处理处罚和高效查询而计划的分区化层级结构。
HDFS

HDFS 是 Hadoop 的分布式文件体系,办理了海量数据的存储题目
HDFS 集群架构

HDFS 利用 Master/Slave 架构,架构逻辑比力类似 Kafka、ES 等 Apache 的其他项目
一样寻常一个集群有一个 NameNode 和肯定命目 DataNode 构成,Namenode 是 HDFS 集群主节点,Datanode 是 HDFS 集群从节点,两种脚色各司其职,共同和谐完身分布式的文件存储服务
HDFS 中文件在物理上是分块存储,通过 dfs.blocksize 设置,2.x之后的版本默认128M
HDFS 中文件在逻辑上是连续的,提供一个文件目次树
HDFS 读写流程

HDFS 写流程

1,客户端向 NameNode 发送写数据哀求(包罗待上传文件名和将要上传的路径)
2,NameNode 查抄路径是否存在,文件是否重名等(假设满意上传条件)
3,NameNode 向客户端相应数据,可以上传文件,而且创建文件元数据
4,客户端根据文件巨细举行切分成一个个 block 块(默认128MB),并向 NameNode 发送提交即将上传 block1 的哀求
5,NameNode 查询 DataNode 信息,规划 block1 的存储位置
6,NameNode 向客户端返回 block1 可以存储的数据节点 ip 列表
7,客户端直接哀求数据节点1上传 block1,数据节点1存储 block1 完毕并根据 ip 列表将 block1 发送给数据节点2,数据节点2存储完毕 block1 并根据 ip 列表将 block1 发送给数据节点3,数据节点3存储完成相应数据给数据节点2,数据节点2将相应数据给数据节点1,数据节点1将存储效果返回给 NameNode 和客户端
9,重复第四步上传下一个block

我知道你们想问什么,为什么 HDFS 的写流程必须一个个的上传块,不能并发上传吗?这是计划者对于 HDFS 写少读多场景的这种考量。该场景云云计划的长处:
1,每个数据块的写入是原子利用,即要么乐成写入,要么完全不写入,这确保了数据的划一性。假如并发写入必要额外考量并发安全性题目
2,管道复制机制包管了传输的服从,我们针对每个上传的文件着实是并发上传的,如许就够了,现实测下来没有须要对每个文件的多个 block 并发上传
3,同时维护多个 block 传输必要大量内存和网络带宽
为什么肯定要用管道复制机制?
1,带宽高效利用,数据沿管道序次运动:客户端 → DN1 → DN2 → DN3。每个节点同时举行吸收和发送,相比客户端分别上传到各 DN,节省约2/3的上传时间。由于管道的存在缓冲区可以占用较少的内存空间
2,低落客户端负载,客户端只需毗连第一个 DataNode,不直接与全部副本节点通讯(淘汰毗连数和带宽占用),特别有利于大文件上传(克制客户端成为瓶颈)

HDFS 读流程

1,客户端向 NameNode 哀求下载文件
2,NameNode 返回目的文件的元数据
3,客户端根据元数据哀求 DataNode 读取数据 block
4,DataNode 向客户端传输数据
5,重复第三步,直到全部的块传输完成
6,客户端根据元数据组装 block 块完成读取数据

NameNode 和 DataNode

NameNode 是名称节点,焦点职责是管理文件体系的元数据(文件名、记载每个 block 地点的 DataNode 位置、block 列表等),而且和谐客户端访问
NameNode 不存储现实数据,全部元数据存储在内存中(因此限定集群规模)
NameNode 在早期是单点架构的,很容易出题目,因此 HDFS 2.0 后支持 HA,就是高可用方案
  1. [Active NameNode] ←→ [JournalNodes] ←→ [Standby NameNode]
  2.        ↑                      ↑                  ↑
  3.     (客户端请求)         (共享编辑日志日志)        (实时同步)
复制代码


  • JournalNodes 用于存储编辑日志日志(Edits),实现主备 NameNode 的元数据同步,他可以包管故障切换时不丢失数据
  • ZooKeeper:负责故障检测和主备切换
DataNode(数据节点),焦点职责为现实存储数据 block,定期向 NameNode 报告存储情况,也就是心跳检测,默认每个 block 有3个副本(可设置)
HDFS 会定期校验数据完备性
NameNode 长期化机制

NameNode 元数据的存储位置是在内存中,但是内存一旦断电元数据将丢失,因此必须将内存中的元数据存储在磁盘中用于备份,这里引入额外一个概念叫 Fsimagem
Fsimagem 为内存元数据的备份。若内存的元数据发生改变,假如同时更新 Fsimage 会低落服从,假如不更新会发生数据不划一题目
针对上述题目,终极逻辑是不更新 Fsimage 文件,为办理数据不划一题目,引入 edits 文件,该文件只记载利用而且采取追加写的情势,即每当内存的元数据发生改变的同时记载本次利用记载追加到磁盘中的 edits,如许内存元数据便是磁盘的 Fsimage + edits
当 NameNode 启动时先滚动 edits 并天生一个空的 edits.inprogress,会将 Fsimage 和 edits 文件加载到内存中举行归并,之后的利用(增删)将追加到 edits.inprogress 中
其举动类似 redis 的 RDB 和 AOF 机制,MySQL 中的 binlog 和 redolog,这些数据存储的软件长期化实现都差不多
hdfs 数据倾斜怎么处理处罚

一样寻常业务研发不消处理处罚这个题目,还是简朴聊一下吧,数据倾斜通常指 DataNode 负载不均,缘故起因大概是:


  • 写入模式题目:若客户端总往同一 DataNode 写数据(好比日志会集写入),会导致该节点数据过多
  • 节点容量差别:新参加的大容量节点大概分配到更多数据,旧节点负载轻
  • 副本计谋影响:HDFS 默认将副天职散到差别机架,但假如机架间网络延伸高,大概导致副本会集
处理处罚方式就是 hdfs balancer,他是 HDFS 自带的集群平衡工具,原理如下:


  • 先盘算全部 DataNode 的存储利用率,对比各节点利用率,找出凌驾匀称阈值(默认 10%)的节点
  • 将高负载节点的数据块(Block)复制到低负载节点,完成后删除原副本
MapReduce

MapReduce 是一种编程模子和分布式盘算框架,是开发基于 Hadoop 的数据分析应用的焦点框架。MapReduce 的紧张用途包罗:


  • 大数据处理处罚:处理处罚和分析 PB 级别的数据,如日志分析、数据发掘、统计分析等
  • 数据转换:将原始数据转换为所需的格式,如 ETL(Extract, Transform, Load)使命
  • 数据索引:构建大规模数据的索引,如搜索引擎的网页索引
  • 呆板学习:处理处罚大规模的练习数据,举行模子练习和猜测
总之,只要是统计大概盘算 Hadoop 中的数据,都会用到 MapReduce。Hive(基于 Hadoop 的数据堆栈工具,它提供了一种 SQL-like 的查询语言,使得用户可以方便地举行数据查询和分析)底层对接 MapReduce 来实行查询和数据处理处罚使命。Hive 的查询终极会被转换成一个或多个 MapReduce 作业来实行
底层原理

MapReduce 实现分布式盘算分成3个阶段,Map(映射)、Shuffle(洗牌)、Reduce(归约)
先从 HDFS 中找到要处理处罚的数据作为输入数据,输入数据被 HDFS 切成多个小块(一样寻常是 128MB 一块),每个小块称为一个切片(split),每个块由一个 Map 使命处理处罚,精确的说是 MapTask 并发实例,他们完全并行运行,互不干扰
接下来进入 map 阶段,map 是第一个阶段。Map 使命会读取数据块,对每条记载调用用户界说的 Map 函数,天生中心键值对,举行排序并分区的利用(如按 Key 的哈希值分到差别 Reducer)
雷同范例的数据被分到一块,随后我们对数据举行处理处罚,进入第二个阶段,实行 ReduceTask,这一阶段也是完全并行运行,数据依赖上一个阶段全部 MapTask 并发实例输出。将 Map 使命天生的中心键值对举行分区、排序和归并等利用


  • 分区(Partitioning):根据键的哈希值将中心键值对分配到差别的 Reduce 使命中
  • 排序(Sorting):对每个分区内的键值对按键举行排序
  • 归并(Merging):将来自差别 Map 使命的雷同键的键值对归并在一起
这些利用被称为 Shuffle(洗牌),Shuffle 完毕将多个效果归并,就是 reduce 利用,reduce 利用完成后就是终极效果了
MapReduce 编程模子只能包罗一个 Map 阶段一个 Reduce 阶段,但可以实现多个 MapReduce 串行运行
示例

上面的形貌大概有些抽象,让各人有许多题目,好比为啥 ReduceTask 也可以并行实行?假如 MapTask 的产物是键值对的话,那么存放在 HDFS 的关系型表会怎么转换成键值对然后袒露给我们?接下来举个例子让各人更加深入的相识题目:
假设我们有一个关系型表 users,其结构如下:
user_idnameagecity1Alice25New York2Bob30London3Carol22New York4Dave28Tokyo假设我们要盘算每个都会的用户数量:
  1. SELECT city, COUNT(*) AS user_count
  2. FROM users
  3. GROUP BY city;
复制代码
在这个例子中,Map 阶段会将每行数据转换为键值对,此中键是都会名称,值是用户 ID。比方:


  • 输入行:1, Alice, 25, New York。输出键值对:(New York, 1)
  • 输入行:2, Bob, 30, London。输出键值对:(London, 2)
  • 输入行:3, Carol, 22, Paris。输出键值对:(New York, 3)
  • 输入行:4, Dave, 28, Tokyo。输出键值对:(Tokyo, 4)
Map 阶段竣事我们就得到许多键值对,在 Reduce 阶段,Hive 会将 Map 使命天生的中心效果按键举行分组,雷同都会的键值对会被分到一个 ReduceTask 中:


  • (New York, [1,3]) -> (New York, 2)
  • (London, [2]) -> (London, 1)
  • (Tokyo, [4]) -> (Tokyo, 1)
ReduceTask 输出末了的处理处罚效果。以是一个 sql 在 Hive 中的实行流程和平凡 db 中是完全不一样的。通过上面的 case 我们可以看出,先 map 后 reduce 究竟上就是想利用并发的本事处理处罚大量数据,Hadoop 的创作者们将我们全部的查询利用都抽象成了这完全可以并行实行的两步
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表