很少在博客里写翻译的东西, 这次例外. 原文在这儿
. 译文掺杂了些自己的表述。
解析器(Parser)
解析器 由antlr生成, 文法定义在Hive.g文件中。它的功能是将查询字符串翻译成抽象语法树(Abstract Syntax Tree, 简称AST).
语法分析器(Semantic Analyzer)
语法分析器将AST转换成内部查询形式,此形式为查询块(Query Block), 而不是一棵操作符树(Opertator Tree).
它还验证查询语句中的列名, 符号"*" 等. 同时这一环节还进行类型检查, 隐式类型转换.
如果被查询的表是带分区(Partition)的表,则所有关于该表的表达式都将被收集起来,以备裁剪不必要的分区时使用;如果查询语句包含采样
(Sampling)操作,也会收集这些表达式.
逻辑计划生成器(Logic Plan Generator)
逻辑计划生成器将内部查询形式(即上文提到过的查询块)转换成逻辑计划。逻辑计划是一棵操作符树。其中部分操作符是关系代数操作符,例如
filter, join操作符。还有部分操作符是hive特有的操作符,它们将被翻译为mapreduce作业, 例如,
reduceSink操作符。它出现在map与reduce的分界处。
此环节还包含优化器。优化器修改查询计划以提高查询的效率。例如: 把一系列join操作合并到一个join中; group by操作的map端聚合; 将group by分为两步,以防数据倾斜,造成某个reducer负担过重,成为瓶颈。
每个操作符,都包含一个描述符(descriptor)。描述符是可序列化的对象。
查询计划生成器(Query Plan Generator)
即数据库理论中的物理查询计划生成器。它将逻辑计划转换成一系列的map-reduce任务(见ql/exec/MapRedTask类)。具体操
作是递归访问操作符树,将它们分成一系列序列化的map-reduce任务, 然后将任务提交给hadoop分布式系统。
reduceSink是map与reduce的分界线,它的描述符包含归约键(reduction keys), 归约键是mapper的输出键,
即也是reduce的输入键。如果查询中包含采样/分区, 则也会有相应的计划。计划被序列化到一个plan.[0-9]+文件里,
它是一个xml格式的文件。
Distinct的改造
SemanticAnalyzer.genGroupByPlanReduceSink() 方法根据GroupBy与distinct function信息组合成了redcueKeys,再将它放入reduceSinkDesc对象中(reduceSinkDesc.keyCols).这个keyCols的类型是ArrayList<exprNodeDesc>,即表达式数组,其实它应该为一个ArrayList<ArrayList<exprNodeDesc>> 或者HashMap<String, ArrayList<exprNodeDesc>>以支持多种key输出
reduceSinkDesc被ExecDriver序列化提交到hive.scratchdir目录下的plan.[0-9]+文件. hive.scratchdir一般在hive-site.xml中定义,是hive在hdfs上的一个存放临时文件的目录. ExecMapper与ExecReduce在configure的时候, 会读取这些plan.[0-9]+文件, 反序列化mapRedWork对象, 初始化各Operator等.
将ReduceSinkOperator.keyEval改成ExprNodeEvaluator[][]的二维数组以支持多个key输出
Map会以MapOperator为操作符树的根结点, Reduce一般以GroupByOperator为操作符树的根结点
分享到:
相关推荐
Hive的设计充分考虑了扩展性和灵活性,允许用户通过扩展SerDe、UDF等功能来适应不同的应用场景。此外,Hive还提供了丰富的接口供用户选择,使得不同背景的用户都能方便地使用Hive进行数据分析。
7. **Java类库**:Hive的核心实现,包括了查询解析、编译、优化以及执行等模块的源代码和编译后的class文件。 安装和使用Hive X86_64工具包通常涉及以下步骤: 1. 解压压缩包到指定目录。 2. 配置`hive-site.xml`以...
通过阅读和分析 `apache-hive-1.2.1-src` 中的源码,开发者可以深入理解 Hive 的工作原理,了解如何设计和实现分布式数据处理系统,以及如何利用 Hadoop 生态系统进行大数据分析。这对于在大数据领域进行开发、优化...
- **smartfreight-master**:这个目录可能包含了项目的源代码、配置文件、数据样本等资源,用户可以通过编译和运行这些代码来理解并实践整个智能货运系统的设计与实现。 通过这个项目,学习者不仅可以掌握大数据...
允许实现模块化的程序设计、方便修改代码、增加函数 UDF的执行速度很快,通过缓存计划在语句重复执行时降低代码的编译开销,比存储方法的执行效率更高 可用于减少网络流量 UDF放入内存中,设计不当可能导致系统的...
2. **编译与安装**:进入"presto-master"目录,使用Maven进行编译,生成可执行的Presto服务器和客户端。 3. **配置**:编辑`etc/catalog/hive.properties`配置文件,设置Hive连接器的相关参数,如Hadoop配置目录、...
Tez是Apache Hadoop生态系统中的一个关键组件,它是一个任务执行框架,专为处理大规模数据集而设计。在CDH(Cloudera Distribution Including Apache Hadoop)6.0.1版本中,Tez 0.9.1是支持高效、低延迟数据处理的...
**Golang**(Go语言):由Google开发的Go语言是一种静态类型的、编译型的、并发的、垃圾回收的、C-like的编程语言。Go语言教程会讲解其语法特性,如goroutines和channels(用于并发编程)、接口、包管理和标准库的...
Apache Hive 是一个基于...同时,熟悉设计模式和软件架构原则也有助于理解Hive的设计决策。最后,你可以参考官方文档和其他社区资源,比如Stack Overflow和Apache Hive的邮件列表,以解决你在阅读源码时遇到的问题。
它控制着网页的布局,包括颜色、字体、大小、间距等视觉元素,使得开发者可以分离内容和表现,实现更模块化和可维护的设计。 在"Smart-hive-master"这个压缩包中,我们通常会找到一个项目的主要源代码,包括但不...
NZRS-Hive-UDF 是一个专门为 NZRS(新西兰皇家学会)设计的 Hive 用户自定义函数(User-Defined Functions, UDFs)集合。这个项目旨在扩展 Hive 的内置功能,以满足 NZRS 在数据处理和分析中的特定需求。Hive 是一个...
C++是一种静态类型的、编译式的、通用的、大小写敏感的、不仅支持过程化编程,也支持面向对象编程的程序设计语言。由于其底层控制能力强,运行效率高,特别适合于开发需要高性能和实时响应的游戏。在DayZUnleashed_...
在Python中,SASL库主要由`sasl`模块提供,它可以集成到像Hive这样的服务中,确保用户在连接时的安全性。 安装sasl-0.2.1的步骤如下: 1. 首先,确保已经安装了Python 3.7及pip(Python的包管理器)。 2. 解压缩...
6. **可扩展性**:Atlas 设计为模块化,允许添加新的功能插件,以适应不断变化的业务需求。 7. **通知与事件处理**:当元数据发生变更时,Apache Atlas 可以触发通知或工作流,确保及时的数据治理响应。 8. **图形...
它可以与SQL和Hive查询语言兼容,允许用户通过SQL接口来操作DataFrame,DataFrame是RDD的进化版,提供了类型安全和更高的抽象层次。 4. **Spark Streaming**:Spark Streaming提供了一个高层次的API,可以处理连续...
这些组件分别位于不同的目录下,通过模块化设计实现可扩展性和维护性。 3. **服务器端** 服务器端主要负责处理用户请求、数据存储和计算任务。源码中的`server`目录包含了服务启动、数据处理、查询执行等关键模块...
开发者可能会使用模块打包工具,如Webpack或Rollup,将这些分散的文件编译成可部署的格式。 在Web开发中,`index.html`是网页的起点,它包含了网页的基本结构和引入的JavaScript及CSS文件。`main.js`可能包含了项目...
SparkSQL是Apache Spark框架中的一个核心模块,专为处理结构化数据而设计。它在Spark 3.0版本中提供了高效、灵活的数据处理能力,旨在融合SQL查询与Spark的分布式计算优势。SparkSQL的主要目标是简化大数据处理,...
5. **模块(Modules)**:TypeScript 提供了模块系统,使得代码组织更加有序,支持导入和导出功能,便于代码的分块和管理。 6. **装饰器(Decorators)**:装饰器是一种元编程机制,可以用来在不修改原有代码的情况...