我们今天常说的大数据技术,它的理论基础来自于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 起,我们开始本文的分享。
新生事物的成长往往是螺旋上升的,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 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步
二、作业的初始化
5)并与对应的 NodeManager 通信,见第5a步;要求它在 Contain 中启动 ApplicationMaster ,见第5b步
ApplicationMaster 启动后,会对作业进行初始化,并保持作业的追踪,见第6步
ApplicationMaster 从 HDFS 中共享资源,接受客户端计算的输入分片为每个分片,见第7步
三、任务的分配
四、任务的执行
五、进度和状态的更新
10)各个任务通过 RPC 协议 umbilical 接口向 ApplicationMaster 汇报自己的状态和进度,方便 ApplicationMaster 随时掌握各个任务的运行状态,用户也可以向 ApplicationMaster 查询运行状态
六、作业的完成
11)应用完成后,ApplicationMaster 向 ResourceManager 注销并关闭自己
如果想要将一个新的应用程序运行在 YARN 之上,通常需要编写两个组件:客户端和 ApplicationMaster。
· 客户端编写需要注意:客户端通常只需与 ResourceManager 交互,期间涉及到多个数据结构和一个 RPC 协议。
· ApplicationMaster 编写需要注意:ApplicationMaster 需要与 ResoureManager 和 NodeManager 交互,以申请资源和启动 Container,期间涉及到多个数据结构和两个 RPC 协议。
手写一个 YARN Application 程序对理解 YARN 的运行原理非常有帮助,熟悉 Spark 、Flink 计算组件的同学也可以参考 Spark on Yarn、Flink on 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
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




视频课程:
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
我有一个用户工厂。我希望默认情况下确认用户。但是鉴于unconfirmed特征,我不希望它们被确认。虽然我有一个基于实现细节而不是抽象的工作实现,但我想知道如何正确地做到这一点。factory:userdoafter(:create)do|user,evaluator|#unwantedimplementationdetailshereunlessFactoryGirl.factories[:user].defined_traits.map(&:name).include?(:unconfirmed)user.confirm!endendtrait:unconfirmeddoenden
华为OD机试题本篇题目:明明的随机数题目输入描述输出描述:示例1输入输出说明代码编写思路最近更新的博客华为od2023|什么是华为od,od薪资待遇,od机试题清单华为OD机试真题大全,用Python解华为机试题|机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为o
C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.
最近在学习CAN,记录一下,也供大家参考交流。推荐几个我觉得很好的CAN学习,本文也是在看了他们的好文之后做的笔记首先是瑞萨的CAN入门,真的通透;秀!靠这篇我竟然2天理解了CAN协议!实战STM32F4CAN!原文链接:https://blog.csdn.net/XiaoXiaoPengBo/article/details/116206252CAN详解(小白教程)原文链接:https://blog.csdn.net/xwwwj/article/details/105372234一篇易懂的CAN通讯协议指南1一篇易懂的CAN通讯协议指南1-知乎(zhihu.com)视频推荐CAN总线个人知识总
MIMO技术的优缺点优点通过下面三个增益来总体概括:阵列增益。阵列增益是指由于接收机通过对接收信号的相干合并而活得的平均SNR的提高。在发射机不知道信道信息的情况下,MIMO系统可以获得的阵列增益与接收天线数成正比复用增益。在采用空间复用方案的MIMO系统中,可以获得复用增益,即信道容量成倍增加。信道容量的增加与min(Nt,Nr)成正比分集增益。在采用空间分集方案的MIMO系统中,可以获得分集增益,即可靠性性能的改善。分集增益用独立衰落支路数来描述,即分集指数。在使用了空时编码的MIMO系统中,由于接收天线或发射天线之间的间距较远,可认为它们各自的大尺度衰落是相互独立的,因此分布式MIMO
Transformers开始在视频识别领域的“猪突猛进”,各种改进和魔改层出不穷。由此作者将开启VideoTransformer系列的讲解,本篇主要介绍了FBAI团队的TimeSformer,这也是第一篇使用纯Transformer结构在视频识别上的文章。如果觉得有用,就请点赞、收藏、关注!paper:https://arxiv.org/abs/2102.05095code(offical):https://github.com/facebookresearch/TimeSformeraccept:ICML2021author:FacebookAI一、前言Transformers(VIT)在图
遍历文件夹我们通常是使用递归进行操作,这种方式比较简单,也比较容易理解。本文为大家介绍另一种不使用递归的方式,由于没有使用递归,只用到了循环和集合,所以效率更高一些!一、使用递归遍历文件夹整体思路1、使用File封装初始目录,2、打印这个目录3、获取这个目录下所有的子文件和子目录的数组。4、遍历这个数组,取出每个File对象4-1、如果File是否是一个文件,打印4-2、否则就是一个目录,递归调用代码实现publicclassSearchFile{publicstaticvoidmain(String[]args){//初始目录Filedir=newFile("d:/Dev");Datebeg
通常,数组被实现为内存块,集合被实现为HashMap,有序集合被实现为跳跃列表。在Ruby中也是如此吗?我正在尝试从性能和内存占用方面评估Ruby中不同容器的使用情况 最佳答案 数组是Ruby核心库的一部分。每个Ruby实现都有自己的数组实现。Ruby语言规范只规定了Ruby数组的行为,并没有规定任何特定的实现策略。它甚至没有指定任何会强制或至少建议特定实现策略的性能约束。然而,大多数Rubyist对数组的性能特征有一些期望,这会迫使不符合它们的实现变得默默无闻,因为实际上没有人会使用它:插入、前置或追加以及删除元素的最坏情况步骤复
关闭。这个问题不符合StackOverflowguidelines.它目前不接受答案。我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。关闭3年前。Improvethisquestion我正处于学习Ruby的阶段,我想查看一些小型库的源代码以了解它们是如何构建的。我不知道什么是小型图书馆,但希望SO能推荐一些易于理解的图书馆来学习。因此,如果有人知道一两个非常小的库,这是新手Rubyists学习的好例子,请推荐!我想使用Manveru'sInnatelib,因为它试图保持在2000LOC以下,但我还不熟悉其中经常使用的Ruby速记。也许大约100-5
在ruby中,你可以这样做:classThingpublicdeff1puts"f1"endprivatedeff2puts"f2"endpublicdeff3puts"f3"endprivatedeff4puts"f4"endend现在f1和f3是公共(public)的,f2和f4是私有(private)的。内部发生了什么,允许您调用一个类方法,然后更改方法定义?我怎样才能实现相同的功能(表面上是创建我自己的java之类的注释)例如...classThingfundeff1puts"hey"endnotfundeff2puts"hey"endendfun和notfun将更改以下函数定