Tez是Apache开源的支持DAG作业的计算框架,是支持HADOOP2.x的重要引擎。它源于MapReduce框架,核心思想是将Map和Reduce两个操作进一步拆分,分解后的元操作可以任意灵活组合,产生新的操作,这些操作经过一些控制程序组装后,可形成一个大的DAG作业。
Tez将Map task和Reduce task进一步拆分为如下图所示,
Tez的task由Input、processor、output阶段组成,可以表达所有复杂的map、reduce操作,如下图,
举个栗子看优势,直接看下图,Tez可以将多个有依赖的作业转换为一个作业(这样只需写一次HDFS,且中间节点较少),从而大大提升DAG作业的性能。Tez已被Hortonworks用于Hive引擎的优化,经测试,性能提升约100倍。
Tez对外提供了6种可编程组件,分别是:
1)Input:对输入数据源的抽象,它解析输入数据格式,并吐出一个个Key/value
2)Output:对输出数据源的抽象,它将用户程序产生的Key/value写入文件系统
3)Paritioner:对数据进行分片,类似于MR中的Partitioner
4)Processor:对计算的抽象,它从一个Input中获取数据,经处理后,通过Output输出
5)Task:对任务的抽象,每个Task由一个Input、Ouput和Processor组成
6)Maser:管理各个Task的依赖关系,并按顺依赖关系执行他们
除了以上6种组件,Tez还提供了两种算子,分别是Sort(排序)和Shuffle(混洗),为了用户使用方便,它还提供了多种Input、Output、Task和Sort的实现,具体如下:
1)Input实现:LocalMergedInput(文件本地合并后作为输入),ShuffledMergedInput(远程拷贝数据且合并后作为输入)
2)Output实现:InMemorySortedOutput(内存排序后输出),LocalOnFileSorterOutput(本地磁盘排序后输出),OnFileSortedOutput(磁盘排序后输出)
3)Task实现:RunTimeTask(非常简单的Task,基本没做什么事)
4)Sort实现:DefaultSorter(本地数据排序),InMemoryShuffleSorter(远程拷贝数据并排序)
为了展示Tez的使用方法和验证Tez框架的可用性,Apache在YARN MRAppMaster基础上使用Tez编程接口重新设计了MapReduce框架,使之可运行在YARN中。为此,Tez提供了以下几个组件:
1)Input:SimpleInput(直接使用MR InputFormat获取数据)
2)Output:SimpleOutput(直接使用MR OutputFormat获取数据)
3)Partition:MRPartitioner(直接使用MR Partitioner获取数据)
4)Processor:MapProcessor(执行Map Task),ReduceProcessor(执行Reduce Task)
5)Task:FinalTask,InitialTask,initialTaskWithInMemSort,InitialTaskWithLocalSort ,IntermediateTask,LocalFinalTask,MapOnlyTask。
对于MapReduce作业而言,如果只有Map Task,则使用MapOnlyTask,否则,Map Task使用InitialTaskWithInMemSort而Reduce Task用FinalTask。当然,如果你想编写其他类型的作业,可使用以上任何几种Task进行组合,比如”InitialTaskWithInMemSort –> FinalTask”是MapReduce作业。
为了减少Tez开发工作量,并让Tez能够运行在YARN之上,Tez重用了大部分YARN 中MRAppMater的代码,包括客户端、资源申请、任务推测执行、任务启动等。
Tez+Hive与Impala均可用于解决Hive/Pig延迟大、性能低效的问题,Impala的出发点是抛弃MapReduce计算框架,不再将SQL或者PIG语句翻译成MR程序,而是采用传统数据数据库的方式,直接从DataNode上存取数据,而Tez+Hive则不同,Tez+Hive仍采用MapReduce计算框架,但对DAG的作业依赖关系进行了裁剪,并将多个小作业合并成一个大作业,这样,不仅计算量减少,而且写HDFS次数也会大大减少。