蜂巢查询的控制流程是什么?
比方说,我想加入 Emp_Table 和 Dept_Table,
流程如何?
它从元存储中的哪个表中获取所有相关信息?
如,1) Emp_Table 对应的文件在哪里?(HDFS 位置) 2) 表 Emp_Table 的字段名称是什么?3) 包含 Emp_Table 数据的文件中的分隔符是什么?4)如何对数据进行分桶或分区,在这种情况下,从哪里(元存储表名称)以及如何(查询)给出 HDFS 文件夹位置?
流程是这样的:
第 1 步:Hive 客户端触发查询(CLI 或使用 JDBC、ODBC 或 Thrift 或 webUI 的某些外部客户端)。
第 2 步:编译器接收查询并连接到元存储。
第 3 步:开始编译阶段。
Parser
将查询转换为parse tree
表示。ANTLR用于生成abstract syntax tree(AST)
.
Semantic analyzer
编译器根据元存储在输入和输出表上提供的信息构建逻辑计划。编译器还在此阶段检查type compatibilities
并通知compile-time semantic errors
。
QBT creation
在这一步中,将 AST 转换为中间表示,称为query block(QB) tree
。
Logical plan generator
在这一步,编译器将来自语义分析器的逻辑计划写入操作的逻辑树中。
Optimization
这是编译阶段最重的部分,因为整个系列都DAG optimizations
发生在这个阶段。它涉及以下任务:
Logical optimization
Column pruning
Predicate pushdown
Partition pruning
Join optimization
Grouping(and regrouping)
Repartitioning
Conversion of logical plan into physical plan by physical plan generator
Creation of final DAG workflow of MapReduce by physical plan generator
第 4 步:执行引擎获取编译器输出以在 Hadoop 平台上执行它们。它涉及以下任务:
MapReduce 任务首先将其部分计划序列化为 plan.xml 文件。
然后将 plan.xml 文件添加到任务的作业缓存中,并使用 Hadoop 生成 ExecMapper 和 ExecReducer 的实例。
这些类中的每一个都反序列化 plan.xml 文件并执行任务的相关部分。
最终结果存储在一个临时位置,并且在整个查询完成时,如果是插入或分区,结果将被移动到表中。否则返回到临时位置的调用程序。
注意:所有任务都按照它们的依赖顺序执行。每个仅在其所有先决条件都已执行时才执行。
要了解 metastore 表及其字段,您可以查看 metastore 的 MR 图:
高温高压
查看底层 HDFS 目录路径、分隔符、分区和其他详细信息。
describe extended Emp_Table;
describe extended Dept_Table;
查看 Hive 控制流如何放置EXPLAIN
或EXPLAIN EXTENDED
放在您的查询前面。