我们在《数据科学之路(5)数据仓库工具》中提到了 Hive 既可以运行在 MapReduce 上,也可以运行在 Tez 和 Spark 上,那么 Tez 到底是什么呢?是跟 MapReduce 和 Spark 一样都是大数据生态中的计算框架吗?其运作原理又是什么呢?想必小伙伴们在学习《数据科学之路(5)数据仓库工具》的时候就存在了诸如此类的众多疑问,本篇,我将会跟小伙伴们一起揭开 Tez 的神秘面纱!
Tez 是一个构建在 Yarn 之上的支持复杂的 DAG 任务的数据处理框架。是由 Hortonworks 开源,其核心思想是把 MapReduce 的过程分成若干子过程,同时可以把多个 MapReduce 任务组合成一个较大的 DAG 任务,减少了 MapReduce 之间的文件存储,同时合理地组合其子过程从而大幅度提升 MapReduce 性能,Hortonworks 把 Tez 应用到数据仓库 Hive 的优化中,使得性能提升了约100倍!所以我们也可以认为,Tez 是出于 MapReduce 而胜于 MapReduce!
HiveQL 在 MapReduce 和 Tez 的执行情况对比
从上图,我们可以看到,传统的 MapReduce 程序对于一个复杂的 HiveQL 的做法是将其拆成4个有依赖关系的 MapReduce 作业,有3次写 HDFS 的操作(上图中的云表示写 HDFS 操作)。但是 Tez 是将多个有依赖关系的作业转换为一个作业,只需要写一次 HDFS,大大简化了中间节点。简单来说,相比于 MapReduce,Tez 的优化主要体现在:去除连续两个作业之间的写 HDFS 操作;去除每个工作流中多余的 Map 阶段这两个点。
(Tez+Hive)与 Impala 的区别
Tez 在解决 Hive 延迟大、性能低等问题的思路,是和那些支持实时交互式查询分析的产品(Impala)不同的,Impala 是完全抛弃了 MapReduce 计算框架,并借助于类似并行关系型数据库的分布式查询引擎,并在每个数据节点上执行子查询,不会将查询转换成 MapReduce 作业,从而大大降低延迟,满足实时交互性查询的需求。但是,Tez 针对数据仓库进行优化,提出了“Tez+Hive”的解决方案,其仍然采用 MapReduce 计算框架,但是对 DAG 的作业依赖关系进行了裁剪,并将多个小作业合并成一个大作业,这样,不仅计算量减少了,而且写 HDFS 次数也会大大减少。
Tez 实现方法
Tez 将 MapReduce 的 Map 和 Reduce 操作进一步拆分,将 Map 拆分为 Input、Processor、Sort、Merge 和 Output,将 Reduce 拆分成 Input、Shuffle、Sort、Merge、Processor 和 Output 等,并对外提供了相应的可编程组件:
- Input:对输入数据源的抽象,将输入数据解析成<key,value>的形式
- Output:对输出数据源的抽象,将用户程序产生的<key,value>写入文件系统
- Partitioner:对数据进行分片,类似于 MapReduce 中的 Partitioner
- Processor:对计算的抽象,从一个 Input 中获取数据,经处理后,通过 Output 输出
- Task:对任务的抽象,每一个 Task 都由一个 Input、Output 和 Processor 组成
- Master:管理各个 Task 的依赖关系,并按照顺序依赖执行他们
- Sort:排序,分为本地数据排序和远程拷贝数据并排序
OK,本篇到这里就要结束了,想了解更多有关于数据科学的小伙伴们,可以关注我哦!