hive 基本架构

Hive基本架构

如下图所示,从逻辑上来看,Hive包含了3大部分。

  • Hive Clients
  • Hive Services
  • Hive Storage and Computing

hive_component

用户操作Hive的接口主要有三个:CLI,Client 和 WUI。

其中最常用的是CLI,Cli启动的时候,会同时启动一个Hive副本。

Client是Hive的客户端,用户连接至Hive Server。在启动 Client模式的时候,需要指出Hive Server所在节点,并且在该节点启动Hive Server。而客户端则又可以分为三种Thrift ClientJDBC ClientODBC Client

Web Interface是通过浏览器访问Hive。

  • Hive将元数据存储在数据库中,如mysql、derby。Hive中的元数据包括表的名字,表的列和分区及其属性,表的属性(是否为外部表等),表的数据所在目录等。
  • 解释器、编译器、优化器完成HQL查询语句从词法分析、语法分析、编译、优化以及查询计划的生成。生成的查询计划存储在HDFS中,并在随后由MapReduce调用执行。
  • Hive的数据存储在HDFS中,大部分的查询、计算由MapReduce完成(注意,包含*的查询,比如select * from tbl不会生成MapRedcue任务)。

上图中的Driver会处理从应用到metastore到filed system的所有请求,以进行后续操作。

Hive组件

Driver

实现了session handler,在JDBC/ODBC接口上实现了执行和获取信息的API。

Compiler

该组件用于对不同的查询表达式做解析查询,语义分析,最终会根据从metastore中查询到的表和分区元数据生成一个execution plain。

Execution Egine

该组件会执行由compiler创建的execution。其中plan从数据结构上来看,是一个DAG,该组件会管理plan的不同stage与组件中执行这些plan之间的依赖。

Metastore

Hive的metastore组件是hive元数据集中存放地。该组件存储了包括变量表中列和列类型等结构化的信息以及数据仓库中的分区信息(包括列和列类型信息,读写数据时必要的序列化和反序列化信息,数据被存储在HDFS文件中的位置)。

Metastore组件包括两个部分:metastore services和Meta storage database。

  • Metastore database的介质就是关系数据库,例如hive默认的嵌入式磁盘数据库derby,还有mysql数据库。
  • Metastore services是建立在后台数据存储介质(HDFS)之上,并且可以和hive services进行交互的服务组件。

默认情况下,metastore services和hive services是安装在一起的,运行在同一个进程当中。也可以把metastore services从hive services里剥离出来,将metastore独立安装在一个集群里,hive远程调用metastore services。这样我们可以把元数据这一层放到防火墙之后,客户端访问hive服务,就可以连接到元数据这一层,从而提供了更好的管理性和安全保障。

使用远程的metastore services,可以让metastore services和hive services运行在不同的进程里,这样也保证了hive的稳定性,提升了hive services的效率。

Hive执行过程

system_architecture

流程大致步骤为:

  1. 用户提交查询等任务给Driver。
  2. Driver为查询操作创建一个session handler,接着dirver会发送查询操作到compiler去生成一个execute plan
  3. Compiler根据用户任务去MetaStore中获取需要的Hive的元数据信息。这些元数据在后续stage中用作抽象语法树的类型检测和修剪。
  4. Compiler得到元数据信息,对task进行编译,先将HiveQL转换为抽象语法树,然后将抽象语法树转换成查询块,将查询块转化为逻辑的查询plan,重写逻辑查询plan,将逻辑plan转化为物理的plan(MapReduce), 最后选择最佳策略。
  5. 将最终的plan提交给Driver。
  6. Driver将plan转交给ExecutionEngine去执行,将获取到的元数据信息,提交到JobTracker或者RsourceManager执行该task,任务会直接读取到HDFS中进行相应的操作。
  7. 获取执行的结果。
  8. 取得并返回执行结果。

创建表

解析用户提交的Hive语句->对其进行解析->分解为表、字段、分区等Hive对象

根据解析到的信息构建对应的表、字段、分区等对象,从SEQUENCE_TABLE中获取构建对象的最新的ID,与构建对象信息(名称、类型等等)一同通过DAO方法写入元数据库的表中,成功后将SEQUENCE_TABLE中对应的最新ID+5。

实际上常见的RDBMS都是通过这种方法进行组织的,其系统表中和Hive元数据一样显示了这些ID信息。通过这些元数据可以很容易的读取到数据。

优化器

优化器是一个不断更新的组件,大部分plan的转移都是通过优化器完成的。

  • 将多Multiple join 合并为一个Muti-way join
  • 对join、group-by和自定义的MapReduce操作重新进行划分。
  • 消减不必要的列。
  • 在表的扫描操作中推行使用断言。
  • 对于已分区的表,消减不必要的分区。
  • 在抽样查询中,消减不必要的桶。
  • 优化器还增加了局部聚合操作用于处理大分组聚合和增加再分区操作用于处理不对称的分组聚合。
### Hive基本DDL语句概述 Hive的数据定义语言(Data Definition Language, DDL)用于管理数据库对象,如表、视图和索引等。以下是关于创建、修改和删除表的基本语法示例。 --- #### 创建表 在Hive中可以通过`CREATE TABLE`语句来创建新表。可以指定列名及其数据类型,并可以选择是否为外部表或其他存储选项。 ```sql -- 创建内部表 CREATE TABLE IF NOT EXISTS stu ( id INT, name STRING ); -- 创建外部表 CREATE EXTERNAL TABLE IF NOT EXISTS emp ( employee_id INT, department STRING ) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' STORED AS TEXTFILE LOCATION '/path/to/external/data'; ``` 上述代码展示了如何创建一个简单的内部表以及带有特定存储位置的外部表[^3]。 --- #### 修改表 使用`ALTER TABLE`语句可更改现有表的名称、添加或删除列以及其他属性调整。 - **重命名表** ```sql ALTER TABLE old_table_name RENAME TO new_table_name; ``` 此命令允许将现有的表更改为新的名字[^1]。 - **增加列** 如果需要扩展表结构,则可通过如下方式新增字段: ```sql ALTER TABLE table_name ADD COLUMNS (new_column_name column_type); ``` 例如,在已有学生信息基础上加入年龄一栏: ```sql ALTER TABLE stu ADD COLUMNS (age INT); ``` - **替换整个Schema** 当希望完全更新某张表格的所有列定义时可用下面方法替代原有schema: ```sql ALTER TABLE table_name REPLACE COLUMNS (...columns definitions...); ``` 这些功能均属于常见alter操作的一部分[^2]。 --- #### 删除表 若不再需要某个表或者想清理资源,可以执行drop动作: ```sql DROP TABLE [IF EXISTS] table_name; ``` 该指令会彻底移除目标关系型实体连同其元数据记录一起销毁[^4]。 注意区分普通Drop与级联模式下的行为差异——后者还会牵涉到关联依赖项处理逻辑。 --- ### 总结说明 以上分别介绍了有关于建立、修订及废弃hive环境里各类table实例的具体实现办法。每一步骤都紧密围绕着实际应用场景展开讨论并辅以相应示范片段予以佐证。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值