Tez 简介

2022-09-01

Tez 是一个处理复杂 DAG 数据处理任务的应用框架,它构建在 Hadoop Yarn 之上。Tez 是由 Hortonworks 牵头开发的计算框架。

下图是 Pig/Hive 在原 MR 框架和 Tez 框架上的比较图。MapReduce 是通用的分布式并行计算框架,由 Map 和 Reduce 两类简洁的接口来表示丰富的数据处理任务,但是也遇到一些挑战,在运行复杂任务时会生成多个 MapReduce 作业,作业直接的数据传输时通过分布式文件系统传递完成,也就是作业之间的数据会落盘,如下左图标记所示,这种设计提高了整体任务的稳定性也相应地增加了整体任务的执行时间。而且对于处理数据量少,启动和终止 MR 作业的开销显得就很高。

Pig/Hive on MR Pig/Hive on Tez

一般的 MapReduce 任务的步骤如下:

  1. 从文件中读取数据(第一次磁盘操作);
  2. 执行 mapper 任务;
  3. 写入 mapper 任务结果(第二次磁盘操作);
  4. 执行 shuffle 和 sort(读取 mapper 输出,第三次磁盘操作);
  5. 写入 shuffle 和 sort 结果(写入 sort 后的结果,第四次磁盘操作);
  6. 读取 sort 的结果执行 reducer 任务(第五次磁盘操作);
  7. 写入 reducer 任务结果(第六次磁盘操作);

DAG 可以看做是 MapReduce 之后的新一代计算模型,Spark 和 Tez 都是基于 DAG 模型,他们都受到微软提出的 Dryad 系统的影响。Tez 的操作和 Spark 很像,只有一次读和一次写磁盘操作,中间结果都是存在内存中。Tez 的执行快还有向量化的功劳,可以并行执行一批数据而不是一条一条处理。Tez 的主要步骤如下

  1. 执行 plan 但是没必要从磁盘读取数据;
  2. 需要做计算的时候(类似 Spark 中的 action 算子),从磁盘读取数据执行所有的步骤并输出结果;

Tez 目前主要和 Hive 组合使用,在 Hive 中用 set hive.execution.engine=tez; 开启使用。Tez 提供两种 API:

  • DAG API:使用 DAG 图来表示复杂数据流结构的 API;
  • Runtime API:转换数据,指定每个任务具体的执行内容;

Tez 组件

Tez AppMaster 负责调用 Yarn 分配的容器去完成任务,负责处理暂时失败的容器,负责和 Yarn ResourceManager 沟通分配和释放容器。 Tez AppMaster 对一个任务来说有单点失败的问题。

Tez AppMaster and Task Container

下面是 Tez 的几个常用参数,这边是 0.9.1 版本的参数列表

  1. tez.am.resource.memory.mb:tez AppMaster 内存,如果报出 out-of-memory(OOM) 的错误,可以调高这个参数,调整成 yarn.scheduler.minimum-allocation-mb 的整数倍, 别超过 yarn.scheduler.maximum-allocation-mb 。一般设置 tez.am.resource.memory.mb=4096mb 是够用的。
  2. hive.tez.container.size:tez 任务容器的内存,设置的规则如上,可以根据任务适当调大内存。
  3. hive.auto.convert.join.noconditionaltask.size:当设置 hive.auto.convert.join.noconditionaltask=true 时这个 size 参数才会起作用,对于 n 表 join 的情况,如果 n-1 个 表的大小之和小于这个数,就会自动转成 mapjoin,map-side join 是一种特殊类型的连接,其中较小的表加载到内存中,连接在 MapReduce 作业的 map 阶段执行。 由于 map-side join 中不涉及 reducer,因此与常规 join 相比,它要快得多。
  4. tez.am.container.reuse.enabled=true:设置是否对多个查询复用容器,默认为 true,开启可以减少每次查询都重新分配容器所引起的内存额外开销。 Tez 内存参数

Tez 有会话(session)的概念,当客户端或者 JDBC 工具发起一个 Hive 查询,它会启动一个 tez 会话,可以用于执行后续的多个查询。复用同一个会话可以节省每次查询时等待 Yarn 分配容器的时间。

参考链接

Apache TEZ

Apache Tez: A Unifying Framework for Modeling and Building Data Processing Applications

并行数据处理系统 Apache Tez

Apache Tez -Overview

Apache Hive and Apache Tez – Memory management and Tuning

Difference between mr and Tez?

Hive + Tez: A Performance Deep Dive

Optimizing Hive on Tez Performance

How initial task parallelism works

深入剖析Tez原理