@sasaki
2016-04-22T11:25:14.000000Z
字数 5594
阅读 3314
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 --help
Hive外部资源
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]# hive
16/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.properties
hive> show tables;
OK
Time 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/';
OK
Time taken: 0.065 seconds
hive> show tables;
OK
test_sogo
Time 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/';
OK
Time taken: 0.059 seconds
# 分别进行删除
hive> show tables; OK
test_sogo
test_sogo_
Time taken: 0.023 seconds, Fetched: 2 row(s)
hive> drop table test_sogo;
OK
Time taken: 0.098 seconds
hive> drop table test_sogo_;
OK
Time taken: 0.132 seconds
hive> show tables;
OK
Time 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 FIELDS
TERMINATED BY '\t';
LOAD DATA INPATH '/data/SogouQ/SogouQ.sample' INTO TABLE sogouqueryfish
PARTITION(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而扫描整个表,节省了很多时间。