[Hive]七 Hive 内核

1. Hive架构

Hive架构主要包括:

  • 用户界面:命令行(CLI)和web UI
  • Thrift Server:公开了一个非常简单的客户端执行HiveQL语句的API,包括JDBC(Java)和ODBC(C++),python等
  • Metastore:系统的目录。Hive的其他组件都与metastore交互
  • Driver:管理HiveQL语句在编译、优化和执行期间的生命周期。收到来自Thrift Server或其他接口的HiveQL语句时,它创建一个Session Handle用于跟踪统计信息,如执行时间、输出行数等。

        SQL Parser:将SQL字符串转换成抽象语法树(Abstract Syntax Tree, AST)

        语义分析(Semantic Analyzer):将AST进一步划分为QueryBlock。

        逻辑计划生成器(Logical Plan Generator):将抽象语法树生成逻辑计划

        逻辑优化器(Logical Optimizer):对逻辑计划进行优化(比如谓词下推)

        物理计划生成器(Physical Plan Generator):根据优化后的逻辑计划生成物理计划(比如MR任务,Spark任务,Tez任务)

        物理优化器(Physical Optimizer):对物理计划进行优化(比如Map join)

        执行器(Executor):执行计划,并将结果返回给客户端。

  • Compiler:在Driver收到HQL语句之后引用,将语句翻译为DAG(有向无环图)形式的MapReduce任务组成的计划
  • Driver按照拓扑顺序将各个Mapreduce作业从DAG提交到Execution Engine(执行引擎)

 1.1 Metastore

Metastore是包含存储在hive中的表的元数据的系统目录。此元数据在表创建期间指定,并在HiveQL中每次引用该表时被重用。元数据包括:

DataBase默认是default
Table表的元数据包含列及其类型、所有者、存储信息和SerDe信息的列表。它还可以包含任何用户提供的键值数据(TBLPROPERTIES)。存储信息包括表数据在底层系统中的位置、数据格式和bucketing分桶信息。SerDe元数据包括序列化器和反序列化器方法的实现类以及该实现类所需的任何支持信息。所有这些信息都可以在创建表的过程汇总提供。
Partition每个分区都可以有自己的列,SerDe和存储信息。

CREATE TABLE `call_center`(
  `cc_call_center_sk` bigint, 
  `cc_call_center_id` char(16), 
  `cc_rec_start_date` date, 
  `cc_rec_end_date` date, 
  `cc_closed_date_sk` bigint, 
  `cc_open_date_sk` bigint, 
  `cc_name` varchar(50), 
  `cc_class` varchar(50), 
  `cc_employees` int, 
  `cc_sq_ft` int, 
  `cc_hours` char(20), 
  `cc_manager` varchar(40), 
  `cc_mkt_id` int, 
  `cc_mkt_class` char(50), 
  `cc_mkt_desc` varchar(100), 
  `cc_market_manager` varchar(40), 
  `cc_division` int, 
  `cc_division_name` varchar(50), 
  `cc_company` int, 
  `cc_company_name` char(50), 
  `cc_street_number` char(10), 
  `cc_street_name` varchar(60), 
  `cc_street_type` char(15), 
  `cc_suite_number` char(10), 
  `cc_city` varchar(60), 
  `cc_county` varchar(30), 
  `cc_state` char(2), 
  `cc_zip` char(10), 
  `cc_country` varchar(20), 
  `cc_gmt_offset` decimal(5,2), 
  `cc_tax_percentage` decimal(5,2))
ROW FORMAT SERDE 
  'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe' 
STORED AS INPUTFORMAT 
  'org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat' 
OUTPUTFORMAT 
  'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat'
LOCATION
  'obs://bigdata-test1233/hive/warehouse/hive_tpcds_parquet_2tb/call_center'
TBLPROPERTIES (
  'bucketing_version'='2', 
  'transient_lastDdlTime'='1735377714') 

1.2  Compiler

