Hive原理详解
(⼀) Hive基础
1.1 背景
· 引⼊原因:
– 对存在HDFS上的⽂件或HBase中的表进⾏查询时,是要⼿⼯写⼀堆MapReduce代码
select word, count(*) from ( select explode(split(sentence, ' ')) as word from article) t group by word即可完成wordcount( )
– 对于统计任务,只能由动MapReduce的程序员才能搞定
– 耗时耗⼒,更多精⼒没有有效的释放出来
· Hive基于⼀个统⼀的查询分析层,通过SQL语句的⽅式对HDFS上的数据进⾏查询、统计和分析
1.2 Hive是什么
·
Hive是⼀个SQL解析引擎,将SQL语句转译成MR Job,然后再Hadoop平台上运⾏,达到快速开发的⽬的。
· Hive中的表是纯逻辑表,就只是表的定义等,即表的元数据。本质就是Hadoop的⽬录/⽂件,达到了元数据与数据存储分离的⽬的 · Hive本⾝不存储数据,它完全依赖HDFS和MapReduce。
· Hive的内容是读多写少,不⽀持对数据的改写和删除
· Hive中没有定义专门的数据格式,由⽤户指定,需要指定三个属性:
– 列分隔符
– ⾏分隔符
– 读取⽂件数据的⽅法
1.3  Hive中的SQL与传统SQL区别
Hive在0.8之后增加的索引为位图索引,⽽传统SQL有复杂的索引
1.4 Hive与传统关系数据特点⽐较
· hive和关系数据库存储⽂件的系统不同,hive使⽤的是hadoop的HDFS(hadoop的分布式⽂件系统),关系数据库则是服务器本地的⽂件系统;
· hive使⽤的计算模型是mapreduce,⽽关系数据库则是⾃⼰设计的计算模型;
· 关系数据库都是为实时查询的业务进⾏设计的,⽽hive则是为海量数据做数据挖掘设计的,实时性很差
· Hive很容易扩展⾃⼰的存储能⼒和计算能⼒,这个是继承hadoop的,⽽关系数据库在这个⽅⾯要⽐数据库差很多。
(⼆)Hive体系架构
2.1 Hive的基本组成
⽤户接⼝:包括 CLI、JDBC/ODBC、WebGUI。
元数据存储:通常是存储在关系数据库如 mysql , derby中。
语句转换:解释器、编译器、优化器、执⾏器。
1.  查询语⾔。由于 SQL 被⼴泛的应⽤在数据仓库中,因此,专门针对 Hive 的特性设计了类 SQL 的查询语⾔ HQL。熟悉 SQL 开发的开发者可以很⽅便的使⽤ Hive 进⾏开发。
2.  数据存储位置。Hive 是建⽴在Hadoop 之上的,所有 Hive 的数据都是存储在HDFS 中的。⽽数据库则可以将数据保存在块设备或者本地⽂件系统中。
3.  数据格式。Hive 中没有定义专门的数据格式,数据格式可以由⽤户指定,⽤户定义数据格式需要指定三个属性:列分隔符(通常为空格、”\t”、”\x001″)、⾏分隔符(”\n”)以及读取⽂件数据的⽅法(Hive 中默认有三个⽂件格式 TextFile,SequenceFile 以及RCFile)。由于在加载数据的过程中,不需要从⽤户数据格式到 Hive 定义的数据格式的转换,因此,Hive 在加载的过程中不会对数据本⾝进⾏任何修改,⽽只是将数据内容复制或者移动到相应的 HDFS ⽬录中。⽽在数据库中,不同的数据库有不同的存储引擎,定义了⾃⼰的数据格式。所有数据都会按照⼀定的组织存储,因此,数据库加载数据的过程会⽐较耗时。
4.  数据更新。由于 Hive 是针对数据仓库应⽤设计的,⽽数据仓库的内容是读多写少的。因此,Hive 中不⽀持对数据的改写和添加,所有的数据都是在加载的时候中确定好的。⽽数据库中的数据通常是需要经常进⾏修改的,因此可以使⽤ INSERT INTO ...  VALUES 添加数据,使⽤ SET 修改数据。
group by的用法及原理详解5.  索引。之前已经说过,Hive 在加载数据的过程中不会对数据进⾏任何处理,甚⾄不会对数据进⾏扫描,因此也没有对数据中的某些 Key 建⽴索引。Hive 要访问数据中满⾜条件的特定值时,需要暴⼒扫描整个数据,因此访问延迟较⾼。由于 MapReduce 的引⼊, Hive 可以并⾏访问数据,因此即使没有索引,对于⼤数据量的访问,Hive 仍然可以体现出优势。数据库中,通常会针对⼀个或者⼏个列建⽴索引,因此对于少量的特定条件的数据的访问,数据库可以有很⾼的效率,较低的延迟。由于数据的访问延迟较⾼,决定了 Hive 不适合在线数据查询。
6.  执⾏。Hive 中⼤多数查询的执⾏是通过 Hadoop 提供的 MapReduce 来实现的,⽽数据库通常有⾃⼰的执⾏引擎。
7.  执⾏延迟。之前提到,Hive 在查询数据的时候,由于没有索引,需要扫描整个表,因此延迟较⾼。另外⼀个导致 Hive 执⾏延迟⾼的因素是 MapReduce 框架。由于 MapReduce 本⾝具有较⾼的延迟,因此在利⽤ MapReduce 执⾏ Hive 查询时,也会有较⾼的延迟。相对的,数据库的执⾏延迟较低。当然,这个低是有条件的,即数据规模较⼩,当数据规模⼤到超过数据库的处理能⼒的时候,Hive 的并⾏计算显然能体现出优势。
8.  可扩展性。由于 Hive 是建⽴在 Hadoop 之上的,因此 Hive 的可扩展性是和 Hadoop 的可扩展性是⼀致的(世界上最⼤的 Hadoop 集在 Yahoo!,2009年的规模在4000 台节点左右)。⽽数据库由于
ACID 语义的严格限制,扩展⾏⾮常有限。⽬前最先进的并⾏数据库 Oracle 在理论上的扩展能⼒也只有 100 台左右。
9.      数据规模。由于 Hive 建⽴在集上并可以利⽤ MapReduce 进⾏并⾏计算,因此可以⽀持很⼤规模的数据;对应的,数据库可以⽀持的数据规模较⼩。
2.2 各组件的基本功能
⽤户接⼝主要由三个:CLI、JDBC/ODBC和WebGUI。其中,CLI为shell命令⾏;JDBC/ODBC是Hive的JAVA实现,与传统数据库JDBC类似;WebGUI是通过浏览器访问Hive。
元数据存储:Hive 将元数据存储在数据库中。Hive中的元数据包括表的名字,表的列和分区及其属性,表的属性(是否为外部表等),表的数据所在⽬录等。
解释器、编译器、优化器完成 HQL 查询语句从词法分析、语法分析、编译、优化以及查询计划的⽣成。⽣成的查询计划存储在HDFS 中,并在随后有 MapReduce 调⽤执⾏。
2.3 HIVE 和 HADOOP的关系
简化版
详细版
2.4 Hive的数据管理
· hive的表本质就是Hadoop的⽬录/⽂件
– hive默认表存放路径⼀般都是在你⼯作⽬录的hive⽬录⾥⾯,按表名做⽂件夹分开,如果你有分区表的话,分区值是⼦⽂件夹,可以直接在其它的M/R job⾥直接应⽤这部分数据
1、Hive中所有的数据都存储在 HDFS 中,没有专门的数据存储格式(可⽀持Text,SequenceFile,ParquetFile,RCFILE等)
2、只需要在创建表的时候告诉 Hive 数据中的列分隔符和⾏分隔符,Hive 就可以解析数据。
3、Hive 中包含以下数据模型:DB、Table,External Table,Partition,Bucket。
–  db:在hdfs中表现为${astore.warehouse.dir}⽬录下⼀个⽂件夹
– table:在hdfs中表现所属db⽬录下⼀个⽂件夹
–  external table:与table类似,不过其数据存放位置可以在任意指定路径
– partition:在hdfs中表现为table⽬录下的⼦⽬录
–  bucket:在hdfs中表现为同⼀个表⽬录下根据hash散列之后的多个⽂件
2.4.1 Hive中的内部表和外部表
· Hive的create创建表的时候,选择的创建⽅式:
– create table
– create external table
· 特点:
– 在导⼊数据到外部表,数据并没有移动到⾃⼰的数据仓库⽬录下,也就是说外部表中的数据并不是由它⾃⼰来管理的!⽽表则不⼀样;
– 在删除表的时候,Hive将会把属于表的元数据和数据全部删掉;⽽删除外部表的时候,Hive仅仅删除外部表的元数据,数据是不会删除的!
2.4.2 Hive中的Partition
· 在 Hive 中,表中的⼀个 Partition 对应于表下的⼀个⽬录,所有的 Partition 的数据都存储在对应的⽬录中
– 例如:pvs 表中包含 ds 和 city 两个 Partition,则
– 对应于 ds = 20090801, ctry = US 的 HDFS ⼦⽬录为:/wh/pvs/ds=20090801/ctry=US;
– 对应于 ds = 20090801, ctry = CA 的 HDFS ⼦⽬录为;/wh/pvs/ds=20090801/ctry=CA
· partition是辅助查询,缩⼩查询范围,加快数据的检索速度和对数据按照⼀定的规格和条件进⾏管理。
2.4.3 Hive中的Bucket
· hive中table可以拆分成partition,table和partition可以通过‘CLUSTERED BY’进⼀步分bucket,bucket中的数据可以通
过‘SORT BY’排序。
· create table bucket_user (id int,name string)clustered by (id) into 4 buckets;
· 'force.bucketing = true' 可以⾃动控制上⼀轮reduce的数量从⽽适配bucket的个数,当然,⽤户也可以⾃主设置duce.tasks去适配bucket个数
· Bucket主要作⽤:
– 数据sampling
– 提升某些查询操作效率,例如mapside join
· 查看sampling数据:
– hive> select * from student tablesample(bucket 1 out of 2 on id);
– tablesample是抽样语句,语法:TABLESAMPLE(BUCKET x OUT OF y)
– y必须是table总bucket数的倍数或者因⼦。hive根据y的⼤⼩,决定抽样的⽐例。例如,table总共分了64份,当y=32时,抽取
(64/32=)2个bucket的数据,当y=128时,抽取(64/128=)1/2个bucket的数据。x表⽰从哪个bucket开始抽取。例如,table总bucket 数为32,tablesample(bucket 3 out of 16),表⽰总共抽取(32/16=)2个bucket的数据,分别为第3个bucket和第(3+16=)19个bucket的数据。
2.4.4 Hive数据类型
- 数据类型
· TINYINT
· SMALLINT
· INT
· BIGINT
· BOOLEAN
· FLOAT
· DOUBLE
· STRING
· BINARY(Hive 0.8.0以上才可⽤)
· TIMESTAMP(Hive 0.8.0以上才可⽤)
– 复合类型
· Arrays:ARRAY<data_type>
· Maps:MAP<primitive_type, data_type>
· Structs:STRUCT<col_name: data_type[COMMENT col_comment],……>
· Union:UNIONTYPE<data_type, data_type,……>
2.4.5 HiveSQL——JoininMR 执⾏流程图
INSERT OVERWRITE TABLE pv_users
SELECT pv.pageid, u.age
FROM page_view pv
JOIN user u
ON (pv.userid = u.userid);
SELECT pageid, age, count(1)
FROM pv_users
GROUP BY pageid, age;

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。