参考链接:深入浅出学Hive
一、Hive简介
- Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供类SQL查询功能。
- 本质是将SQL转换为MapReduce程序
Hive与Hadoop的关系
Hive与传统数据库对比
|
Hive
|
RDBMS
|
查询语言
|
HQL
|
SQL
|
数据存储
|
HDFS
|
Raw Device or Local FS
|
执行
|
MapReduce
|
Excutor
|
执行延迟
|
高
|
低
|
处理数据规模
|
大
|
小
|
索引
|
0.8版本后加入位图索引
|
有复杂的索引
|
二、Hive架构与基本组成
1、各组件基本功能
• 用户接口:用户访问Hive的入口
主要有三个:CIL(命令行),JDBC/ODBC(java),WebUI(浏览器访问)
•元数据:Hive的用户信息与表的MetaData
Hive将元数据存储在数据库中,目前只支持mysql,derby.
元数据包括:表名字,表的列和分区及其属性,表的数据所在目录。
•解释器,编译器,优化器:分析翻译、编译、优化HQL的组件
完成HQL查询语句从词法分析、语法分析、编译、优化及查询计划的生成。生成的查询计划存储在HDFS中,并随后由MapReduce调用执行。
Hive的数据存储在HDFS中,大部分查询有MapReduce完成。(包含的查询,例如select from不会生成mapreduce任务)
•Metastore
是系统目录,保存Hive中表的元数据信息。
metastore包含:
Database, 是表(table)的名字空间。默认的数据库(database)名为‘default’
Table 表的元数据,包含信息有:列(list of columns)和它们的类型(types),拥有者(owner),存储空间(storage)和SerDei信息
Partition, 每个分区(partition)都有自己的列(columns),SerDe和存储空间(storage)。这一特征将被用来支持Hive中的模式演变(schema evolution)
•Driver
1)Driver调用编译器处理HiveQL字串
2)编译器将HQL转化为策略(plan)
3)策略由元数据操作和HDFS操作组成。元数据操作只包含DDL(create,drop,alter)语句,HDFS操作只包含LOAD语句。
4)对插入和查询而言,策略由map-reduce任务中有向非循环图组成(DAG directed acyclic graph)。
2、Hive运行模式
本地和集群两种模式。
设置方式:
SET mapred.job.tracker=local
或者
SET mapred.job.tracker=192.168.1.2:9001
3、数据类型
原始数据类型:
tinyint - 1byte
smallint - 2 byte
int - 4 byte
bigint - 8 byte
boolean
float
double
string
复杂数据类型:
structs
maps
arrays
timestamp
4、Hive元数据存储
5、Hive的数据模型
Hive的数据存储建立在Hadoop的HDFS之上。
默认可以直接加载文本文件。创建表时可指定列分隔符航分隔符,hive可解析数据。
•Table 内部表
每个内部表在hive中有一个对应的目录存储数据。例如:表student在HDFS中的路径为“/warehouse/student”,warehouse是在hive-site.xml中由${hive.metastore.warehouse.dir}指定的数据仓库目录。
创建内部表:
create table student(id int,name string)
加载数据:
load data inpath ‘filepath’ into table student
删除内部表时,元数据和数据都会被删除。
drop table student
•Partition 分区表
在hive中,表中的一个partition对应于表下的一个目录,partition中的数据存储在对应目录下。
例如:student表中包含age和score两个partition,对应age=15,score=80的HDFS子目录为:warehouse/student/age=15/score=80
分区示例:
create table student(id int,name string) partitioned by (age int)
load data inpath ‘filepath’ into table student partition(age=15)
•External Table 外部表
指向hdfs中已经存在的数据。
与内部表的区别:
1)内部表在load数据的过程中,实际数据会被移动到数据仓库目录中。删除时元数据和数据都会删除。
2)外部表加载数据时,数据并不会被移动到数据仓库目录,只是与外部数据建立一个连接。删除表时仅删除元数据和该连接,不会删除数据。
创建外部表示例:
create external table teacher(id int,name string)
load data inpath ‘filepath’ into table teacher
drop table teacher
•Bucket Table
将表的列通过hash算法分解成不同的文件存储。
例如:将id分散成20个文件,对id进行hash,对应为0的写入/warehouse/student/age=15/score=80/part-0000
示例:
create table student(id int,name string) clustered by (id) into 20 buckets
load date inpath ‘filepath’ into table student
set hive.enforce.bucketing=true