Driver使用HiveQL字符串调用Compiler,HiveQL字符串可以是DDL、DML或DQL语句之一。Compiler将字符串转换为Plan。对于DDL语句,Plan只包含元数据操作,而对于Load语句,则包含HDFS操作。对于Insert语句和查询语句,该计划由MapReduce作业的Directed Acyclical Graph(DAG,有向无环图)组成。

  • Parser将一个Query字符串转化成一个AST(Abstract Syntax Tree,抽象语法树)。
  • 语义分析器(Semantic Analyzer)将AST转换为基于Block的内部查询表现形式(QueryBlock)。它从Metastore中检索输入表的模式信息(Schema Information)。使用此信息去验证列名,展开select * 并执行类型检查,包括添加隐式类型转换。

QueryBlock代表了查询语句中的一个逻辑块,通常由一个SELECT语句和其相关的子查询、JOIN操作或UNION操作组成。QueryBlock可以看作是查询语句的一个子部分,它有自己的语义和语法规则,并且可以独立进行语义分析和优化。

举个例子,假设有以下HiveQL查询语句:

```sql
SELECT a.id, b.name
FROM table1 a
JOIN table2 b ON a.id = b.id
WHERE a.salary > 1000;
```

在这个查询语句中,可以将其分解为两个QueryBlock:

QueryBlock 1:
```sql
SELECT a.id, b.name
FROM table1 a
JOIN table2 b ON a.id = b.id
```

QueryBlock 2:
```sql
SELECT a.salary
FROM table1 a
WHERE a.salary > 1000
```
每个QueryBlock都有自己的语义和语法规则,语义分析器会分别对它们进行分析和验证。在分析过程中,语义分析器会检查表和列是否存在、列的数据类型是否匹配、JOIN条件是否有效等,并生成相应的查询计划用于后续的执行阶段。

通过将查询语句拆分为多个QueryBlock,语义分析器可以更好地理解和处理复杂的查询语句,提高查询的效率和准确性。

  • 逻辑计划生成器(Logical Plan Generator)将内部查询表示形式转换为逻辑计划,逻辑计划由逻辑运算符树组成。
  • 优化器(Optimizer)对逻辑计划执行多次传递,并以多种方式重写它。
  • 物理计划生成器(Physical Plan Generator)将逻辑计划转换为物理计划,其中包含MapReduce作业的DAG。它为逻辑计划中的每个标记Operator-repartition和union all创建一个新的MapReduce作业,然后它将包含在标记之间的逻辑计划的一部分分配给MapReduce作业的Mapper和Reducer。

1.3 Hive链接到数据库的模式

1.3.1 单用户模式

此模式链接到一个In-memory 数据库Derby,一般用于Unit Test。

1.3.2 多用户模式

通过网络连接到一个数据库中,是最经常使用到的模式。hive-site.xml

<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://hadoop101:3306/metastore?useSSL=false&amp;useUnicode=true&amp;characterEncoding=UTF-8&amp;allowPublicKeyRetrieval=true</value>
</property>

<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.cj.jdbc.Driver</value>
<value>com.mysql.jdbc.Driver</value>
</property>

<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>root</value>
</property>

<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>xxx</value>
</property>

1.3.3 远程服务器模式

用于非Java客户端访问元数据库,在服务器端启动MetaStore Server,客户端利用thrift协议通过MetaStore Server访问元数据库。

 hive-site.xml

<property>
<name>hive.metastore.uris</name>
<value>thrift://hadoop101:9083</value>
</property>

 启动HiveQL MetaStore Server:

java -Xmx1024m -Dlog4j.configuration=file://$HIVE_HOME/conf/hms-log4j.properties -cp $CLASSPATH org.apache.hadoop.hive.metastore.HiveMetaStore

Hive 客户端命令:

HIVE_LOG_DIR=$HIVE_HOME/logs

nohup hive --service metastore > $HIVE_LOG_DIR/metastore.log 2>&1 &

1.4 Hive 数据模型

Hive中所有的数据都存储在HDFS中,存储结构主要包括数据库、文件、表和视图。

Hive中包含以下数据模型:Inner Table内部表(也叫管理表),External Table外部表,Partition 分区,Bucket分桶。

1.4.1 数据库

类似传统数据库中的DataBase,使用方法如下:

操作HiveQL语句
创建数据库create database [db_name]
使用数据库use db_name
查看所有数据库show databases
查看某个数据库的创建语句show create database db_name

