@sasaki
2016-04-22T03:25:14.000000Z
字数 5594
阅读 3675
BigData
@Title Hive——数据分析系统@Version v1.0@Timestamp 2016-01-20 18:08@Author Nicholas@Mail redskirt@outlook.com
Hive简介
Hive典型应用场景
Hive的特性
Hive的缺陷
Hive基本架构

Hive主要模块
部署Hive实验环境(单机)

部署Hive生产环境(集群)

部署Hive metastore服务

${HIVE_HOME}/bin/hive --helpHive外部资源
ADD { FILE[S] | JAR[S] | ARCHIVE[S] } <filepath1> [<filepath2>]*LIST { FILE[S] | JAR[S] | ARCHIVE[S] } [<filepath1> <filepath2> ..]DELETE { FILE[S] | JAR[S] | ARCHIVE[S] } [<filepath1> <filepath2> ..]
Hive客户端程序
方法1:提供JDBC/ODBC访问方式
方法2:采用开源软件Thrift实现C/S模型,支持任何语言编写客户端程序
数据模型

数据类型

Hive特有的数据类型

数据定义语句( DDL)
CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name(col_name data_type, ...)[PARTITIONED BY (col_name data_type, ...)][CLUSTERED BY (col_name, col_name, ...) [SORTED BY(col_name [ASC|DESC], ...)] INTO num_buckets BUCKETS][SKEWED BY (col_name, col_name, ...)][ [ROW FORMAT row_format] [STORED AS file_format] ][LOCATION hdfs_path]
内部表与外部表示例
create external table sogouqueryfish(time varchar(8),userid varchar(30),query string,pagerank int,clickrank int,site string) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'location 'hdfs://master:8020/data/SogouQtmp';
create table sogouqueryfish(time varchar(8),userid varchar(30),query string,pagerank int,clickrank int,site string) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'location 'hdfs://master:8020/data/SogouQtmp';drop table sogouqueryfish;
Hive创建内部表时,会将数据移动到数据仓库指向的路径;若创建外部表,仅记录数据所在的路径,不对数据的位置做任何改变。在删除表的时候,内部表的元数据和数据会被一起删除,而外部表只删除元数据,不删除数据。这样外部表相对来说更加安全些,数据组织也更加灵活,方便共享源数据。
# 在HDFS中准备数据[root@master tmp]# hadoop fs -tail /user/root/sogo/SogouQ.reduced# 启动Hive CLI[root@master hive]# hive16/01/21 17:17:08 WARN conf.HiveConf: DEPRECATED: Configuration property hive.metastore.local no longer has any effect. Make sure to provide a valid value for hive.metastore.uris if you are connecting to a remote metastore.Logging initialized using configuration in jar:file:/opt/cloudera/parcels/CDH-5.3.8-1.cdh5.3.8.p0.5/jars/hive-common-0.13.1-cdh5.3.8.jar!/hive-log4j.propertieshive> show tables;OKTime taken: 0.111 seconds# 创建外部表示例# location后面跟的是目录,不是文件,hive会把整个目录下的文件都加载到表中hive> create external table test_sogo(time varchar(8), userid varchar(30), query string, pagerank int, clickrank int, site string) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' location 'hdfs://master:8020/user/root/sogo/';OKTime taken: 0.065 secondshive> show tables;OKtest_sogoTime taken: 0.022 seconds, Fetched: 1 row(s)# 创建内部表示例hive> create table test_sogo_(time varchar(8), userid varchar(30), query string, pagerank int, clickrank int, site string) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' location 'hdfs://master:8020/user/root/sogo/';OKTime taken: 0.059 seconds# 分别进行删除hive> show tables; OKtest_sogotest_sogo_Time taken: 0.023 seconds, Fetched: 2 row(s)hive> drop table test_sogo;OKTime taken: 0.098 secondshive> drop table test_sogo_;OKTime taken: 0.132 secondshive> show tables;OKTime taken: 0.023 seconds
Partitions
传统数据库常常使用“天表”、“月表”、“年表”的方式组织数据库以避免单表过大导致的性能问题。
Hive使用partitions概念解决该问题,比如,相较于“天表”,Hive每天创建一个新的partition。当使用partitions时,可以在不扫描整个表的情况下操作必要的数据。
CREATE TABLE sogouqueryfish(time varchar(8), userid varchar(30), query string, pagerank int,clickrank int, site string) PARTITIONED BY (day STRING) ROW FORMAT DELIMITED FIELDSTERMINATED BY '\t';LOAD DATA INPATH '/data/SogouQ/SogouQ.sample' INTO TABLE sogouqueryfishPARTITION(day='2014-01-01');
将会在Hdfs 中 page_view文件夹中创建按日期命名的文件夹
../sogouqueryfish/day=2014-01-01/..../sogouqueryfish/day=2014-01-02/....../sogouqueryfish/day=2014-01-06/..
注意事项:
Bucket
Bucket类似于Partition。 Buckets根据查询常用的关键字的哈希值将数据分不到到用户自定义集合中。当需要做分区的列为连续值时,适合使用Bucket。
假设,在user_id列上执行查询 ,在user_id列上使用buckets。
CREATE TABLE page_views_old(user_id INT, session_id INT, url STRING) PARTITIONED BY(day INT) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';LOAD DATA INPATH '/data/PageView/pageview.sample' INTO TABLE page_views_old PARTITION(day=1);set hive.enforce.bucketing = true;CREATE TABLE page_views(user_id INT, session_id INT, url STRING) PARTITIONED BY(day INT) clustered by(user_id) into 10 buckets ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';from page_views_old insert overwrite table page_views partition(day=1) select user_id,session_id,url where day=1;
通过以上语句,表中的数据将会根据user_id的哈希数分成10个buckets。因此,当查询确定的user_id时,程序首先计算user_id的哈希数然后只查找对应的bucket。
进一步理解bucket的细节。假定以下是要向page_view表插入的数据:
(user_id, session_id, url)(1, 1111, http://example.com/page/1)(2, 354, http://example.com/page/1)(22, 76764, http://example.com/page/1)(21, 74747, http://example.com/page/1)..(63, 64646, http://example.com/page/1)
假设,哈希值的算法是对user_id的值对10取模。然后在加载数据时,程序会计算每个user_id的哈希值,并根据哈希排列每条记录。
对于第一条记彔,根据user_id= 1计算哈希值1 modulus 10 = 1
对于user_id=22的记彔,其哈希值是2 (22 modulus 10 = 2)
对于user_id=63的记彔,其哈希值是3 (63 modulus 10 = 3)
因此所有的数据将会被分配到名为0-9的bucket中,当检索user_id=89的数据时,程序只会到Bucket 9查找。这样就丌会为了查找这个id而扫描整个表,节省了很多时间。