我们今天常说的大数据技术,它的理论基础来自于2003年 Google 发表的三篇论文,《The Google File System》、《MapReduce: Simplified Data Processing on Large Clusters》、《Bigtable: A Distributed Storage System for Structured Data》。这三篇论文分别对应后来出现的 HDFS,MapReduce, HBase。

在大数据的发展历史上,还有一个名字是无论如何都绕不开的,那就是 Doug Cutting。Doug是 Apache Lucene、Nutch、Hadoop、Avro 项目的创始人,2006 年 Docu Cutting 开源了 Hadoop,名字取自于他儿子的玩具小象 Hadoop。

那么就从 Hadoop 起,我们开始本文的分享。

Taier & Yarn

Hadoop

新生事物的成长往往是螺旋上升的,Hadoop 也是如此。Hadoop 1.0 是指 MapReduce + HDFS,其中 MapReduce 是一个离线处理框架,由编程模型(新旧API)、运行时环境(JobTracker 和 TaskTracker)和数据处理引擎(MapTask和ReduceTask)三部分组成。早期的 MapReduce 非常臃肿,有着很明显的缺点,JobTracker 有单点故障问题、框架设计只能执行 MapReduce 任务,不能跑 Storm,Flink 等计算框架的任务。

之后迎来的 Hadoop 2.0 是指 MapReduce + HDFS + Yarn,其中 YARN 是一个资源管理系统,负责集群资源管理和调度, MapReduce 则是运行在 YARN 上的离线处理框架。Hadoop 2.0 很好地解决了单点问题,它将 JobTracker 中的资源管理和作业控制分开,分别由 ResourceManager 负责所有应用程序的资源分配,ApplicationMaster 负责管理一个应用程序。并且解决了扩展问题,包括针对 Hadoop 1.0 中的 MapReduce 在扩展性和多框架支持等方面的不足。

MapReduce 2.0

MapReduce 1.0的工作机制中,角色主要包括客户端,Jobtracker,Tasktracker。Jobtracker 主要是协调作业的运行,而 Tasktracker是负责运行作业划分之后的任务。网上关于 MR 1.0 的内容很多,这里就不再过多赘述,流程图如下:

到了 MapReduce 2.0,核心思想则是将 MR 1.0 中 JobTracker 的资源管理和任务调度两个功能分开,分别由 ResourceManager 和 ApplicationMaster 进程实现。

MR 2.0 的工作流程主要分为以下6个执行过程(请将图片和文字对照起来看):

一、作业的提交

1)客户端向 ResourceManager 请求一个新的作业ID,ResourceManager 收到后,回应一个 ApplicationID,见第2步

2)计算作业的输入分片,将运行作业所需要的资源(包括jar文件、配置文件和计算得到的输入分片)复制到一个(HDFS),见第3步

3)告知 ResourceManager 作业准备执行,并且调用 submitApplication() 提交作业,见第4步

二、作业的初始化

  1. ResourceManager收到对其 submitApplication() 方法的调用后,会把此调用放入一个内部队列中,交由作业调度器进行调度,并对其初始化,然后为该其分配一个 contain 容器,见第5步

5)并与对应的 NodeManager 通信,见第5a步;要求它在 Contain 中启动 ApplicationMaster ,见第5b步

  1. ApplicationMaster 启动后,会对作业进行初始化,并保持作业的追踪,见第6步

  2. ApplicationMaster 从 HDFS 中共享资源,接受客户端计算的输入分片为每个分片,见第7步

三、任务的分配

  1. ApplicationMaster 向 ResourceManager 注册,这样就可以直接通过 RM 查看应用的运行状态,然后为所有的 map 和 reduce 任务获取资源,见第8步

四、任务的执行

  1. ApplicationMaster 申请到资源后,与 NodeManager 进行交互,要求它在 Contain 容器中启动执行任务,见第9a、9b步

五、进度和状态的更新

10)各个任务通过 RPC 协议 umbilical 接口向 ApplicationMaster 汇报自己的状态和进度,方便 ApplicationMaster 随时掌握各个任务的运行状态,用户也可以向 ApplicationMaster 查询运行状态

六、作业的完成

11)应用完成后,ApplicationMaster 向 ResourceManager 注销并关闭自己

手写一个 Yarn 程序

如果想要将一个新的应用程序运行在 YARN 之上,通常需要编写两个组件:客户端和 ApplicationMaster。

· 客户端编写需要注意:客户端通常只需与 ResourceManager 交互,期间涉及到多个数据结构和一个 RPC 协议。

· ApplicationMaster 编写需要注意:ApplicationMaster 需要与 ResoureManager 和 NodeManager 交互,以申请资源和启动 Container,期间涉及到多个数据结构和两个 RPC 协议

手写一个 YARN Application 程序对理解 YARN 的运行原理非常有帮助,熟悉 Spark 、Flink 计算组件的同学也可以参考 Spark on Yarn、Flink on Yarn 的源代码。

Taier&Yarn

洋洋洒洒,回过头来,现在来给大家介绍一下 Taier 和 Yarn 之间的关系。