1.4.2 表 

2. Hive运行过程

3. Hive SQL解析过程

4. MapReduce原理

5. UDF

6. MetaStore模块

7. Hive元数据说明

8. Hive权限说明

9. Hive On Spark

10. Hive 提交任务到Yarn

11. HiveSQL调优

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/946707.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Github - 如何提交一个带有“verified”标识的commit

Github - 如何提交一个带有“verified”标识的commit 前言(Why) 今天在Github上浏览某项目的commit记录的时候发现&#xff0c;有的commit记录带有verified绿色标识&#xff0c;有的带有橘色的Unverified标识&#xff0c;还有的什么都不显示。 既然我是根正苗红的作者(bushi)…

操作系统课后题总复习

目录 一、第一章 1.1填空题 1.2单项选择题 1.3多项选择题 1.4判断题 1.5名词解释 1.6简答题 二、第二章 2.1填空题 2.2单项选择题 2.3 多项选择题 2.4判断题 2.5名词解释 2.6简答题 三、第三章 3.1填空题 3.2单项选择题 3.3多项选择题 3.4判断题 3.5名词解…

【Goland】怎么执行 go mod download

1、终端的执行 go mod tidy 2、终端执行不行的话&#xff0c;就可以通过右击go.mod文件来执行&#xff1b; 3、也可以按住Ctrl点击这个包安装&#xff1b;

Vue el-data-picker选中开始时间,结束时间自动加半小时

效果 思路 查阅elemnet plus官网&#xff0c;日期时间选择器type"datetimerange"这个选中开始时间并没有对应事件会被触发&#xff0c;因此思路更换成type"datetime"的两个组成一起可以通过监听开始时间v-model的值变化更新结束时间的值。 代码 日期时间…

sqoop将MySQL数据导入hive

使用脚本加载数据 MySQL有一张表 hive创建一张相同的表 编写脚本同步数据 [rootmaster sqoop]# vim stu.sh#!/bin/bash SQOOP/usr/local/soft/sqoop-1.4.6/bin/sqoop $SQOOP import --connect jdbc:mysql://192.168.67.100:3306/sqoop \--username root \--password 123456 \-…

leetcode热题100(79. 单词搜索)dfs回溯 c++

链接&#xff1a;79. 单词搜索 - 力扣&#xff08;LeetCode&#xff09; 给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 单词必须按照字母顺序&#xff0c;通过相邻的…

迈向Z级计算:Cloud4Science范式加速科学发现进程

传统超级计算机作为科学计算的核心支柱&#xff0c;在推动技术进步方面发挥了不可替代的作用&#xff0c;但随着科学智能时代下需求的多样化和复杂化&#xff0c;其扩展性和能效的局限逐渐显现。 针对这一挑战&#xff0c; 微软亚洲研究院 的研究员提出了 Cloud4Science 的新范…

高阶数据结构之并查

并查集的概念 之前我们曾学过树&#xff0c;二叉树、二叉搜索树、红黑树、AVL树等&#xff0c;而并查集可以看做是这些树的集合&#xff0c;也就是森林&#xff0c;它也是一种树型结构&#xff0c;不过是顺序的树型结构&#xff0c;如果有学过堆的同学应该会很熟悉。 它的作用是…

全面解析 Node-RED:功能、Docker 部署与实战示例

言简意赅的讲解Node-RED解决的痛点 Node-RED 是一个基于流的编程工具&#xff0c;专为物联网&#xff08;IoT&#xff09;应用而设计。它通过可视化的编程界面&#xff0c;使开发者能够轻松地连接各种硬件设备、API 以及在线服务&#xff0c;构建复杂的应用流程。本文将详细介…

Diffusion Transformer(DiT)——将扩散过程中的U-Net换成ViT:近频繁用于视频生成与机器人动作预测(含清华PAD详解)

前言 本文最开始属于此文《视频生成Sora的全面解析&#xff1a;从AI绘画、ViT到ViViT、TECO、DiT、VDT、NaViT等》 但考虑到DiT除了广泛应用于视频生成领域中&#xff0c;在机器人动作预测也被运用的越来越多&#xff0c;加之DiT确实是一个比较大的创新&#xff0c;影响力大&…

