【转载】Apache Tez 了解

你可能据说过Apache Tez,它是一个针对Hadoop数据处理应用程序的新分布式执行框架。可是它究竟是什么呢?它的工做原理是什么?哪些人应该使用它,为何?若是你有这些疑问,那么能够看一下Bikas SahaArun Murthy提供的呈现“Apache Tez: 加速Hadoop查询处理”,在这个呈现中他们讨论了Tez的设计,它的一些突出亮点,同时还分享了经过让Hive使用Tez而不是MapReduce而得到的一些初始成果。html

Tez是Apache最新的支持DAG做业的开源计算框架,它能够将多个有依赖的做业转换为一个做业从而大幅提高DAG做业的性能。Tez并不直接面向最终用户——事实上它容许开发者为最终用户构建性能更快、扩展性更好的应用程序。Hadoop传统上是一个大量数据批处理平台。可是,有不少用例须要近乎实时的查询处理性能。还有一些工做则不太适合MapReduce,例如机器学习。Tez的目的就是帮助Hadoop处理这些用例场景。express

 


Tez项目的目标是支持高度定制化,这样它就可以知足各类用例的须要,让人们没必要借助其余的外部方式就能完成本身的工做,若是 Hive和 Pig 这样的项目使用Tez而不是MapReduce做为其数据处理的骨干,那么将会显著提高它们的响应时间。Tez构建在YARN之上,后者是Hadoop所使用的新资源管理框架。apache

设计哲学

Tez产生的主要缘由是绕开MapReduce所施加的限制。除了必需要编写Mapper和Reducer的限制以外,强制让全部类型的计算都知足这一范例还有效率低下的问题——例如使用HDFS存储多个MR做业之间的临时数据,这是一个负载。在Hive中,查询须要对不相关的key进行屡次shuffle操做的场景很是广泛,例如join - grp by - window function - order by。api

 

Tez设计哲学里面的关键元素包括:缓存

  • 容许开发人员(也包括最终用户)以最有效的方式作他们想作的事情
  • 更好的执行性能

Tez之因此可以实现这些目标依赖于如下内容性能优化

  • 具备表现力的数据流API——Tez团队但愿经过一套富有表现力的数据流定义API让用户可以描述他们所要运行计算的有向无环图 (DAG)。为了达到这个目的,Tez实现了一个结构化类型的API,你能够在其中添加全部的处理器和边,并可视化实际构建的图形。
  • 灵活的输入—处理器—输出(Input-Processor-Output)运行时模型——能够经过链接不一样的输入、处理器和输出动态地构建运行时执行器。
  • 数据类型无关性——仅关心数据的移动,不关心数据格式(键值对、面向元组的格式等)。
  • 动态图从新配置
  • 简单地部署——Tez彻底是一个客户端应用程序,它利用了YARN的本地资源和分布式缓存。就Tez的使用而言,你不须要在本身的集群上部署任何内容,仅须要将相关的Tez类库上传到HDFS上,而后使用Tez客户端提交这些类库便可。

    你甚至能够在你的集群上放置两份类库。一份用于产品环境,它使用稳定版本供全部的生产任务使用;另外一份使用最新版本,供用户体验。这两份类库相互独立,互不影响。session

  • Tez可以运行任意MR任务,不须要作任何改动。这样可以让那些如今依赖于MR的工具实现分布迁移。

接下来让咱们详细地探索一下这些表现力丰富的数据流API——看看咱们可使用它们作些什么?例如,你可使用MRR模式而不是使用多个MapReduce任务,这样一个单独的map就能够有多个reduce阶段;而且这样作数据流能够在不一样的处理器之间流转,不须要把任何内容写入HDFS(将会被写入磁盘,但这仅仅是为了设置检查点),与以前相比这种方式性能提高显著。下面的图表阐述了这个过程:架构

第一个图表展现的流程包含多个MR任务,每一个任务都将中间结果存储到HDFS上——前一个步骤中的reducer为下一个步骤中的mapper提供数据。第二个图表展现了使用Tez时的流程,仅在一个任务中就能完成一样的处理过程,任务之间不须要访问HDFS。app

Tez的灵活性意味着你须要付出比MapReduce更多的努力才能使用它,你须要学习更多的API,须要实现更多的处理逻辑。可是这还好,毕竟它和MapReduce同样并非一个面向最终用户的应用程序,其目的是让开发人员基于它构建供最终用户使用的应用程序。框架

以上内容是对Tez的概述及其目标的描述,下面就让咱们看看它实际的API。

Tez API