Taier 作为一站式大数据任务调度引擎,是数栈数据中台整体架构的重要枢纽,负责调度日常庞大的任务量。它旨在降低ETL开发成本,提高大数据平台稳定性,让大数据开发人员可以在 Taier 直接进行业务逻辑的开发,而不用关心任务错综复杂的依赖关系与底层的大数据平台的架构实现,将工作的重心更多地聚焦在业务之中。

为了更好地实现让数据开发人员关注业务的目标,Taier 主要在控制台中展示了 Hadoop Yarn的相关信息。分为以下3点:Yarn 配置管理、Yarn 资源管理、任务 on Yarn 的相关配置。

下面为大家展示一下 Taier 中 Yarn 相关的页面:

实现原理

前情提要全部讲完,下面为大家重点介绍下 Taier 怎么实现 MR on Yarn 的计算。

Taier 目前支持22种任务类型,支持在 Yarn 上运行的任务有 python、shell、数据同步、实时采集、Flink Jar、Flink SQL、Spark SQL 和 Hadoop MR 等等。

实现原理

以 MR on Yarn 任务为例,其实现原理主要有2个关键步骤:

· 组装任务运行时的相关信息生成 pluginInfo,信息包含任务相关配置、YARN 配置、HDFS 配置和公共配置。

· 根据 pluginInfo 实例化相应的任务提交客户端,客户端负责向 YARN 提交任务,实现了 Taier 与计算集群的解耦、保证节点无侵入。

下图是目前已经在 Taier 上运行的 Flink 任务的一些参数,包括 groupName、jobID 等:



执行原理

以 MR on Yarn 任务为例,其执行原理可以分为以下3个阶段:

● 准备阶段

· 对普通的 Hadoop MR 任务进行改造,修改 MR 代码的 Main 方法

· 编译修改后的 Hadoop MR 任务,并通过 Taier 的资源上传功能将 Jar 进行上传,目标选择 HDFS

· 配置 Haddoop MR 任务的任务参数

● 运行阶段

· Taier 的 worker-plugin 主要负责任务提交相关工作,其中 hadoop 插件会负责 MR 任务的相关处理

· 实例化 HadoopClient,并下载准备阶段上传的 MR 任务对应的 Jar(注意这里是一个任务的生命周期,为了保障任务的无状态,所以每次运行都会重新下载一次)

· 通过 MapReduceTemplate ,加载 Jar 并构建 MR 任务的类加载器

· 通过类加载器实获取 Class 类对象,并调用类对象的 Main 方法,传入 Configuration、args 等参数

· 返回 JobId

● 运维阶段

· 处理 JobId 并转化为 ApplicationId

· 实例化 YarnClient,获取 MR on Yarn 的相关信息,包括运行状态、日志、停止 Application

Taier 中的 Hadoop 插件

Hadoop MR 的任务在 Taier 中的实现是基于 Hadoop 的插件,在里面实现了相关的类,其中比较主要的包括:

· HadoopClient: 实现任务提交运行的相关接口(init、judgeSlots、processSubmitJobWithType、beforeSubmitFunc、afterSubmitFunc、getJobStatus、getJobLog、cancelJob)

· MapReduceTemplate:封装 MR 任务及其重要参数、方法,实例化 PackagedProgram

· PackagedProgram:MR 任务提交前的处理实现

这一部分相关的代码可以在 PR 中的上下文看到,也可以下载 Taier 插件看到关键类所做的事件,如何相互配合实现 MR 任务往 Yarn 上进行提交。

相关PR:

https://github.com/DTStack/Taier/pull/983

案例演示

案例演示的部分,大家直接观看视频,会得到最直观清楚的讲解,本文就不再进行赘述。

视频链接:

https://www.bilibili.com/video/BV1ag4y1n7bT/?spm_id_from=333.999.0.0







视频课程&PPT获取

视频课程:

https://www.bilibili.com/video/BV1ag4y1n7bT/?spm_id_from=333.999.0.0

课件获取:

关注公众号 “数栈研习社” ,后台私信 “Taier” 获得直播课件

《数据治理行业实践白皮书》下载地址:https://fs80.cn/380a4b

想了解或咨询更多有关袋鼠云大数据产品、行业解决方案、客户案例的朋友,浏览袋鼠云官网:https://www.dtstack.com/?src=szbky

同时,欢迎对大数据开源项目有兴趣的同学加入「袋鼠云开源框架钉钉技术qun」,交流最新开源技术信息,qun号码:30537511,项目地址:https://github.com/DTStack

