你可能听说过 __Apache Tez_,它是一个针对 __Hadoop__ 数据处理应用程序的新分布式执行框架。但是它到底是什么呢?它的工作原理是什么?哪些人应该使用它,为什么?如果你有这些疑问,那么可以看一下 __Bikas Saha__ 和 __Arun Murthy__ 提供的呈现“ Apache Tez: 加速 __Hadoop__ 查询处理”,在这个呈现中他们讨论了 __Tez__ 的设计,它的一些突出亮点,同时还分享了通过让 __Hive__ 使用 __Tez__ 而不是 __MapReduce__ 而获得的一些初始成果。_
呈现记录由 Roopesh Shenoy 编辑
Tez 是 Apache 最新的支持 DAG 作业的开源计算框架,它可以将多个有依赖的作业转换为一个作业从而大幅提升 DAG 作业的性能。Tez 并不直接面向最终用户——事实上它允许开发者为最终用户构建性能更快、扩展性更好的应用程序。Hadoop 传统上是一个大量数据批处理平台。但是,有很多用例需要近乎实时的查询处理性能。还有一些工作则不太适合 MapReduce,例如机器学习。Tez 的目的就是帮助 Hadoop 处理这些用例场景。
Tez 项目的目标是支持高度定制化,这样它就能够满足各种用例的需要,让人们不必借助其他的外部方式就能完成自己的工作,如果 Hive 和 Pig 这样的项目使用Tez 而不是MapReduce 作为其数据处理的骨干,那么将会显著提升它们的响应时间。Tez 构建在 YARN 之上,后者是 Hadoop 所使用的新资源管理框架。
设计哲学
Tez 产生的主要原因是绕开 MapReduce 所施加的限制。除了必须要编写 Mapper 和 Reducer 的限制之外,强制让所有类型的计算都满足这一范例还有效率低下的问题——例如使用 HDFS 存储多个 MR 作业之间的临时数据,这是一个负载。在 Hive 中,查询需要对不相关的 key 进行多次 shuffle 操作的场景非常普遍,例如 join - grp by - window function - order by。
Tez 设计哲学里面的关键元素包括:
- 允许开发人员(也包括最终用户)以最有效的方式做他们想做的事情
- 更好的执行性能
Tez 之所以能够实现这些目标依赖于以下内容:
- 具有表现力的数据流 API——Tez 团队希望通过一套富有表现力的数据流定义 API 让用户能够描述他们所要运行计算的有向无环图 (DAG)。为了达到这个目的,Tez 实现了一个结构化类型的 API,你可以在其中添加所有的处理器和边,并可视化实际构建的图形。
- 灵活的输入—处理器—输出(Input-Processor-Output)运行时模型——可以通过连接不同的输入、处理器和输出动态地构建运行时执行器。
- 数据类型无关性——仅关心数据的移动,不关心数据格式(键值对、面向元组的格式等)。
- 动态图重新配置
- 简单地部署——Tez 完全是一个客户端应用程序,它利用了 YARN 的本地资源和分布式缓存。就 Tez 的使用而言,你不需要在自己的集群上部署任何内容,仅需要将相关的 Tez 类库上传到 HDFS 上,然后使用 Tez 客户端提交这些类库即可。 你甚至可以在你的集群上放置两份类库。一份用于产品环境,它使用稳定版本供所有的生产任务使用;另一份使用最新版本,供用户体验。这两份类库相互独立,互不影响。
- Tez 能够运行任意 MR 任务,不需要做任何改动。这样能够让那些现在依赖于 MR 的工具实现分布迁移。
接下来让我们详细地探索一下这些表现力丰富的数据流 API——看看我们可以使用它们做些什么?例如,你可以使用 MRR 模式而不是使用多个 MapReduce 任务,这样一个单独的 map 就可以有多个 reduce 阶段;并且这样做数据流可以在不同的处理器之间流转,不需要把任何内容写入 HDFS(将会被写入磁盘,但这仅仅是为了设置检查点),与之前相比这种方式性能提升显著。下面的图表阐述了这个过程:
第一个图表展示的流程包含多个 MR 任务,每个任务都将中间结果存储到 HDFS 上——前一个步骤中的 reducer 为下一个步骤中的 mapper 提供数据。第二个图表展示了使用 Tez 时的流程,仅在一个任务中就能完成同样的处理过程,任务之间不需要访问 HDFS。
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 使用。
关于作者
Arun Murthy 是 Apache Hadoop 下的 MapReduce 项目的领导者,自 2006 年成立以来他一直是 Apache Hadoop 项目的全职贡献者。他是一个长期的提交者,是 Apache Hadoop PMC 的成员,共同保持着目前使用 Apache Hadoop 排序的世界记录。在共同创建 Hortonworks 之前,Arun 在 Yahoo 公司负责所有的 MapReduce 代码以及 42,000+ 台服务器的配置部署工作。
Bikas Saha致力于 Apache Hadoop 项目有一年多了,他是该项目的一个提交者。对于让 Hadoop 在 Windows 系统上运行这方面他是一个关键的提交者,他关注 YARN 和 Hadoop 计算栈。在从事 Hadoop 项目之前,他在 Dryad 分布式数据处理框架上做了大量工作,该框架作为 Microsoft Bing 基础设施的一部分运行在全世界最大的一些集群上。
查看英文原文: What is Apache Tez?
评论