Tez产生背景与定位

在开源界,当前最广泛使用的计算模型是MapReduce,该模型将计算过程抽象成Map和Reduce两个阶段,并通过shuffle机制将两个阶段连接起来。但在一些应用场景中,为了套用MapReduce模型解决问题,不得不将问题分解成若干个有依赖关系的子问题,每个子问题对应一个MapReduce作业,最终所有这些作业形成一个有向图(DAG,Directed Acyclic Graph),在该DAG中,由于每个节点是一个MapReduce作业,因此它们均会从HDFS上读一次数据和写一次数据(默认写三份),即使中间节点产生的数据仅是临时数据。很显然,这种表达依赖关系作业的方式是低效的,会产生大量不必要的磁盘和网络IO。

       为了更高效地运行存在依赖关系的作业(比如Pig和Hive产生的MapReduce作业),减少磁盘和网络IO,Hortonworks开发并开源了DAG计算框架Tez[1]

在实际大数据处理场景中,很多问题需转化成DAG模型解决,典型的有两类,分别是:

  • 用户编写的应用程序:很多场景下,用户编写的多个MapReduce应用程序之间存在依赖关系或者为了使用MapReduce解决一个问题,不得不将问题转化成一系列存在依赖关系的MapReduce作业,而为了表达这些作业的依赖关系,用户通常借助于像Oozie[2]或者Cascading[3]这样的流式作业管理工具。

举例说明】  在搜索引擎领域中,常常需要统计最近最热门的K个查询词,这就是典型的“Top K”问题,也就是从海量查询中统计出现频率最高的前K个。如果采用MapReduce模型解决该问题,则可分解成两个MapReduce作业,分别完成统计词频和找出词频最高的前K个查询词的功能,这两个作业存在依赖关系,第二个作业需要依赖前一个作业的输出结果。第一个作业是典型的WordCount问题。对于第二个作业,首先map函数输出前K个频率最高的词,然后reduce函数进汇总map任务的计算结果,并输出频率最高的前K个查询词。

为了采用MapReduce计算模型解决“Top K”问题,我们不得不将整个计算过程分解成两个MapReduce作业,而是实际上,如果有一种支持MAPàREDUCEàREDUCE的计算框架,则会更加灵活高效,而Tez正式这样的计算框架,具体如图2所示。

tez与spark计算引擎的区别 tez和spark区别_依赖关系

  • 类似Pig和Hive的系统:Pig和Hive是构建在MapReduce之上的系统,它们允许用户采用更易于编写的结构化语言或者脚本语言进行大数据处理,而用户编写的结构化语言或者脚本语言往往会转化成多个存在依赖关系的MapReduce作业,这种运行方式非常的低效。

举例说明】 以下Hive语句将被转化成了四个有依赖关系的MR作业,它们的运行过程如图3所示,而使用Tez则可大大简化计算过程。

SELECT a.state, COUNT(*), AVERAGE(c.price)
  FROM a
  JOIN b ON(a.id = b.id)
  JOIN c ON(a.itemId = c.itemId)
  GROUP BY a.state

tez与spark计算引擎的区别 tez和spark区别_数据_02

通过上面的例子可以看出,Tez可以将多个有依赖的作业转换为一个作业(这样只需写一次HDFS,且中间节点较少),从而大大提升DAG作业的性能。因此在很多hive处理数据时使用tez的处理速度会更快

Tez实现原理

Tez直接源于MapReduce框架,核心思想是将Map和Reduce两个操作进一步拆分,即Map被拆分成Input、Processor、Sort、Merge和Output, Reduce被拆分成Input、Shuffle、Sort、Merge、Processor和Output等,这样,这些分解后的元操作可以灵活组合,产生新的操作,这些操作经过一些控制程序组装后,可形成一个大的DAG作业。总结起来,Tez有以下特点:

  • 运行在YARN之上;
  • 与MapReduce兼容,继承了MapReduce的各种优点(比如良好的扩展性与容错性);
  • 适用于DAG应用场景。

接下来重点介绍一下第三个特点,Apache当前有顶级项目Oozie用于DAG作业设计,但Oozie是比较高层(作业层面)的,它只是提供了一种多类型作业(比如MR程序、Hive、Pig等)依赖关系表达方式,并按照这种依赖关系提交这些作业,而Tez则不同,它在更底层提供了DAG编程接口,用户编写程序时直接采用这些接口进行程序设计,这种更底层的编程方式会带来更高的效率。

总起来说,Tez主要又两部分组成:数据处理引擎和DAGAppMaster,其中数据处理引擎提供了一套编程接口和数据计算操作符,而DAGAppMaster则是一个YARN ApplicationMaster,它使得Tez应用程序可运行在YARN上。

 

MapReduce、Spark、Storm、Tez等计算框架对比

MapReduce:是一种离线计算框架,将一个算法抽象成Map和Reduce两个阶段进行处理,非常适合数据密集型计算。

Spark:Spark是UC Berkeley AMP lab所开源的类Hadoop MapReduce的通用的并行计算框架,Spark基于map reduce算法实现的分布式计算,拥有Hadoop MapReduce所具有的优点;但不同于MapReduce的是Job中间输出和结果可以保存在内存中,从而不再需要读写HDFS,因此Spark能更好地适用于数据挖掘与机器学习等需要迭代的map reduce的算法。

Storm:MapReduce也不适合进行流式计算、实时分析,比如广告点击计算等。Storm是一个免费开源、分布式、高容错的实时计算系统。Storm令持续不断的流计算变得容易,弥补了Hadoop批处理所不能满足的实时要求。Storm经常用于在实时分析、在线机器学习、持续计算、分布式远程调用和ETL等领域

Tez: 是基于Hadoop Yarn之上的DAG(有向无环图,Directed Acyclic Graph)计算框架。它把Map/Reduce过程拆分成若干个子过程,同时可以把多个Map/Reduce任务组合成一个较大的DAG任务,减少了Map/Reduce之间的文件存储。同时合理组合其子过程,也可以减少任务的运行时间

在实际应用中如果使用tez或者spark计算时出现内存溢出的问题,可以考虑使用MR进行运算,虽然慢但是肯定会出结果;