apache开源项目 -- tez

为了更高效地运行存在依赖关系的作业(比如Pig和Hive产生的MapReduce作业),减少磁盘和网络IO,Hortonworks开发了DAG计 算框架Tez。Tez是从MapReduce计算框架演化而来的通用DAG计算框架,可作为MapReduceR/Pig/Hive等系统的底层数据处理 引擎,它天生融入Hadoop 2.0中的资源管理平台YARN,且由Hadoop 2.0核心人员精心打造,势必将会成为计算框架中的后起之秀。本文将重点介绍Tez的最新进展。

 

在阅读本文之前,读者可先阅读我之前写的三篇文章了解Tez有关背景、设计原理等:

(1) 浅谈Apache Tez中的优化技术

(2) Apache Tez:一个运行在YARN之上支持DAG作业的计算框架

(3) Tez:运行在YARN上的DAG计算框架

总结起来,Tez有以下几个特色:

(1) 丰富的数据流(dataflow,NOT Streaming!)编程接口;

(2) 扩展性良好的“Input-Processor-Output”运行模型;

(3) 简化数据部署(充分利用了YARN框架,Tez本身仅是一个客户端编程库,无需事先部署相关服务)

(4) 性能优于MapReduce

(5)  优化的资源管理(直接运行在资源管理系统YARN之上)

(6) 动态生成物理数据流(dataflow)

声明:本文大部分内容源自Apache Tez官方主页中的说明文档,有兴趣的读者可进入http://tez.incubator.apache.org/了解更多内容,你也可以根据文档说明安装Tez(需要apache最新版本 2.1.0-beta或者3.0.0,CDH暂不支持,版本太老),进而对它有一个更加直观的理解。

1. 优化举例

为了方便大家理解Tez的优化效果,接下来给出两个例子 予以说明。

(1)MRR*应用

比如以下Hive SQL会翻译成两个MR作业,而采用Tez则生成一个DAG作业,可大大减少磁盘IO:

SELECT DeptName, COUNT(*) as c FROM EmployeeTable GROUP BY DeptName ORDER BY c;

apache开源项目 -- tez_第1张图片

(2)Join应用

比如以下Hive SQL会翻译成四个MR作业,而采用Tez则生成一个DAG作业,可大大减少磁盘IO:

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

apache开源项目 -- tez_第2张图片

2. 术语介绍

可类比数据库中的概念理解这些术语,比如数据库中的逻辑计划和物理计划:Job Vertex、Job Edge和Static Plan属于逻辑计划概念;Vertex、Edge和Dynamic Plan属于物理计划概念。

(1)Job Vertex:作业规划中的一个阶段(Stage);

(2) Job Edge:两个不同Job Vertex之间的逻辑关联;

(3) Vertex: 运行时生成的物化阶段,由若干个可以执行的Task构成;

(4) Edge: Task之间数据移动方式;

(5) Task: 能够完成计算任务的线程,实际运行在YARN Container中;

(6) Task cardinality: 任务基数,即Vertex产生的Task数目

(7)  Static plan: 作业提交时确定的逻辑执行计划

(8) Dynamic plan:在ApplicationMaster执行时产生的物理执行计划

3. Tez中的通信类型

(1) 1对于1

第一阶段中的任务按照1:1的映射关系将数据传递给下一个阶段中的任务,典型应用是hash join,如下图所示:

apache开源项目 -- tez_第3张图片

(2) 1对于N

第一阶段中的每个任务会产生N份数据(N是下一个阶段中的任务数目),每份数据由下一个阶段的一个任务读取,这类似与MapReduce的Shuffle阶段,具体有两种实现方式:

方式1:每个任务产生的N份数据放到N个文件中,供下一个阶段的任务直接获取,这种方式可能产生过多的文件,可能难以扩展到上千个任务的场景;

方式2:每个任务产生的N份数据放放到一个文件中,并增加一个索引文件记录每份数据中偏移量,这种方式的扩展性非常好,Hadoop MapReduce正是采用了这种实现(设计之初,Hadoop MapReduce层采用方式1中的方案)。

4. Tez新引入的优化机制

(1) 动态确定任务基数

DAG中每个Vertex需启动一定数目的任务并行处理对应的数据,Tez可根据用户设置的策略动态确定每个Vertex需启动的任务数,比如根据数据量、最大并发数等。

(2)解决数据倾斜问题

数据倾斜是分布式计算中影响数据处理效率的最大顽疾之一,很多工作在这方面开展但一直没有非常好的解决方案。目前看来,比较有效的方案是在应用程序层解决,即用户根据实际数据特点编写最有效的应用程序,尽可能避免数据倾斜问题。

数据倾斜的一种典型场景是大批量的数据的key值是相同的,这使得按key划分数据后,大量数据落到一个任务上,从而使得该任务成为“拖后腿”任 务,甚至导致运行失败。为了解决该问题,在数据引擎层面,Tez可根据每个任务的处理数据量调整占用的资源,对于那些处理数据量大的任务,可多分配一些资 源。

5. Tez未来发展

在将来,Tez将增加以下几个特性:

(1) 任务抢占,即可通过资源抢占的方式,让优先级更高的任务优先运行;

(2) 任务执行断点检查,通过对任务执行过程记录断点,可在任务失败时从断点恢复运行,以避免任务重算(这个功能难度很大);

(3) ApplicationMaster执行断点检查,这个可借鉴MapReduce ApplicationMaster实现,就目前YARN的架构设计而言,只能做到(ApplicationMaster失败后)已经完成的任务不重新计 算,对于正在运行的任务需重新计算;

(4) 应用程序的Container重用,同一个应用程序的多个任务可重用一个Container中,该功能是一个非常重要的feature,很多YARN上框架都在做!

(5)  不同应用程序的Container重用,即不同应用程序的多个任务可重用一个Container,这个功能难度较大!

6. 参考资料

(1)Tez官方网站:http://tez.incubator.apache.org/

(2)Tez官方文档:https://issues.apache.org/jira/secure/attachment/12588887/Tez%20Design%20v1.1.pdf

(3)Tez SVN:https://issues.apache.org/jira/browse/TEZ

 

 

 

参考:

http://dongxicheng.org/mapreduce-nextgen/apache-tez-newest-progress/

你可能感兴趣的:(apache开源项目 -- tez)