MAC M4安装QT使用国内镜像源在线安装

MAC M4安装QT使用国内镜像源在线安装 一、下载安装包1. 访问[https://www.qt.io/](https://www.qt.io/)下载在线安装包2. 下载结果 二、创建QT账户&#xff0c;安装的时候需要三、安装1. 终端打开安装包2. 指定安装源3. 运行安装完的QT 一、下载安装包 1. 访问https://www.qt.…

No.1十六届蓝桥杯备战|第一个C++程序|cin和cout|命名空间

第一个C程序 基础程序 使用DevC5.4.0 写一个C程序 在屏幕上打印hello world #include <iostream> using namespace std;int main() {cout << "hello world" << endl;return 0; } 运行这个C程序 F9->编译 F10->运行 F11->编译运行 mai…

前端开发 -- 自动回复机器人【附完整源码】

一&#xff1a;效果展示 本项目实现了一个简单的网页聊天界面&#xff0c;用户可以在输入框中输入消息&#xff0c;并点击发送按钮或按下回车键来发送消息。机器人会根据用户发送的消息内容&#xff0c;通过关键字匹配来生成自动回复。 二&#xff1a;源代码分享 <!DOCTYP…

UNI-APP_i18n国际化引入

官方文档&#xff1a;https://uniapp.dcloud.net.cn/tutorial/i18n.html vue2中使用 1. 新建文件 locale/index.js import en from ./en.json import zhHans from ./zh-Hans.json import zhHant from ./zh-Hant.json const messages {en,zh-Hans: zhHans,zh-Hant: zhHant }…

【MySQL】第一弹----库的操作及数据类型

笔上得来终觉浅,绝知此事要躬行 &#x1f525; 个人主页&#xff1a;星云爱编程 &#x1f525; 所属专栏&#xff1a;MySQL &#x1f337;追光的人&#xff0c;终会万丈光芒 &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 一、SQL 语句分类 DDL:数据定…

家用电器销售系统|Java|SSM|JSP|

【技术栈】 1⃣️&#xff1a;架构: B/S、MVC 2⃣️&#xff1a;系统环境&#xff1a;Windowsh/Mac 3⃣️&#xff1a;开发环境&#xff1a;IDEA、JDK1.8、Maven、Mysql5.7 4⃣️&#xff1a;技术栈&#xff1a;Java、Mysql、SSM、Mybatis-Plus、JSP、jquery,html 5⃣️数据库可…

ChatGPT 与 AGI:人工智能的当下与未来走向全解析

在人工智能的浩瀚星空中&#xff0c;AGI&#xff08;通用人工智能&#xff09;无疑是那颗最为璀璨且备受瞩目的星辰。OpenAI 对 AGI 的定义为“在最具经济价值的任务中超越人类的高度自治系统”&#xff0c;并勾勒出其发展的五个阶段&#xff0c;当下我们大多处于以 ChatGPT 为…

28.<Spring博客系统⑤(部署的整个过程(CentOS))>

引入依赖 Spring-boot-maven-plugin 用maven进行打包的时候必须用到这个插件。看看自己pom.xml中有没有这个插件 并且看看配置正确不正常。 注&#xff1a;我们这个项目打的jar包在30MB左右。 <plugin><groupId>org.springframework.boot</groupId><artif…

win11 vs2022 opencv 4.10使用vs Image Watch插件实时可视化内存mat对象

这个本来是非开源工业软件HALCON的一个功能&#xff0c;方便提升图像识别开发效率。原以为opencv没有&#xff0c;需要通过进程间共享内存的方式去实现。 结果在官网帮助文档中发现已经提供了。 opencv 4.10帮助文档https://docs.opencv.org/4.10.0/index.htmlOpenCV Tutorial…

用Python操作字节流中的Excel工作簿

Python能够轻松地从字节流中加载文件&#xff0c;在不依赖于外部存储的情况下直接对其进行读取、修改等复杂操作&#xff0c;并最终将更改后的文档保存回字节串中。这种能力不仅极大地提高了数据处理的灵活性&#xff0c;还确保了数据的安全性和完整性&#xff0c;尤其是在网络…