1.Hive是什么
- 起源自facebook由Jeff Hammerbacher领导的团队
- 构建在Hadoop上的数据仓库框架
- 设计目的是让SQL技能良好,但Java技能较弱的分析师可以查询海量数据
- 2008年facebook把hive项目贡献给Apache
- 由facebook开源,最初用于解决海量结构化的日志数据统计问题;
ETL(Extraction-Transformation-Loading)数据抽取、加载、处理工具 - 构建在Hadoop之上的数据仓库;
数据计算使用MR,数据存储使用HDFS - Hive 定义了一种类 SQL 查询语言——HQL;
类似SQL,但不完全相同 - 通常用于进行离线数据处理(采用MapReduce);
- 可认为是一个HQL→MR的语言翻译器。
- 数据仓库工具。可以把Hadoop下的原始结构化数据变成Hive中的表
- 支持一种与SQL几乎完全相同的语言HiveQL。除了不支持更新、索引和事务,几乎SQL的其它特征都能支持
- 可以看成是从SQL到Map-Reduce的映射器
- 提供shell、JDBC/ODBC、Thrift、Web等接口
2. Hive架构
1.Hive的基本架构
- 用户接口
包括 CLI,JDBC/ODBC,WebUI - 元数据存储(metastore)
默认存储在自带的数据库derby中,线上使用时一般换为MySQL - 驱动器(Driver)
解释器、编译器、优化器、执行器 - Hadoop
用 MapReduce 进行计算,用 HDFS 进行存储
2.Hive的数据存储
- Hive没有专门的数据存储格式,也没有为数据建立索引,用户可以非常自由的组织 Hive 中的表。
- Hive 中所有的数据都存储在 HDFS 中,Hive 中包含以下数据模型:Table,External Table,Partition,Bucket。
- Hive 中的 Table 和数据库中的 Table 在概念上是类似的,每一个 Table 在 Hive 中都有一个相应的目录存储数据。
- 例如表 tbl_pv放在目录 /wh/tbl_pv中,这里wh为hive-site.xml中${hive.metastore.warehouse.dir} 指定的数据仓库目录。
- Hive 表中的一个 Partition 对应于表下的一个目录,所有的 Partition 的数据都存储在对应的目录中。
- 例如:tbl_pv 表中包含 ds 和 city 两个 Partition,则对应于 ds = 20090801, ctry = US 的 HDFS 子目录为:/wh/tbl_pv/ds=20090801/ctry=US;对应于 ds = 20090801, ctry = CA 的 HDFS 子目录为/wh/pvs/ds=20090801/ctry=CA
- Buckets 对指定列计算 hash,根据 hash 值切分数据,每一个 Bucket 对应一个文件。可用于采样:
CREATE TABLE sales( id INT, name STRING)
PARITIONED BY (ds STRING)
CLUSTERED BY (id) INTO 32 BUCKETS;
SELECT id FROM sales TABLESAMPLE (BUCKET 1 OUT OF 32);
- External Table 指向已经在 HDFS 中存在的数据,可以创建 Partition