写点什么

当我们在学习 Hive 的时候在学习什么?「硬刚 Hive 续集」

用户头像
王知无
关注
发布于: 1 小时前
当我们在学习Hive的时候在学习什么?「硬刚Hive续集」

我们又来到「学习什么」系列了。这篇文章是对「硬刚 Hive」的补充。

我在之前的硬刚系列《大数据方向另一个十年开启 |《硬刚系列》第一版完结》中写过一个《硬刚Hive | 4万字基础调优面试小总结》,这个小结里基本涵盖了你所看过的关于 Hive 的常见的知识和面试八股文。


一、基于Hadoop的数据仓库Hive基础知识二、HiveSQL语法三、Hive性能优化四、Hive性能优化之数据倾斜专题五、HiveSQL优化十二板斧六、Hive面试题(一)七、Hive/Hadoop高频面试点集合(二)
复制代码


然而,我发现漏掉了一些东西。我将在本篇文章进行补充。

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 的工作流程步骤:

  1. ExecuteQuery(执行查询操作):命令行或 Web UI 之类的 Hive 接口将查询发送给 Driver(任何数据驱动程序,如 JDBC、ODBC 等)执行;

  2. GetPlan(获取计划任务):Driver 借助编译器解析查询,检查语法和查询计划或查询需求;

  3. GetMetaData(获取元数据信息):编译器将元数据请求发送到 Metastore(任何数据库);

  4. SendMetaData(发送元数据):MetaStore 将元数据作为对编译器的响应发送出去;

  5. SendPlan(发送计划任务):编译器检查需求并将计划重新发送给 Driver。到目前为止,查询的解析和编译已经完成;

  6. 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 获取操作数据;

  7. FetchResult(拉取结果集):执行引擎将从 datanode 上获取结果集;

  8. SendResults(发送结果集至 driver):执行引擎将这些结果值发送给 Driver;

  9. 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 中更多的特性,我们在后面再一一解答。


我们在学习Flink的时候,到底在学习什么?

我们在学习Spark的时候,到底在学习什么?

【面试&个人成长】2021年过半,社招和校招的经验之谈

八千里路云和月 | 从零到大数据专家学习路径指南

大数据方向另一个十年开启 |《硬刚系列》第一版完结

我写过的关于成长/面试/职场进阶的文章


你好,我是王知无,一个大数据领域的硬核原创作者。

做过后端架构、数据中间件、数据平台 &架构、算法工程化。

专注大数据领域实时动态 &技术提升 &个人成长 &职场进阶,欢迎关注。


发布于: 1 小时前阅读数: 2
用户头像

王知无

关注

大数据成神之路作者,全网阅读超百万。 2019.01.20 加入

《大数据成神之路》作者,全网阅读超百万。公众号:《import_bigdata》,关注大数据领域最新动态。略微懂点大数据方面的知识。

评论

发布
暂无评论
当我们在学习Hive的时候在学习什么?「硬刚Hive续集」