MapReduce&Yarn理论
前言
- 安装zookeeper请参考Linux - zookeeper集群搭建
- zookeeper基本使用请参考zookeeper命令与API
- Hadoop理论学习请参考Hadoop理论
- HDFS理论学习请参考HDFS理论
- 安装HDFS请参考Linux -HDFS部署
- HDFS基本使用请参考HDFS命令与API
MapReduce
Hadoop MapReduce是数据处理层。它处理存储在 HDFS 中的大量结构化和非结构化数据
MapReduce 通过将作业划分为一组独立的任务来并行处理数据。因此,并行处理提高了速度和可靠性
Hadoop MapReduce 数据处理分两个阶段进行 Map 和 Reduce 阶段:
- map阶段——这是数据处理的第一阶段。在这个阶段,我们指定所有复杂的逻辑/业务规则/昂贵的代码
- Reduce阶段——这是处理的第二阶段。在这个阶段,我们指定轻量级处理,如聚合/求和
MapReduce架构
MRv1角色
Client
- 作业为单位
- 规划作业计算分布
- 提交作业资源到HDFS
- 最终提交作业到JobTracker
JobTracker
- 核心,主,单点
- 调度所有的作业
- 监控整个集群的资源负载
TaskTracker
- 从,自身节点资源管理
- 和JobTracker心跳,汇报资源,获取Task
弊端
- JobTracker:负载过重,单点故障
- 资源管理与计算调度强耦合,其他计算框架需要重复实现资源管理
- 不同框架对资源不能全局管理
MapReduce执行流程
- 客户端提交一个MapReduce的jar包给JobClient(提交方式:hadoop jar …)
- JobClient通过RPC和JobTracker)进行通信,返回一个存放jar包的地址(HDFS)和JobId
- Client将运行作业所需要的资源(包括JAR文件、配置文件和计算所得的输入分片)复制到HDFS中的以作业id命名的目录下(Path = HDFS上的地址 + JobId)
- 开始提交任务(任务的描述信息,不是jar,包括Jobid,jar存放的位置,配置信息等等)
- JobTracker进行初始化任务
- 读取HDFS上的要处理的文件,开始计算输入分片,每一个分片对应一个MapperTask
- TaskTracker通过心跳机制领取任务(任务的描述信息)
- 下载所需的jar,配置文件等
- TaskTracker启动一个Java Child子进程
- 用来执行具体的任务(MapperTask或ReducerTask)将结果写入到HDFS当中
MapReduce工作流程
-
InputFiles - 文件输入
在输入文件中存储 MapReduce 作业的数据。在HDFS中,输入文件驻留,输入文件格式是任意的,还可以使用基于行的日志文件和二进制格式 -
InputFormat - 文件格式化
InputFormat 定义如何分割和读取这些输入文件,它选择要输入的文件或其他对象,InputFormat 创建 InputSplit -
Splits - 切片
它表示将由单个Mapper处理的数据。对于每一次拆分,都会创建一个map任务,因此map任务的数量等于 Split 的数量,框架划分为记录,由 Mapper 处理 -
RecordReader - 记录阅读
它与 Split 通信。然后将数据转换成适合 Mapper 读取的键值对,RecordReader 默认使用 TextInputFormat 将数据转换为键值对,直到文件读取完成,它将字节偏移量分配给文件中存在的每一行,然后这些键值对被进一步发送到 Mapper 进一步处理 -
Mapper - 映射
它处理由 RecordReader 产生的输入记录,并生成中间的键值对,中间输出完全不同于输入对,Mapper 的输出是键值对的完整集合
Hadoop 框架不会将mapper的输出存储在HDFS上,因为数据是临时的,写入HDFS会创建不必要的多个副本,然后Mapper将输出传递给 Combiner 进行进一步处理 -
Combiner - 合并
Combiner 是 Mini-reducer,它对 Mapper 的输出执行局部聚合,它最大限度地减少了 Mapper 和 Reducer 之间的数据传输,因此,当合并功能完成时,框架将输出传递给 Partitioner 进行进一步处理 -
Partitioner - 分区
如果我们使用多个 Reducer 时,Partitioner 就会出现,它获取 Combiner 的输出并执行分区
根据MapReduce中的键对输出进行分区,通过散列函数,key(或key的子集)派生分区
根据MapReduce中的键值,对每个 Combiner 输出进行分区,然后具有相同键值的记录进入相同的分区,之后每个分区被发送到 Reducer ,MapReduce执行中的分区允许 Mapper 输出均匀分布到 Reducer 上 -
Shuffling and Sorting - 洗牌和排序
分区后,输出被转移到 Reducer 节点,洗牌是数据在网络上的物理移动,当所有 Mapper 完成后,在 Reducer 上调整输出,然后,框架将这些中间输出合并并排序,然后将其作为 Reducer 的输入 -
Reducer - 归约
然后Reducer 将 Mapper 生成的一组中间键值对作为输入,之后在它们中运行一个 Reducer 函数来生成输出,Reducer 的输出就是最终输出,然后框架将输出存储在HDFS上 -
RecordWriter - 记录写入
它将这些输出键值对从 Reducer 阶段写入输出文件 -
OutputFormat - 输出格式
OutputFormat 定义了 RecordReader 在输出文件中写入这些输出键值对的方式,Hadoop提供实例向HDFS中写入文件,因此OutputFormat 实例将 Reducer 的最终输出写入HDFS
Yarn
Hadoop 2.0新引入的资源管理系统,从MRv1演化而来的
YARN 由 ResourceManager、NodeManager 和每个应用程序的 ApplicationMaster 组成
将MRv1中JobTracker的资源管理和任务调度两个功能分开,分别由 ResourceManager 和 ApplicationMaster 进程实现
Yarn架构
MRv2角色
Client - 客户端:提交 MapReduce 作业
Resource Manager - 资源管理器:它是YARN的主守护进程,负责所有应用程序之间的资源分配和管理。无论何时接收到处理请求,它都会将其转发给相应的节点管理器,并分配相应的资源以完成请求。它有两个主要组成部分
- Scheduler - 调度器:它根据分配的应用程序和可用资源执行调度。它是一个纯粹的调度器,意味着它不执行其他任务,如监视或跟踪,并且不保证在任务失败时重新启动。YARN调度器支持使用Capacity scheduler、Fair scheduler等插件对集群资源进行分区
- Application Manager - 应用程序管理器:它负责接受应用程序并协商来自 ResourceManager 的第一个容器。如果任务失败,它还会重新启动Application Master容器
Node Manager - 节点管理器:它负责Hadoop集群上的单个节点,并管理应用程序和工作流以及特定的节点,主要工作是与 ResourceManager 保持同步,向 ResourceManager 注册,并发送带有节点健康状态的心跳,监视资源使用情况,执行日志管理,并根据 ResourceManager 的指示杀死容器,还负责创建容器进程,并根据应用程序主进程的请求启动它
Application Master - 应用程序:Application 是提交给框架的单个作业,Application 负责与 ResourceManager 协商资源,跟踪单个Application 的状态和进度,Application 通过发送包含应用程序运行所需的所有内容的容器启动上下文(container Launch Context, CLC)从 NodeManager 请求容器,启动应用程序后,它会不时向 ResourceManager 发送运行状况报告
Container - 容器:它是单个节点上的 RAM、CPU 内核和磁盘等物理资源的集合,容器由容器启动上下文(CLC)调用,这是一个包含环境变量、安全令牌、依赖项等信息的记录
Yran执行流程
- 客户端提交应用程序
- 资源管理器分配一个容器来启动应用程序管理器
- 应用程序管理器向资源管理器注册自己
- 应用程序管理器从资源管理器协商容器
- 应用程序管理器通知节点管理器启动容器
- 应用程序代码在容器中执行
- 客户端联系资源管理器/应用程序管理器以监视应用程序的状态
- 处理完成后,应用程序管理器取消对资源管理器的注册
参考
本文参考
https://techvidvan.com/tutorials/mapreduce-job-execution-flow/
https://www.geeksforgeeks.org/hadoop-yarn-architecture/
本专栏为大数据学习专栏,如有问题还望指出,共同学习!