Hive源码解析

Posted Nathon的学习笔记

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Hive源码解析相关的知识,希望对你有一定的参考价值。

熟悉一个组件最好的方式是阅读源码,从中可以明白来龙去脉,也可以知道面对问题优化的方法。分析Hive的源码可以看出有哪些Operators,对于算子的运用也是很有必要的.

可以看看Operator源码,Operator定义为了一个抽象类,并且是深度优先遍历的节点。

在这个类里面,还有个很重要的process方法,该方法一共有两个参数一个row,一个tag.其中,row代表的是此行的数据,而tag表示的是该行数据来源于哪张表。

读Operator接口相关源码,可以看其运行的过程可以如下所示:

在分布式计算hadoop中:

  1. 每个节点上创建一个或者多个进程,也是最小的基本单元;

  2. 每个进程会有一个实例,每个实例会开始执行initialize()方法;

  3. process()方法,如果一张表有100行数据分到了10个map进程里面,那么平均每个map进程处理10行数据,也就是同时运行了10次process()方法,最后读取完毕close().

接下来,可以看看聚合算子源码的逻辑,比较关键的是在SemanticAnalyzer这个类,这个类有1W+的代码量,看起来有点费劲,这里面藏着一个很深的嵌套,对于聚合有两种方式:

  1. hivemap端聚合,也就说选择这种方式,就是提前在map端做聚合(也就是MR中,map阶段的combiner),减少reduce端做聚合的数据量;

  2. skew方式,选择这种方式,也就是说采取两阶段MR方式来处理数据.

所以,我们在应用中经常会遇到数据倾斜的问题,基本上hive提供了合适的方案。要么是在map端做预聚合,这种场景多出现在聚合里面,要么是在数据量特别大的情况下使用skew方式,也就是做2阶段甚至多阶段MR。

以上是关于Hive源码解析的主要内容,如果未能解决你的问题,请参考以下文章

Flink Hive Source 并行度推断源码解析

Hive 源码解读 CliDriver HQL 读取与参数解析

HiveSQL源码之语法词法编译文件解析一文详解

Spark之SQL解析(源码阅读十)

Flink SQL 之 Calcite Volcano优化器(源码解析)

SparkSQL源码阅读