一、Hive是什么
起源自facebook由Jeff Hammerbacher领导的团队,构建在Hadoop上的数据仓库框架。设计目的是让SQL技能良好,但Java技能较弱的分析师可以查询海量数据。2008年facebook把hive项目贡献给Apache。
由facebook开源,最初用于解决海量结构化的日志数据统计问题。ETL(Extraction-Transformation-Loading)数据抽取、加载、处理工具,构建在Hadoop之上的数据仓库。数据计算使用MR,数据存储使用HDFS。Hive 定义了一种类 SQL 查询语言——HQL,类似SQL,但不完全相同。通常用于进行离线数据处理(采用MapReduce),可认为是一个HQLMR的语言翻译器。
作为数据仓库工具,可以把Hadoop下的原始结构化数据变成Hive中的表 ,支持一种与SQL几乎完全相同的语言HiveQL。除了不支持更新、索引和事务,几乎SQL的其它特征都能支持。可以看成是从SQL到Map-Reduce的映射器 。提供shell、JDBC/ODBC、Thrift、Web等接口。
二、为什么使用Hive
简单,容易上手,提供了类SQL查询语言HQL。为超大数据集设计的计算/扩展能力 ,MR作为计算引擎,HDFS作为存储系统 。统一的元数据管理(HCalalog) ,可与Pig、Presto等共享 。
(1)Hive优点与长处
95%的Facebook任务由Hive写成,开发周期通常十分钟
Hive的所有执行,最终是转换为MapReduce
Hive的长处,在于数据统计如:pv,uv,ip的计算
group by,join
………………
精力放在数据逻辑上,优化数据结构和性能,而不再关注前人已经发明的轮子,不同同事之间的成果,可以方便的服用
(2)Hive缺点
Hive的HQL表达的能力有限:迭代式算法无法表达;有些复杂运算用HQL不易表达
Hive效率较低:Hive自动生成MapReduce作业,通常不够智能;HQL调优困难,粒度较粗;可控性差
三、Hive架构
(1)Hive的基本架构
1)用户接口
包括 CLI,JDBC/ODBC,WebUI
2)元数据存储(metastore)
默认存储在自带的数据库derby中,线上使用时一般换为MySQL
3)驱动器(Driver)
解释器、编译器、优化器、执行器
4)Hadoop
用 MapReduce 进行计算,用 HDFS 进行存储
(2)Hive的数据存储
1)Hive没有专门的数据存储格式,也没有为数据建立索引,用户可以非常自由的组织 Hive 中的表。
2)Hive 中所有的数据都存储在 HDFS 中,Hive 中包含以下数据模型:Table,External Table,Partition,Bucket。
3)Hive 中的 Table 和数据库中的 Table 在概念上是类似的,每一个 Table 在 Hive 中都有一个相应的目录存储数据。
例如表 tbl_pv放在目录 /wh/tbl_pv中,这里wh为hive-site.xml中${hive.metastore.warehouse.dir} 指定的数据仓库目录。
4)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
5)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);
6)External Table 指向已经在 HDFS 中存在的数据,可以创建 Partition