Hadoop集群(HDFS集群、YARN集群、MapReduce​计算框架)

ops/2024/12/28 11:25:15/

一、 简介

Hadoop主要在分布式环境下集群机器,获取海量数据的处理能力,实现分布式集群下的大数据存储和计算。

其中三大核心组件HDFS存储分布式文件存储、YARN分布式资源管理、MapReduce分布式计算。

二、工作原理

2.1 HDFS集群

Web访问地址:http://hadoop1:9870

HDFS由NameNode(主节点)、SecondaryNameNode(辅助节点)、DataNode(从节点)构成,

其中NameNode负责管理整个HDFS集群,SecondaryNameNode辅助NameNode管理元数据,DataNode负责存储实际的数据块(一个block块默认大小128MB)和对数据块的读、写操作。

2.1.1 block数据块

  • 基本存储单位(一般64M)
  • 一个大文件会被拆分成多个block块,然后存储到不通机器上
  • 每块会备份到其他机器上,保证数据安全性,防止数据丢失(默认备份3份)。

2.1.2 NameNode

  • 管理文件系统命名空间和客户端对文件访问
  • 保存文件具体信息(文件信息、文件拆分block块信息、以及block和DataNode的信息)
  • 接收用户请求

2.1.3 DataNode

  • 保存具体的block数据
  • 负责数据的读写操作和复制操作
  • 向NameNode报告当前存储或者修改的数据信息
  • DataNode之间进行相互通信,复制数据块

2.1.4 Secondary NameNode

  • 定时与NameNode进行同步(合并fsimage和edits文件)
  • 当NameNode失效时,需要手工将其设置成主机

2.1.5 文件写入步骤

    1. Client(客户端)请求namenode保存文件。
    2. NameNode接收到客户端请求后, 会校验客户端针对该文件是否有写的权利,文件是否存在,校验通过后告知客户端可以上传。
    3. 接收到可以上传的指令后, 客户端会按照128MB(默认)对文件进行切块。
    4. Client(客户端)再次请求namenode, 第1个Block块的上传位置。
    5. namenode会根据副本机制, 负载均衡, 机架感知原理及网络拓扑图, 返回给客户端存储该Block块的DataNode列表。
        例如: node1, node2, node3;
    6. Client(客户端)会先连接就近的datanode机器, 然后依次和其他的datanode进行连接, 形成传输管道(Pipeline);
    7. 采用数据报包(DataPacket)的形式传输数据, 每个包的大小不超过64KB, 并建立反向应答机制(ACK机制);
    8. 具体的上传动作: node1 -> node2 -> node3,  ACK反向应答机制: node3 => node2 => node1。
    9. 重复上述的步骤, 直至第1个Block块上传完毕。
   10. 第一个Bloc上传完毕客户端(Client)重新请求第二个Block的上传位置, 重复上述动作, 直至所有的Block块传输完毕。

至此, HDFS写数据流程结束。

2.1.6 文件读取步骤

 1. Client(客户端)请求namenode, 读取文件。
 2. NameNode校验该客户端是否有读权限, 及该文件是否存在, 校验成功后, 会返回给客户端该文件的块信息。
        例如:
            block1: node1, node2, node5
            block2: node3, node6, node8
            block3: node2, node5, node6     这些地址都是鲜活的;
            ......
    3. Client(客户端)会连接上述的机器(节点), 并行的从中读取块的数据。
    4. Client(客户端)读取完毕后, 会循环NameNode获取剩下所有的(或者部分的块信息), 并行读取, 直至所有数据读取完毕。
    5. Client(客户端)根据Block块编号, 把多个Block块数据合并成最终文件即可。