Tez API包括如下几个组件:

  • 有向无环图(DAG)——定义总体任务。一个DAG对象对应一个任务。
  • 节点(Vertex)——定义用户逻辑以及执行用户逻辑所需的资源和环境。一个节点对应任务中的一个步骤。
  • 边(Edge)——定义生产者和消费者节点之间的链接。

    边须要分配属性,对Tez而言这些属性是必须的,有了它们才能在运行时将逻辑图展开为可以在集群上并行执行的物理任务集合。下面是一些这样的属性:

    • 数据移动属性,定义了数据如何从一个生产者移动到一个消费者。
    • 调度(Scheduling)属性(顺序或者并行),帮助咱们定义生产者和消费者任务之间应该在何时进行调度。
    • 数据源属性(持久的,可靠的或者暂时的),定义任务输出内容的生命周期或者持久性,让咱们可以决定什么时候终止。

若是你想查看一个API的使用示例,对这些属性的详细介绍,以及运行时如何展开逻辑图,那么能够看看Hortonworks提供的这篇文章

运行时API基于输入—处理器—输出模型,借助于该模型全部的输入和输出都是可插拔的。为了方便,Tez使用了一个基于事件的模型,目的是为了让任务和系统之间、组件和组件之间可以通讯。事件用于将信息(例如任务失败信息)传递给所需的组件,将输出的数据流(例如生成的数据位置信息)传送给输入,以及在运行时对DAG执行计划作出改变等。

Tez还提供了各类开箱即用的输入和输出处理器。

这些富有表现力的API可以让更高级语言(例如Hive)的编写者很优雅地将本身的查询转换成Tez任务。

Tez调度程序

在决定如何分配任务的时候,Tez调度程序考虑了不少方面,包括:任务位置需求、容器的兼容性、集群可利用资源的总量、等待任务请求的优先级、自动并行化、释放应用程序再也不使用的资源(由于对它而言数据并非本地的)等。它还维护着一个使用共享注册对象的预热JVM链接池。应用程序能够选择使用这些共享注册对象存储不一样类型的预计算信息,这样以后再进行处理的时候就能重用它们而不须要从新计算了,同时这些共享的链接集合及容器池资源也能很是快地运行任务。

若是你想了解更多与容器重利用相关的信息,那么能够查看这里

扩展性

整体来看,Tez为开发人员提供了丰富的扩展性以便于让他们可以应对复杂的处理逻辑。这能够经过示例“Hive是如何使用Tez的”来讲明。

让咱们看看这个经典的TPC-DS查询模式,在该模式中你须要将多个维度表与一个事实表链接到一块儿。大部分优化器和查询系统都能完成该图右上角部分所描述的场景:若是维度表较小,那么能够将全部的维度表与较大的事实表进行广播链接,这种状况下你能够在Tez上完成一样的事情。

可是若是这些广播包含用户自定义的、计算成本高昂的函数呢?此时,你不可能都用这种方式实现。这就须要你将本身的任务分割成不一样的阶段,正如该图左边的拓扑图所展现的方法。第一个维度表与事实表进行广播链接,链接的结果再与第二个维度表进行广播链接。

第三个维度表再也不进行广播链接,由于它太大了。你能够选择使用shuffle链接,Tez可以很是有效地导航拓扑。

使用Tez完成这种类型的Hive查询的好处包括:

  • 它为你提供了全面的DAG支持,同时会自动地在集群上完成大量的工做,于是它可以充分利用集群的并行能力;正如上面所介绍的,这意味着在多个MR任务之间不须要从HDFS上读/写数据,经过一个单独的Tez任务就能完成全部的计算。
  • 它提供了会话可重用的容器,所以延迟低,可以尽量地避免重组。

使用新的Tez引擎执行这个特殊的Hive查询性能提高将超过100%。

路线图

  • 更加丰富的DAG支持。例如,Samza是否可以使用Tez做为其底层支撑而后在这上面构建应用程序?为了让Tez可以处理Samza的核心调度和流式需求开发团队须要作一些支持。Tez团队将探索如何在咱们的DAG中使用这些类型的链接模式。他们还想提供更好的容错支持,更加有效地数据传输,从而进一步优化性能,而且改善会话性能。
  • 考虑到这些DAG的复杂度没法肯定,须要提供不少自动化的工具来帮助用户理解他们的性能瓶颈。

总结

Tez是一个支持DAG做业的分布式执行框架。它可以垂手可得地映射到更高级的声明式语言,例如Hive、Pig、Cascading等。它拥有一个高度可定制的执行架构,于是咱们可以在运行时根据与数据和资源相关的实时信息完成动态性能优化。框架自己会自动地决定不少棘手问题,让它可以顺利地正确运行。

使用Tez,你可以获得良好的性能和开箱即用的效率。Tez的目标是解决Hadoop数据处理领域所面对的一些问题,包括延迟以及执行的复杂性等。Tez是一个开源的项目,而且已经被Hive和Pig使用。

 

转载自:http://www.cnblogs.com/rongfengliang/p/6991020.html

相关文章
相关标签/搜索