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&useUnicode=true&characterEncoding=UTF-8&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 表