2.1.7 数据备份

  1. NameNode负责管理block块的复制,它周期性地接收集群中所有DataNode的心跳数据包和Blockreport。心跳包表示DataNode正常工作,Blockreport描述了该DataNode上所有的block组成的列表。
  2. HDFS采用一种称为rack-aware的策略来决定备份数据的存放。通过一个称为Rack Awareness的过程,NameNode决定每个DataNode所属rack id。缺省情况下,一个block块会有三个备份,一个在NameNode指定的DataNode上,一个在指定DataNode非同一rack的DataNode上,一个在指定DataNode同一rack的DataNode上。这种策略综合考虑了同一rack失效、以及不同rack之间数据复制性能问题。
  3. 为了降低整体的带宽消耗和读取延时,HDFS会尽量读取最近的副本。如果在同一个rack上有一个副本,那么就读该副本。如果一个HDFS集群跨越多个数据中心,那么将首先尝试读本地数据中心的副本。

2.1.8 HDFS工作原理

1、NameNode初始化时会产生一个edits文件和一个fsimage文件。
2、随着edits文件不断增大,当达到设定的阀值时(1个小时或写入100万次),SecondaryNameNode把edits文件和fsImage文件复制到本地,同时NameNode会产生一个新的edits文件替换掉旧的edits文件,这样以保证数据不会出现冗余。
3、SecondaryNameNode拿到这两个文件后,会在内存中进行合并成一个fsImage.ckpt的文件(这个过程称为checkpoint),合并完成后,再将fsImage.ckpt文件推送给NameNode。
4、NameNode文件拿到fsImage.ckpt文件后,会将旧的fsimage文件替换掉(并不会立刻替换,而是达到一定阈值后被替换掉),并且改名成fsimage文件。

通过以上几步则完成了edits和fsimage文件的合并,依此不断循环,从而到达保证元数据的正确性。在紧急情况下, SecondaryNameNode可以用来恢复namenode的元数据。

2.2 YARN集群

Web访问地址:http://hadoop1:8088

YARN是一个资源调度平台,负责为运算程序提供服务器运算资源,相当于一个分布式的操作平台,而Mapreduce等运算程序相当于运行在操作系统之上的应运程序。

YARN组成由ResourceManager、AppMaster进程、NodeManager组成

2.2.1 ResourceManager(主节点)

ResourceManager是master上的进程,负责整个分布式系统的资源管理和调度。会处理来自client端的请求(包括提交作业/杀死作业);启动/监控Application Master;监控NodeManager的情况,比如可能挂掉的NodeManager。

2.2.2 NodeManager(从节点)

负责接收并执行ResourceManager分配的计算任务。相对应的,NodeManager时处在slave节点上的进程,他只负责当前slave节点的资源管理和调度,以及task的运行。他会定期向ResourceManager回报资源/Container的情况(heartbeat);接受来自ResourceManager对于Container的启停命令。

2.2.3 AppMaster进程

每一个提交到集群的作业都会有一个与之对应的Application Master来负责应用程序的管理。他负责进行数据切分;为当前应用程序向ResourceManager去申请资源(也就是Container),并分配给具体的任务;与NodeManager通信,用来启停具体的任务,任务运行在Container中;而任务的监控和容错也是由Application Master来负责的。

        1个计算任务=1个AppMaster进程

        由该AppMaster进程来监控和管理该计算任务

2.2.4 Container

它包含了Application Master向ResourceManager申请的计算资源,比如说CPU/内存的大小,以及任务运行所需的环境变量和队任务运行情况的描述。

2.3  MapReduce工作原理

MapReduce是一种分布式计算框架。MR的执行流程:

  1. MR任务分为MapTask任务 ReduceTask任务两部分, 其中MapTask任务负责:分; ReduceTask任务负责:合。

  •  1个切片(默认128MB) = 1个MapTask任务 = 1个分好区, 排好序, 规好约的磁盘文件;

    2. 先对文件进行切片, 每个切片对应1个MapTask任务, 任务内部会逐行读取数据, 交由MapTask任务来处理。
    3. MapTask对数据进行分区,排序,规约处理后, 会将数据放到1个 环形缓冲区中(默认大小: 100MB, 溢写比: 0.8), 达到80MB就会触发溢写线程。
    4. 溢写线程会将环形缓冲区中的结果写到磁盘的小文件中, 当MapTask任务结束的时候, 会对所有的小文件(10个/次)合并, 形成1个大的磁盘文件。
    5. ReduceTask任务会开启拷贝线程, 从上述的各个结果文件中, 拉取属于自己分区的数据, 进行分组、统计、聚合。
    6. ReduceTask将处理后的结果, 写到结果文件中;

  • 1个分区 = 1个ReduceTask任务 = 1个结果文件;

