为了更高效地运行存在依赖关系的作业(比如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;
(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
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,如下图所示:
(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/