深入理解 Taier:MR on Yarn 的实现原理的更多相关文章

  1. Spark基本工作流程及YARN cluster模式原理(读书笔记)

    Spark基本工作流程及YARN cluster模式原理 转载请注明出处:http://www.cnblogs.com/BYRans/ Spark基本工作流程 相关术语解释 Spark应用程序相关的几 ...

  2. 深入理解python虚拟机:调试器实现原理与源码分析

    深入理解python虚拟机:调试器实现原理与源码分析 调试器是一个编程语言非常重要的部分,调试器是一种用于诊断和修复代码错误(或称为 bug)的工具,它允许开发者在程序执行时逐步查看和分析代码的状态和 ...

  3. 【Hadoop】YARN 原理、MR本地&YARN运行模式

    1.基本概念 2.YARN.MR交互流程 3.源码解读

  4. 深入理解javascript作用域系列第一篇——内部原理

    × 目录 [1]编译 [2]执行 [3]查询[4]嵌套[5]异常[6]原理 前面的话 javascript拥有一套设计良好的规则来存储变量,并且之后可以方便地找到这些变量,这套规则被称为作用域.作用域 ...

  5. 学一点 mysql 双机异地热备份----快速理解mysql主从,主主备份原理及实践

    双机热备的概念简单说一下,就是要保持两个数据库的状态 自动同步.对任何一个数据库的操作都自动应用到另外一个数据库,始终保持两个数据库数据一致. 这样做的好处多. 1. 可以做灾备,其中一个坏了可以切换 ...

  6. 深入理解JVM(六)——类加载器原理

    我们知道我们编写的java代码,会经过编译器编译成字节码文件(class文件),再把字节码文件装载到JVM中,映射到各个内存区域中,我们的程序就可以在内存中运行了.那么字节码文件是怎样装载到JVM中的 ...

  7. yarn的工作原理

    1.YARN 是什么? 从业界使用分布式系统的变化趋势和 hadoop 框架的长远发展来看,MapReduce的 JobTracker/TaskTracker 机制需要大规模的调整来修复它在可扩展性, ...

  8. 深入理解 Laravel 中 config 配置加载原理

    Laravel的配置加载其实就是加载config目录下所有文件配置.如何过使用php artisan config:cache则会把加载的配置合并到一个配置文件中,下次请求就不会再去加载config目 ...

  9. 快速理解mysql主从,主主备份原理及实践

    感谢大家在上一篇 学一点Git--20分钟git快速上手 里的踊跃发言.这里再次分享干货, 简单介绍mysql双机,多机异地热备简单原理实战. 双机热备的概念简单说一下,就是要保持两个数据库的状态自动 ...

  10. 深入理解Java中的HashMap的实现原理

    HashMap继承自抽象类AbstractMap,抽象类AbstractMap实现了Map接口.关系图例如以下所看到的: Java中的Map<key, value>接口同意我们将一个对象作 ...

随机推荐

  1. Delphi 检测鼠标键盘多久没有活动

    function GetInputAwayTime():DWORD; var lpi:TLastInputInfo; begin lpi.cbSize := sizeof(lpi); GetLastI ...

  2. 从客户端(XXX)中检测到有潜在危险的 Request.Form 值

    维护别人的某功能模块的时候,页面返回如下错误信息: [HttpRequestValidationException (0x80004005): 从客户端(TextBox1="<?xml ...

  3. MySQL 的索引类型有哪些?

    MySQL 的索引类型 MySQL 提供多种索引类型,用于优化数据查询性能.每种索引类型在存储结构.适用场景和性能特性方面各不相同. 1. 常见的索引类型 (1)B+树索引 结构:基于 B+ 树实现, ...

  4. 『Plotly实战指南』--样式定制高级篇

    在数据可视化领域,Plotly不仅是高效的绘图工具,更是设计师的创意画布. 当基础图表已无法满足品牌化需求时,样式定制能力将成为数据叙事的关键武器. 深入的样式定制能够帮助我们打造品牌化图表.实现精准 ...

  5. C#基础——超级方便的ExpandoObject类别

    这东西是.NET Framework 4.5 的新东西..发现这个,大概就跟发现新大陆一样的兴奋,让我再次赞叹Anders Hejlsberg 之神.. 这边有MSDN : http://msdn.m ...

  6. EF Core 10 现已支持 LeftJoin 和 RightJoin 运算符查询了!

    前言 最近发现 EF Core 10 中的新增功能引入了在 LINQ 中支持 LeftJoin 和 RightJoin 运算符查询的新功能.在 EF Core 10 之前,开发人员需要通过复杂的组合查 ...

  7. smail log插桩(模板)

    即插即用 后面都用hook了,但是为了方便,还是分享下吧 Log const-string v0, "MYTAG" const-string v1, "Message&q ...

  8. 【HUST】网络攻防实践|TCP会话劫持+序列号攻击netcat对话

    文章目录 一.前言 1. 实验环境 2. 攻击对象 3. 攻击目的 4. 最终效果 docker的使用 新建docker docker常用指令 二.正式开始 过程记录 1. ARP欺骗 2. 篡改数据 ...

  9. k8s之ingress反向代理pod

    Ingress controller Nginx -->后来改造 Traefik -->也是用于微服务 Envoy  -->微服务 Ingress资源 目前使用0.17.1版本ing ...

  10. vue3 基础-自定义指令 directive

    上篇内容是关于 mixin 混入的一些操作, 也是关于代码复用层面的, 本篇讲自定义指令 directive 也是为了实现复用而设计的一些小功能啦. 先来看看, 如果不用 directive 的场景下 ...