2.4  三者之间的关系

 客户端Client提交任务到资源管理器(ResourceManager),资源管理器接收到任务之后去NodeManager节点开启任务(ApplicationMaster), ApplicationMaster向ResourceManager申请资源, 若有资源ApplicationMaster负责开启任务即MapTask。开始干活了即分析任务,每个map独立工作,各自负责检索各自对应的DataNode,将结果记录到HDFS, DataNode负责存储,NameNode负责记录,2nn负责备份部分数据。

 


http://www.ppmy.cn/ops/145641.html

相关文章

通过交叉实现数据触底分页效果new IntersectionObserver()(html、react、vue2、vue3)中使用

react中用法 import React, { useState, useEffect, useRef } from react;const InfiniteScroll () > {const [items, setItems] useState([]);const [loading, setLoading] useState(false);const [page, setPage] useState(1);const loaderRef useRef(null);// 模拟…

FreeType矢量字符库的介绍、交叉编译以及安装

FreeType矢量字符库的介绍 FreeType 是一个开源的跨平台字体引擎库,广泛用于 Linux 嵌入式系统中实现字符显示的功能。它提供了高效的 TrueType、OpenType 和其他字体格式的解析和渲染功能,在嵌入式开发中尤其适合用来绘制矢量字体和位图字体。 FreeTy…

全面Kafka监控方案:从配置到指标

文章目录 1.1.监控配置1.2.监控工具1.3.性能指标系统相关指标GC相关指标JVM相关指标Topic相关指标Broker相关指标 1.4.性能指标说明1.5.重要指标说明 1.1.监控配置 开启JMX服务端口:kafka基本分为broker、producer、consumer三个子项,每一项的启动都需要…

`we_chat_union_id IS NOT NULL` 和 `we_chat_union_id != ‘‘` 这两个条件之间的区别

文章目录 1、什么是空字符串?2、两个引号之间加上空格 好的,我们来详细解释一下 we_chat_union_id IS NOT NULL 和 we_chat_union_id ! 这两个条件之间的区别,以及它们在 SQL 查询中的作用: 1. we_chat_union_id IS NOT NULL 含…

计算机的错误计算(一百九十三)

摘要 用两个大模型化简计算 其中有关数字取弧度,结果保留5位有效数字。一个大模型进行了一次化简,另外一个大模型没有化简。两个大模型​​​​​均给出错误结果。 例1. 化简计算 其中有关数字取弧度,结果保留5位有效数字。 下面是与一个…

es6 字符串每隔几个中间插入一个逗号

const insertCommaEveryNChars (str, n) > {// 将字符串转换为数组,以便我们可以更容易地操作每个字符const chars str.split();// 使用map遍历数组,并在每隔n个字符后插入逗号const result chars.map((char, index) > {// 检查当前位置是否是n…

网络安全等级自我评价

大家查看之后觉得有意义及帮助记得关注加点赞!!! 很多人觉得网络安全很模糊,很多从事网络安全的同僚,觉得网络安全很杂、自己也不知道自己到底处在哪一阶层,我通过百度、行业了解整理、专业人士的沟通和探…

4-Gin HTML 模板渲染 --[Gin 框架入门精讲与实战案例]

HTML 模板渲染 下面是使用 Gin 框架在 Go 语言中进行 HTML 模板渲染的四个示例。每个示例都包含了必要的注释来解释代码的作用。 示例1:基本模板渲染 package mainimport ("github.com/gin-gonic/gin""net/http" )func main() {r : gin.Defa…