Hadoop 基础原理
Hadoop 基础原理
- 基本介绍
- Hadoop 的必要性
- Hadoop 核心组件
- Hadoop 生态系统中的附加组件
- HDFS
- HDFS 集群架构
- HDFS 读写流程
- HDFS 写流程
- HDFS 读流程
- NameNode 持久化机制
- MapReduce
- 底层原理
- 示例
Hadoop 是一个由 Apache 基金会开发的分布式系统基础架构,主要解决海量数据的存储和计算问题,广义上 Hadoop 指的是 Hadoop 生态圈,包含 HDFS、Hive、MapReduce 多种组件
基本介绍
Hadoop 的必要性
Hadoop 主要解决了海量数据的存储问题
- 高可用性:底层会维护多个数据副本,所以即使 Hadoop 某个计算元素或存储出现故障,也不会导致数据的丢失。
- 高扩展性: 在集群间分配任务数据,可方便的扩展数以千计的节点。
- 高效性: 在 MapReduce 的思想下,Hadoop 是并行工作的,以加快任务处理速度。
- 高容错性: 能够自动将失败的任务重新分配。
一个 block 块在 NameNode 中占150byte(固定),过多小文件会占用 NameNode 内存
小文件的寻址时间大于读取时间
不支持并发写和随机写
一个文件只能有一个写,不允许多线程同时写
Hadoop 核心组件
Hadoop 核心组件包含以下两种
- HDFS:高可靠、高吞吐的分布式文件系统
- MapReduce:分布式离线并行计算框架
Hadoop 生态系统中的附加组件
我们后端开发接触的比较多的是Hadoop 生态系统中的附加组件,Sqoop 以及 Hive,分别用来同步数据和查询数据
- Sqoop:Hadoop(Hive)与传统数据库(Mysql)之间传输数据的工具,支持批量导入和导出数据
Flume 高可用、高可靠分布式的海量日志采集、聚合和传输系统 - Spark:是一个通用的分布式计算框架,支持内存计算,可以显著提高数据处理速度。它支持多种计算模式,包括批处理、流处理、机器学习等
- HBase:HBase 是一个分布式的、面向列的 NoSQL 数据库,建立在 HDFS 之上。它提供了实时读写访问,适合处理大规模数据集
- Hive:是基于 Hadoop 的数据仓库工具,它提供了一种 SQL-like 的查询语言(HiveQL),使用户可以方便地进行数据查询和分析。它可以将 HiveQL 转换为 MapReduce 任务执行
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 块,并向 NameNode 发送提交即将上传 block1 的请求
5,NameNode 查询 DataNode 信息,规划 block1 的存储位置
6,NameNode 向客户端返回 block1 可以存储的数据节点 ip 列表
7,客户端直接请求数据节点1上传 block1,数据节点1存储 block1 完毕并根据 ip 列表将 block1 发送给数据节点8,数据节点2存储完毕 block1 并根据 ip 列表将 block1 发送给数据节点3,数据节点3存储完成响应数据给数据节点2,数据节点2将响应数据给数据节点1,数据节点1将存储结果返回给 NameNode 和客户端
9,重复第四步上传下一个block
我知道你们想问什么,为什么 HDFS 的写流程必须一个个的上传块,不能并发上传吗?这是设计者对于 HDFS 写少读多场景的这种考量。该场景如此设计的好处:
1,每个数据块的写入是原子操作,即要么成功写入,要么完全不写入。这确保了数据的一致性。如果并发写入需要考量并发安全性问题
2,集群默认全同步,数据高可靠
HDFS 读流程
1,客户端向 NameNode 请求下载文件
2,NameNode 返回目标文件的元数据
3,客户端根据元数据请求 DataNode 读取数据 block
4,DataNode 向客户端传输数据
5,重复第三步,直到所有的块传输完成
6,客户端根据元数据组装 block 块完成读取数据
NameNode 持久化机制
NameNode 元数据的存储位置是在内存中,但是内存一旦断电元数据将丢失,因此必须将内存中的元数据存储在磁盘中用于备份,这里引入额外一个概念叫 Fsimagem
Fsimagem 为内存元数据的备份。若内存的元数据发生改变,如果同时更新 Fsimage 会降低效率,如果不更新会发生数据不一致问题
针对上述问题,最终逻辑是不更新 Fsimage 文件,为解决数据不一致问题,引入 edits 文件,该文件只记录操作并且采用追加写的形式,即每当内存的元数据发生改变的同时记录本次操作记录追加到磁盘中的 edits,这样内存元数据等于磁盘的 Fsimage + edits
当 NameNode 启动时先滚动 edits 并生成一个空的 edits.inprogress,会将 Fsimage 和 edits 文件加载到内存中进行合并,之后的操作(增删)将追加到 edits.inprogress 中
其行为类似 redis 的 RDB 和 AOF 机制
MapReduce
MapReduce 是一种编程模型和分布式计算框架,是开发基于 Hadoop 的数据分析应用的核心框架。MapReduce 的主要用途包括:
- 大数据处理:处理和分析 PB 级别的数据,如日志分析、数据挖掘、统计分析等
- 数据转换:将原始数据转换为所需的格式,如 ETL(Extract, Transform, Load)任务
- 数据索引:构建大规模数据的索引,如搜索引擎的网页索引
- 机器学习:处理大规模的训练数据,进行模型训练和预测
总之,只要是统计或者计算 Hadoop 中的数据,都会用到 MapReduce。Hive(基于 Hadoop 的数据仓库工具,它提供了一种 SQL-like 的查询语言,使得用户可以方便地进行数据查询和分析)底层对接 MapReduce 来执行查询和数据处理任务。Hive 的查询最终会被转换成一个或多个 MapReduce 作业来执行
底层原理
MapReduce 实现分布式计算分成2个阶段,Map(映射)和 Reduce(归约)
第一个阶段 MapTask 并发实例,完全并行运行,互不干扰。首先会将输入数据分割成多个小块,每个小块称为一个切片(split)。每个切片的大小通常与 HDFS 的块大小(默认 128MB)一致。这么做使数据能够并行处理,提高处理速度。
随后我们对输入数据进行处理,生成中间键值对(key-value pairs)。每个 Map 任务从输入切片中读取数据,对每条记录调用用户定义的 Map 函数,生成中间键值对
第二个阶段 ReduceTask 完全并行运行,数据依赖上一个阶段所有 MapTask 并发实例输出。将 Map 任务生成的中间键值对进行分区、排序和合并
- 分区(Partitioning):根据键的哈希值将中间键值对分配到不同的 Reduce 任务中
- 排序(Sorting):对每个分区内的键值对按键进行排序
- 合并(Merging):将来自不同 Map 任务的相同键的键值对合并在一起
MapReduce 编程模型只能包含一个 Map 阶段一个 Reduce 阶段,但可以实现多个 MapReduce 串行运行
示例
上面的描述可能有些抽象,让大家有很多问题,比如为啥 ReduceTask 也可以并行执行?如果 MapTask 的产物是键值对的话,那么存放在 HDFS 的关系型表会怎么转换成键值对然后暴露给我们?接下来举个例子让大家更加深入的了解问题:
假设我们有一个关系型表 users,其结构如下:
user_id | name | age | city |
---|---|---|---|
1 | Alice | 25 | New York |
2 | Bob | 30 | London |
3 | Carol | 22 | New York |
4 | Dave | 28 | Tokyo |
假设我们要计算每个城市的用户数量:
SELECT city, COUNT(*) AS user_count
FROM users
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 的创作者们将我们所有的查询操作都抽象成了这完全可以并行执行的两步
相关文章:

Hadoop 基础原理
Hadoop 基础原理 基本介绍Hadoop 的必要性Hadoop 核心组件Hadoop 生态系统中的附加组件 HDFSHDFS 集群架构HDFS 读写流程HDFS 写流程HDFS 读流程 NameNode 持久化机制 MapReduce底层原理示例 Hadoop 是一个由 Apache 基金会开发的分布式系统基础架构,主要解决海量数…...

JavaScript 任务队列详解:Event Loop、宏任务与微任务
JavaScript 任务队列详解:Event Loop、宏任务与微任务 在 JavaScript 的世界里,异步编程是一个至关重要的概念。JavaScript 采用 单线程 运行方式,但能够处理异步任务,这一切都要归功于 事件循环(Event Loopÿ…...

VScode运行后出现黑窗口
原文链接:VScode运行出黑窗口 1.安装插件:C/C Compile Run 2.快捷键【CtrlShiftp】,点击【首选项:打开用户设置】...

华为昇腾 910B 部署 DeepSeek-R1 蒸馏系列模型详细指南
本文记录 在 华为昇腾 910B(65GB) * 8 上 部署 DeepSeekR1 蒸馏系列模型(14B、32B)全过程与测试结果。 NPU:910B3 (65GB) * 8 (910B 有三个版本 910B1、2、3) 模型:DeepSeek-R1-Distill-Qwen-14B、DeepSeek…...

vue3项目实践心得-多次渲染同一svg + 理解v-if、transition、dom加载之间的顺序
🧡🧡需求🧡🧡 未点击查看答案按钮时,步骤3面板未展示内容(v-if控制) 点击查看答案按钮后,通过graphviz绘制并展示状态转换图,渲染在步骤2中,同时步骤3的v-…...

【实战项目】BP神经网络识别人脸朝向----MATLAB实现
(꒪ꇴ꒪ ),Hello我是祐言QAQ我的博客主页:C/C语言,数据结构,Linux基础,ARM开发板,网络编程等领域UP🌍快上🚘,一起学习,让我们成为一个强大的攻城狮࿰…...

java数据结构_二叉树_5.5
2.7 二叉树的相关操作 1. size方法 获取二叉树元素个数 思路:遍历思路,在前面文章中,前序 中序 后序遍历的时候,会把树中的所有结点遍历一次。可以添加一个计数器,遍历一个结点就加一次。 于是有如下代码࿱…...

Deepseek-R1推理模型API接入调用指南 ChatGPT Web Midjourney Proxy 开源项目接入Deepseek教程
DeepSeek-R1和OpenAI o1模型都属于推理任务模型,两个模型各有优点:DeepSeek-R1 在后训练阶段大规模使用了强化学习技术,在仅有极少标注数据的情况下,极大提升了模型推理能力。在数学、代码、自然语言推理等任务上,性能…...

计算机网络(4)TCP断开
1、TCP 断开连接四次挥手流程 TCP 断开连接是通过四次挥手方式。双方都可以主动断开连接,断开连接后主机中的「资源」将被释放。 2、为什么 TIME_WAIT 等待的时间是 2MSL? 3、为什么需要 TIME_WAIT 状态? 4、拔掉网线后, 原本的 …...
科技云报到:科技普惠潮流渐起,“开源”将带我们走向何方?
科技云报到原创。 开源决定软件未来,已成为全球技术和产业创新的主导模式之一。“开源”思想的诞生,可以说是计算机发展史中极具理想主义和浪漫主义色彩的一页,是科技自由与技术极客思想的延伸。 数字化浪潮奔涌,从软件开发的底…...

【论文笔记】On Generative Agents in Recommendation
论文信息 标题: On Generative Agents in Recommendation 会议: SIGIR 24 —— CCF-A 作者: An Zhang, Yuxin Chen, Leheng Sheng 文章链接: On Generative Agents in Recommendation 代码链接: On Generative Agents…...
使用 Spring Boot 和 Canal 实现 MySQL 数据库同步
文章目录 前言一、背景二、Canal 简介三、主库数据库配置1.主库配置2.创建 Canal 用户并授予权限 四.配置 Canal Server1.Canal Server 配置文件2.启动 Canal Server 五.开发 Spring Boot 客户端1. 引入依赖2. 配置 Canal 客户端3. 实现数据同步逻辑 六.启动并测试七.注意事项八…...

vue3 在element-plus表格使用render-header
在vue2中 element表格render-header 源码是有返回h()函数的 在vue3 element-plus 表格源码 render-header函数没有返回h函数了 所以需要用render-header方法中创建虚拟DOM节点的话需要引用h方法 <el-table-column header-align"right" align"right" …...

算法——结合实例了解Minimax算法(极小化极大算法)
计算机科学中最有趣的事情之一就是编写一个人机博弈的程序。有大量的例子,最出名的是编写一个国际象棋的博弈机器。但不管是什么游戏,程序趋向于遵循一个被称为Minimax算法,伴随着各种各样的子算法在一块。本篇将简要介绍 minimax 算法&#…...

使用 DeepSeek 生成商城流程图
步骤 1.下载 mermaid 2.使用 DeepSeek 生成 mermaid 格式 3.复制内容到 4.保存备用。 结束。...
什么是GraphQL?
如果你在寻找漏洞利用方式,请参考下面的文章 GraphQL API 漏洞 |网络安全学院 GitHub - swisskyrepo/PayloadsAllTheThings: A list of useful payloads and bypass for Web Application Security and Pentest/CTF GraphQL 查询(Query) GraphQL 既不是…...
Spring Boot 的约定优于配置,你的理解是什么?
Spring Boot 的“约定优于配置”:开发效率的革命性提升 在软件开发中,开发者常常需要花费大量时间编写繁琐的配置文件,尤其是在传统的 Java EE 或 Spring 框架中。而 Spring Boot 通过“约定优于配置”(Convention Over Configur…...

C#开源大型商城系统之B2B2C+O2O一体化_OctShop
一、应用背景与引言 在当今数字化商业的浪潮中,电子商务平台的构建成为众多企业拓展业务、提升竞争力的关键举措。C# 语言以其强大的功能、高效的性能以及良好的开发框架支持,在商城系统开发领域占据着重要地位。独立开源的大型 C# 商城系统,…...
gitte远程仓库修改后,本地没有更新,本地与远程仓库不一致
问题 :gitte远程仓库修改后,本地没有更新,本地与远程仓库不一致 现象: [cxqiZwz9fjj2ssnshikw14avaZ rpc]$ git push Username for https://gitee.com: beihangya Password for https://beihangyagitee.com: To https://gitee.c…...
【对比】Pandas 和 Polars 的区别
Pandas vs Polars 对比表 特性PandasPolars开发语言Python(Cython 实现核心部分)Rust(高性能系统编程语言)性能较慢,尤其在大数据集上(内存占用高,计算效率低)极快,利用…...

eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)
说明: 想象一下,你正在用eNSP搭建一个虚拟的网络世界,里面有虚拟的路由器、交换机、电脑(PC)等等。这些设备都在你的电脑里面“运行”,它们之间可以互相通信,就像一个封闭的小王国。 但是&#…...

(十)学生端搭建
本次旨在将之前的已完成的部分功能进行拼装到学生端,同时完善学生端的构建。本次工作主要包括: 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...
在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能
下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能,包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...
线程同步:确保多线程程序的安全与高效!
全文目录: 开篇语前序前言第一部分:线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分:synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分ÿ…...

HTML 列表、表格、表单
1 列表标签 作用:布局内容排列整齐的区域 列表分类:无序列表、有序列表、定义列表。 例如: 1.1 无序列表 标签:ul 嵌套 li,ul是无序列表,li是列表条目。 注意事项: ul 标签里面只能包裹 li…...

vue3+vite项目中使用.env文件环境变量方法
vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量,这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决
Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中,新增了一个本地验证码接口 /code,使用函数式路由(RouterFunction)和 Hutool 的 Circle…...
laravel8+vue3.0+element-plus搭建方法
创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...
python报错No module named ‘tensorflow.keras‘
是由于不同版本的tensorflow下的keras所在的路径不同,结合所安装的tensorflow的目录结构修改from语句即可。 原语句: from tensorflow.keras.layers import Conv1D, MaxPooling1D, LSTM, Dense 修改后: from tensorflow.python.keras.lay…...

MySQL 知识小结(一)
一、my.cnf配置详解 我们知道安装MySQL有两种方式来安装咱们的MySQL数据库,分别是二进制安装编译数据库或者使用三方yum来进行安装,第三方yum的安装相对于二进制压缩包的安装更快捷,但是文件存放起来数据比较冗余,用二进制能够更好管理咱们M…...