HIVE的简单介绍
1. HIVE的起源(历史)
Hive 是建立在 Hadoop 上的数据仓库基础构架。它提供了一系列的工具,可以用来进行数据提取转化加载(ETL),这是一种可以存储、查询和分析存储在 Hadoop 中的大规模数据的机制。Hive 定义了简单的类 SQL 查询语言,称为 QL,它允许熟悉 SQL 的用户查询数据。同时,这个语言也允许熟悉 MapReduce 开发者的开发自定义的 mapper 和 reducer 来处理内建的 mapper 和 reducer 无法完成的复杂的分析工作。HIVE是应Facebook每天产生的海量新生社会网络数据进行管理和机器学习的需求而产生和发展的。
2. HIVE的原理
由上图可知,hadoop和mapreduce是hive架构的根基。Hive架构包括如下组件:CLI(command line interface)、JDBC/ODBC、Thrift Server、WEB GUI、metastore和Driver(Complier、Optimizer和Executor),这些组件我可以分为两大类:服务端组件和客户端组件。
服务端组件:
Driver组件:该组件包括Complier、Optimizer和Executor,它的作用是将我们写的HiveQL(类SQL)语句进行解析、编译优化,生成执行计划,然后调用底层的mapreduce计算框架。
Metastore组件:元数据服务组件,这个组件存储hive的元数据,hive的元数据存储在关系数据库里,hive支持的关系数据库有derby、mysql。元数据对于hive十分重要,因此hive支持把metastore服务独立出来,安装到远程的服务器集群里,从而解耦hive服务和metastore服务,保证hive运行的健壮性,这个方面的知识,我会在后面的metastore小节里做详细的讲解。
Thrift服务:thrift是facebook开发的一个软件框架,它用来进行可扩展且跨语言的服务的开发,hive集成了该服务,能让不同的编程语言调用hive的接口。
客户端组件:
CLI:command line interface,命令行接口。
Thrift客户端:上面的架构图里没有写上Thrift客户端,但是hive架构的许多客户端接口是建立在thrift客户端之上,包括JDBC和ODBC接口。
WEBGUI:hive客户端提供了一种通过网页的方式访问hive所提供的服务。这个接口对应hive的hwi组件(hive web interface),使用前要启动hwi服务。
执行原理:
3. HIVE的优缺点分析
1. 存储引擎。并行数据仓库需要先把数据装载到数据库中,按特定的格式存储成特定的页文件,然后才能查询;而Hive则不用装载数据,也不用格式转换,Hive内置了多种文件格式的支持,并且可以使用用户定制的格式实现(inputformat),这样大大节省了数据导入的开销。传统数据仓库是把数据导入系统中,而Hive则是动态的将对数据处理的逻辑(代码)导入系统中。
2. 执行引擎。Hive架构于MapReduceFramework之上,执行计划的灵活性较差,优化器可做的选择很少,例如:Join算法只有Grace Hash Join一种选择,性能更加优秀且稳定的Hybrid Hash Join则无法实现; Map端的Group-by算法只有Hash Group-by一种选择, Reduce端的Group-by只有sortgroup-by一种选择(不然MapReduce提供的sort就浪费了); limit无法和sort融合起来,很多情况下,用堆
排序来融合limit与sort会更加高效。 Join, Group-by, Limit在OLAP,日志分析等任务中非常常用的Operator,而Hive在这3个Operator的实现上都依赖于MapReduce Frameowork提供的partition和sort,好处是实现比较简单,缺点是效率往往不是最优的。然而,由于MapReduce数据处理流程的限制,效率更高的算法却无法实现。相反,并行数据仓库有充分的自由实现各种算法,它的查询优化器可以灵活的选择这3个Operator的不同实现。
3. 查询优化器。大多数商用数据仓库使用基于代价的优化器,在生成查询计划时,利用元数据中的统计信息估算每个operator要处理的数据量,选取代价较低的执行计划。不过,这些商用数据仓库的都起步于基于规则的查询优化器,而Hive正处于这样一个类似的起步阶段。因而Hive查询优化器能做的优化并不多,仅限于10几条转换规则。
4. 索引和缓冲管理。对于查询来说,索引的作用至关重要,尽管Hive中的
partition起到和索引类似的作用,但还比较初级,与并行数据仓库较为完善的索引(primary,secondary, clustered, unclustered)还有很大差距。当然,Hive也没有缓冲区管理机制,只能依赖于文件系统的缓冲机制;并行数据仓库往往禁用操作系统的缓冲机制,针对不同的查询的特点设计了多种缓冲机制,从而优化了性能。
5. 并行扩展性。MapReduce将MR job的中间结果保存到MapTask的本地硬盘,从而MR Job的容错性非常好,Hive自然的利用了这一点;Hive执行计划中,每一个MapReduce job又把处理结果写到HDFS,从而又利用了HDFS的容错性。这样,在一个Hive查询的执行中,如果某个节点出现故障了,只需要重新调度执行该节点的任务即可,不需要重新提交查询。因此,Hive有非常好的intra-query fault-tolerance,所以可扩展性非常强,例如一个查询可以在4000个节点上同时跑;缺点是大大减少了pipeline parallelism的机会。并行数据仓库往往采用的是pipeline架构,上游的Operator每产生一条数据就会送去下游的Operator。这样的好处是最大化了pipeline parallelism并避免了中间结果的磁盘读写,但是,当一个查询运行于并行数据库上时,一旦一个节点出现故障,并行数据仓库就必须重新执行该查询。所以,当一个集群中的单点故障发生率较高时,并行数据仓库的性能就会下降了。假设每个节点故障发生率是0.01%,那么1000个节点的集群中,单点故障发生率则为10%;假设每个节点故障发生率是0.0001%,那么5000个节点的集群中,单点故障发生率为0.5%!
6. 内存拷贝开销。千万别小看这一点,内存拷贝会很大程度上拖累系统性能。我们可以注意到,Hive中所有的哈希,比较,数值运算操作,聚集函数,都需要操作在Writable Object上,而每次重置(reset)这些Writable Object,都需要将数据
从byte array拷贝到这些对象的byte[]成员中。在更精巧的实现中,很多内存拷贝其实是可以避免的,并行数据仓库往往做了很多优化(甚至包含操作系统内核的优化,比如Teradata的PDE)去节省不必要的内存拷贝,从而又带来了性能提升。
4.HIVE的操作应用
启动HIVE外壳环境
命令:hive
查看已有的表
命令:show tables;
创建表
hive> CREATE TABLE pokes (foo INT, barSTRING);
创建表并创建索引字段ds
hive> CREATE TABLE invites (foo INT, barSTRING) PARTITIONED BY (ds STRING);
显示所有表
hive> SHOW TABLES;
表添加一列
hive> ALTER TABLE pokes ADD COLUMNS (newcolINT);
添加一列并增加列字段注释
hive> ALTER TABLE invites ADD COLUMNS(new_col2 INT COMMENT 'a comment');
更改表名
hive> ALTER TABLE events RENAME TO3koobecaf;
删除列
hive>alter table alter_test replacecolumns (id int, name string); //括号内为要保留的列
删除表
hive> DROP TABLE pokes;
元数据存储
将文件中的数据加载到表中
hive> LOAD DATA LOCAL INPATH'./examples/files/kv1.txt' OVERWRITE INTO TABLE pokes;
加载本地数据,同时给定分区信息
hive> LOAD DATA LOCAL INPATH'./examples/files/kv2.txt' OVERWRITE INTO TABLE invites PARTITION (ds='2008-08-15');
加载DFS数据,同时给定分区信息
hive> LOAD DATA INPATH'/user/myname/kv2.txt' OVERWRITE INTO TABLE invites PARTITION(ds='2008-08-15');
SQL 操作
按先件查询
hive> SELECT a.foo FROM invites a WHEREa.ds='';
将查询数据输出至目录
hive> INSERT OVERWRITE DIRECTORY'/tmp/hdfs_out' SELECT a.* FROM invites a WHERE a.ds='';
将查询结果输出至本地目录
hive> INSERT OVERWRITE LOCAL DIRECTORY'/tmp/local_out' SELECT a.* FROM pokes a;
选择所有列到本地目录
hive> INSERT OVERWRITE TABLE eventsSELECT a.* FROM profiles a;
将一个表的统计结果插入另一个表中
hive> FROM invites a INSERT OVERWRITETABLE events SELECT a.bar, count(1) WHERE a.foo > 0 GROUP BY a.bar;
hive> INSERT OVERWRITE TABLE eventsSELECT a.bar, count(1) FROM invites a WHERE a.foo > 0 GROUP BY a.bar;
hive> FROM pokes t1 JOIN invites t2 ON(t1.bar = t2.bar) INSERT OVERWRITE TABLE events SELECT t1.bar, t1.foo, t2.foo;
将多条数据插入到同一表中
INSERT OVERWRITE TABLE dest1 SELECT src.*WHERE src.key < 100
将文件流直接插入文件
hive> FROM invites a INSERT OVERWRITETABLE events SELECT TRANSFORM(a.foo, a.bar) AS (oof, rab) USING '/bin/cat'WHERE a.ds > '2008-08-09';
4. HIVE的应用场景
Hive 是一个基于 hadoop 的开源数据仓库工具,用于存储和处理海量结构化数据。它把海量数据存储于 hadoop 文件系统,而不是数据库,但提供了一套类数据库的数据存储和处理机制,并采用 HQL (类 SQL )语言对这些数据进行自动化管理和处理。我们可以把 Hive 中海量结构化数据看成一个个的表,而实际上这些数据是分布式存储在 HDFS 中的。 Hive 经过对语句进行解析和转换,最终生成一系列基于 hadoop 的 map/reduce 任务,通过执行这些任务完成数据处理。Hive主要用于日志的数据报表、统计分析、数据挖掘等应用场景。
声明:本文内容来自网络整理。