当我们在学习 Hive 的时候在学习什么?「硬刚 Hive 续集」
我们又来到「学习什么」系列了。这篇文章是对「硬刚 Hive」的补充。
我在之前的硬刚系列《大数据方向另一个十年开启 |《硬刚系列》第一版完结》中写过一个《硬刚Hive | 4万字基础调优面试小总结》,这个小结里基本涵盖了你所看过的关于 Hive 的常见的知识和面试八股文。
然而,我发现漏掉了一些东西。我将在本篇文章进行补充。
Hive 工作原理和运行架构
你可以在官网中找到 Hive 的架构和运行图:
从 Hive 全局架构图中可以看到 Hive 架构包括如下组件:CLI(Hive3.0 中被废弃被 BeeLine 取代)、JDBC/ODBC、Thrift Server、Hive WEB Interface(HWI)、Metastore 和 Driver(Compiler、Optimizer)
Metastore 组件:元数据服务组件,这个组件用于存储 hive 的元数据,包括表名、表所属的数据库、表的拥有者、列/分区字段、表的类型、表的数据所在目录等内容。hive 的元数据存储在关系数据库里,支持 derby、mysql 两种关系型数据库。元数据对于 hive 十分重要,因此 Hive 支持把 metastore 服务独立出来,安装到远程的服务器集群里,从而解耦 hive 服务和 metastore 服务,保证 hive 运行的健壮性。
Driver 组件:该组件包括 Parser、Compiler、Optimizer 和 Executor,它的作用是将我们写的 HiveQL(类 SQL)语句进行解析、编译、优化,生成执行计划,然后调用底层的 mapreduce 计算框架。
解释器(Parser):将 SQL 字符串转化为抽象语法树 AST;
编译器(Compiler):将 AST 编译成逻辑执行计划;
优化器(Optimizer):对逻辑执行计划进行优化;
执行器(Executor):将逻辑执行计划转成可执行的物理计划,如 MR/Spark
CLI:command line interface,命令行接口。
ThriftServers:提供 JDBC 和 ODBC 接入的能力,它用来进行可扩展且跨语言的服务的开发,hive 集成了该服务,能让不同的编程语言调用 hive 的接口。
Hive 的工作流程步骤:
ExecuteQuery(执行查询操作):命令行或 Web UI 之类的 Hive 接口将查询发送给 Driver(任何数据驱动程序,如 JDBC、ODBC 等)执行;
GetPlan(获取计划任务):Driver 借助编译器解析查询,检查语法和查询计划或查询需求;
GetMetaData(获取元数据信息):编译器将元数据请求发送到 Metastore(任何数据库);
SendMetaData(发送元数据):MetaStore 将元数据作为对编译器的响应发送出去;
SendPlan(发送计划任务):编译器检查需求并将计划重新发送给 Driver。到目前为止,查询的解析和编译已经完成;
ExecutePlan(执行计划任务):Driver 将执行计划发送到执行引擎;
6.1 ExecuteJob(执行 Job 任务):在内部,执行任务的过程是 MapReduce Job。执行引擎将 Job 发送到 ResourceManager,ResourceManager 位于 Name 节点中,并将 job 分配给 datanode 中的 NodeManager。在这里,查询执行 MapReduce 任务;
6.2 Metadata Ops(元数据操作):在执行的同时,执行引擎可以使用 Metastore 执行元数据操作;
6.3 jobDone(完成任务):完成 MapReduce Job;
6.4 dfs operations(dfs 操作记录):向 namenode 获取操作数据;
FetchResult(拉取结果集):执行引擎将从 datanode 上获取结果集;
SendResults(发送结果集至 driver):执行引擎将这些结果值发送给 Driver;
SendResults (driver 将 result 发送至 interface):Driver 将结果发送到 Hive 接口(即 UI)。
HiveSQL 转化为 MR 任务的过程
我在网上找到一个转化图:
编译 SQL 的任务是在上面介绍的 COMPILER(编译器组件)中完成的。Hive 将 SQL 转化为 MapReduce 任务,整个编译过程分为六个阶段:
词法、语法解析: Antlr 定义 SQL 的语法规则,完成 SQL 词法,语法解析,将 SQL 转化为抽象语法树 AST Tree;
语义解析: 遍历 AST Tree,抽象出查询的基本组成单元 QueryBlock;
生成逻辑执行计划: 遍历 QueryBlock,翻译为执行操作树 OperatorTree;
优化逻辑执行计划: 逻辑层优化器进行 OperatorTree 变换,合并 Operator,达到减少 MapReduce Job,减少数据传输及 shuffle 数据量;
生成物理执行计划: 遍历 OperatorTree,翻译为 MapReduce 任务;
优化物理执行计划: 物理层优化器进行 MapReduce 任务的变换,生成最终的执行计划。
而且要特别注意:
一个复杂的 Hive SQL 可能会转化成多个 MapReduce 任务执行。
HiveSQL 转换成 MR 任务?你问过 Hive3.0 的 Tez 吗?
我上面讲的 HiveSQL 转化为 MR 任务的过程只适用于 Hive3.0 以下版本。在 Hive3.0+版本中这个默认执行引擎被替换成了 Tez。
为什么抛弃 MR 任务?因为 Hadoop 的 MapReduce 真的太慢了。
Tez 是 Apache 开源的支持 DAG 作业的计算框架,它直接源于 MapReduce 框架,核心思想是将 Map 和 Reduce 两个操作进一步拆分,即 Map 被拆分成 Input、Processor、Sort、Merge 和 Output, Reduce 被拆分成 Input、Shuffle、Sort、Merge、Processor 和 Output 等,这样,这些分解后的元操作可以任意灵活组合,产生新的操作,这些操作经过一些控制程序组装后,可形成一个大的 DAG 作业。
Tez 将 Map task 和 Reduce task 拆分为如下图所示:
Tez 的 task 由 Input、processor、output 阶段组成,可以表达所有复杂的 map、reduce 操作,如下图,
举个栗子看优势,直接看下图,Tez 可以将多个有依赖的作业转换为一个作业(这样只需写一次 HDFS,且中间节点较少),从而大大提升 DAG 作业的性能。Tez 很早就已被 Hortonworks 用于 Hive 引擎的优化,经测试,性能提升约 100 倍。
在 Hive3.0 中,Hive 终于将执行引擎切换到了 Tez。Hive 终于不在那么慢了。
Spark on Hive 的支持
Spark 通过 Spark-SQL 使用 Hive 语句,操作 Hive,底层运行的还是 Spark rdd。在很多大公司,都实现了对 Spark on Hive 的支持。
大概的原理是:
通过 SparkSql,加载 Hive 的配置文件,获取到 Hive 的元数据信息
通过 SparkSql 获取到 Hive 的元数据信息之后就可以拿到 Hive 的所有表的数据
接下来就可以通过通过 SparkSql 来操作 Hive 表中的数据
详细可以参考:《Spark on Hive & Hive on Spark,傻傻分不清楚》
另外,还有 Hive3.0 中更多的特性,我们在后面再一一解答。
你好,我是王知无,一个大数据领域的硬核原创作者。
做过后端架构、数据中间件、数据平台 &架构、算法工程化。
专注大数据领域实时动态 &技术提升 &个人成长 &职场进阶,欢迎关注。
版权声明: 本文为 InfoQ 作者【王知无】的原创文章。
原文链接:【http://xie.infoq.cn/article/a86b7f75bc2905300e1407189】。文章转载请联系作者。
评论