简而言之,数据仓库是用来做查询分析的数据库,基本不用来做插入,修改,删除操作。
Operator都是hive定义的一个处理过程
Operator都定义有:
protected List
protected List
protected boolean done; // 初始化值为false
用户接口主要有三个:CLI,Client 和 WUI。
其中最常用的是CLI命令行,Cli启动的时候,会同时启动一个Hive副本;Client是Hive的客户端,用户连接至Hive Server。在启动 Client模式的时候,需要指出Hive Server所在节点,并且在该节点启动Hive Server。 WUI是通过浏览器访问Hive。
内嵌模式(元数据保存在内嵌的derby中,允许一个会话链接,尝试多个会话链接时会报错)【了解】
这种安装模式的元数据是内嵌在Derby数据库中的,只能允许一个会话连接,数据会存放到HDFS上。
这种方式是最简单的存储方式,只需要hive-site.xml
做如下配置便可(注:使用 derby 存储方式时,运行 hive 会在当前目录生成一个 derby 文件和一个 metastore_db)
javax.jdo.option.ConnectionURL jdbc:derby:;databaseName=metastore_db;create=true javax.jdo.option.ConnectionDriverName org.apache.derby.jdbc.EmbeddedDriver hive.metastore.local true hive.metastore.warehouse.dir /user/hive/warehouse
本地模式(本地安装mysql 替代derby存储元数据)【重要】
这种安装方式和嵌入式的区别在于,不再使用内嵌的Derby作为元数据的存储介质,而是使用其他数据库比如MySQL来存储元数据且是一个多用户的模式,运行多个用户client连接到一个数据库中。这种方式一般作为公司内部同时使用Hive。这里有一个前提,每一个用户必须要有对MySQL的访问权利,即每一个客户端使用者需要知道MySQL的用户名和密码才行。
这种存储方式需要在本地运行一个 mysql 服务器,并作如下配置(下面两种使用 mysql 的方式,需要将 mysql 的 jar 包拷贝到
$HIVE_HOME/lib 目录下)。
hive.metastore.warehouse.dir /user/hive_rlocal/warehouse hive.metastore.local true javax.jdo.option.ConnectionURL jdbc:mysql://node03/hive_remote?createDatabaseIfNotExist=true javax.jdo.option.ConnectionDriverName com.mysql.jdbc.Driver javax.jdo.option.ConnectionUserName root javax.jdo.option.ConnectionPassword 123456
注意:hive和MySQL不用做HA,单节点就可以。通过设置其他节点可以访问得到数据库。以上例子说明了这一情况,即node5上安装hive 连接node8上的MySQL;
hive.metastore.warehouse.dir /user/hive/warehouse2 javax.jdo.option.ConnectionURL jdbc:mysql://node03:3306/hive?createDatabaseIfNotExist=true javax.jdo.option.ConnectionDriverName com.mysql.jdbc.Driver javax.jdo.option.ConnectionUserName root javax.jdo.option.ConnectionPassword 123456 hive.metastore.local false hive.metastore.uris thrift://node01:9083
注:这里把 hive 的服务端和客户端都放在同一台服务器上了。服务端和客户端可以拆开
1)、服务端配置文件
hive.metastore.warehouse.dir /user/hive/warehouse javax.jdo.option.ConnectionURL jdbc:mysql://node03:3306/hive?createDatabaseIfNotExist=true javax.jdo.option.ConnectionDriverName com.mysql.jdbc.Driver javax.jdo.option.ConnectionUserName root javax.jdo.option.ConnectionPassword 123456
2)、客户端配置文件
hive.metastore.warehouse.dir /user/hive/warehouse hive.metastore.local false hive.metastore.uris thrift://node01:9083
服务端启动 hive 程序 hive --service metastore
客户端直接使用 hive 命令即可 root@my188:~$ hive
Hive history
file=/tmp/root/hive_job_log_root_201301301416_955801255.txt
hive> show tables;
OK test_hive
Time taken: 0.736 seconds hive>
Hive常见问题总汇:http://blog.csdn.net/freedomboy319/article/details/44828337
完整的建表语句:
建表实例:
create table abc(
id int,
name string,
age int,
likes array,
address map
)
row format delimited fields terminated by ‘,’
COLLECTION ITEMS TERMINATED by ‘-’
map keys terminated by ‘:’
lines terminated by ‘\n’;
Select address[‘city’] from person where name=‘zs’;
数据如下:
1,zshang,18,game-girl-book,stu_addr:beijing-work_addr:shanghai
2,lishi,16,shop-boy-book,stu_addr:hunan-work_addr:shanghai
3,wang2mazi,20,fangniu-eat,stu_addr:shanghai-work_addr:tianjing
导入数据(属于DML但是为了演示需要在此应用):
LOAD DATA [LOCAL] INPATH ‘filepath’ [OVERWRITE] INTO TABLE tablename [PARTITION (partcol1=val1, partcol2=val2 …)]
因为hive的元数据存储在数据库上MySQL上,查看元数据信息,发现此处我们之前配置的hdfs数据存放位置为:hdfs://jackie/Jackie/****
外部表(重要):外部关键字EXTERNAL允许您创建一个表,并提供一个位置,以便hive不使用这个表的默认位置。这方便如果你已经生成的数据。当删除一个外部表,表中的数据不是从文件系统中删除。外部表指向任何HDFS的存储位置,而不是存储在配置属性指定的文件夹 hive.metastore.warehouse.dir.中
重命名表
ALTER TABLE table_name RENAME TO new_table_name;
Eg: alter table abc rename to jack;
更新数据
UPDATE tablename SET column = value [, column = value …] [WHERE expression]
删除数据
DELETE FROM tablename [WHERE expression]
具体参见:https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DML
重点是数据加载和查询插入语法
Hive数据操作语言(LanguageManual DML)
Hive不能很好的支持用insert语句一条一条的进行插入操作,不支持update操作。数据是以load的方式加载到建立好的表中。数据一旦导入就不可以修改。
第一种:
LOAD DATA [LOCAL] INPATH ‘filepath’ [OVERWRITE] INTO TABLE tablename [PARTITION (partcol1=val1, partcol2=val2 …)]
第二种:
创建person2表,然后从表person1…中导入数据:
INSERT OVERWRITE TABLE person2 [PARTITION(dt=‘2008-06-08’, country)]
SELECT id,name, age From ppt;
第三种:
FROM person t1
INSERT OVERWRITE TABLE person1 [PARTITION(dt=‘2008-06-08’, country)]
SELECT t1.id, t1.name, t1.age ;
【from放前面好处就是后面可以插入多条语句 】
FROM abc t1,sufei t2
INSERT OVERWRITE TABLE qidu
SELECT t1.id,t1.name,t1.age,t2.likes,t2.address
FROM abc t1,sufei t2
INSERT into TABLE qidu
SELECT t2.id,t2.name,t2.age,t1.likes,t1.address where t1.id=t2.id
INSERT OVERWRITE TABLE qq
SELECT t1.id,t2.name,t2.age,t1.likes,t1.address where t1.id=t2.id;
本地load数据和从HDFS上load加载数据的过程有什么区别?
本地: local 会自动复制到HDFS上的hive的**目录下
A、保存数据到本地:
例: insert overwrite local directory ‘/opt/datas/hive_exp_emp2’
ROW FORMAT DELIMITED FIELDS TERMINATED BY ‘,’
select * from db_1128.emp ;
//查看数据
!cat /opt/datas/hive_exp_emp2/000000_0;
B、保存数据到HDFS上:
例: insert overwrite directory ‘/user/hive/hive_exp’
select * from sufei;
C、在shell中将数据重定向到文件中:
http://www.2cto.com/kf/201609/545560.html
Hive SerDe - Serializer and Deserializer SerDe 用于做序列化和反序列化。
构建在数据存储和执行引擎之间,对两者实现解耦。
Hive通过ROW FORMAT DELIMITED以及SERDE进行内容的读写。
row_format
: DELIMITED
[FIELDS TERMINATED BY char [ESCAPED BY char]]
[COLLECTION ITEMS TERMINATED BY char]
[MAP KEYS TERMINATED BY char]
[LINES TERMINATED BY char]
: SERDE serde_name [WITH SERDEPROPERTIES (property_name=property_value, property_name=property_value, …)]
表数据见数据文件:localhost_access_log.2016-02-29.txt
Hive正则匹配
CREATE TABLE logtbl ( host STRING, identity STRING, t_user STRING, time STRING, request STRING, referer STRING, agent STRING) ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe' WITH SERDEPROPERTIES ( "input.regex" = "([^ ]*) ([^ ]*) ([^ ]*) \\[(.*)\\] \"(.*)\" (-|[0-9]*) (-|[0-9]*)" ) STORED AS TEXTFILE;
一般是平台使用展示或接口,服务端启动hiveserver2后,在java代码中通过调用hive的jdbc访问默认端口10000进行连接、访问
注意:必须在表定义时创建partition !
分区分为:单分区和多分区
分区分为:静态分区和动态分区
https://www.cnblogs.com/kimbo/p/6288516.html
https://www.iteblog.com/archives/2258.html#3_avg
https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF#LanguageManualUDF-Built-inFunctions
http://blog.csdn.net/duan19056/article/details/17917253
多行进一行出,如 sum()、min(),用在 group by 时
UDTF:一进多出,如 lateral view explore()
索引是hive0.7之后才有的功能,创建索引需要评估其合理性,因为创建索引也是要磁盘空间,维护起来也是需要代价的
在hive0.12.0和更早的版本中,索引名称是区分大小写的创建索引,索引语句。然而,改变指数需要索引名称用小写字母(参见创建hive 2752)。这个bug是固定的hive0.13.0对所有HiveQL语句通过索引名称不区分大小写。0.13.0之前发布的最佳实践是使用小写字母索引名称。
CREATE INDEX index_name ON TABLE base_table_name (col_name, ...) AS index_type [WITH DEFERRED REBUILD] [IDXPROPERTIES (property_name=property_value, ...)] [IN TABLE index_table_name] [ [ ROW FORMAT ...] STORED AS ... | STORED BY ... ] [LOCATION hdfs_path] [TBLPROPERTIES (...)] [COMMENT "index comment"];
一个表上创建索引创建一个索引使用给定的列表的列作为键。看到创建索引索引设计文档。
create table cell_monitor( record_time string, imei string, cell string, ph_num int, call_num int, drop_num int, duration int, drop_rate DOUBLE, net_type string, erl string ) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' STORED AS TEXTFILE;
结果表
create table cell_drop_monitor( imei string, total_call_num int, total_drop_num int, d_rate DOUBLE ) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' STORED AS TEXTFILE;
LOAD DATA LOCAL INPATH ‘/opt/data/cdr_summ_imei_cell_info.csv’
OVERWRITE INTO TABLE cell_monitor;
from cell_monitor cm insert overwrite table cell_drop_monitor select cm.imei, sum(cm.drop_num),sum(cm.duration),sum(cm.drop_num)/sum(cm.duration) d_rate group by cm.imei sort by d_rate desc;
create table docs(line string); create table wc(word string, totalword int);
load data local inpath ‘/tmp/wc’ into table docs;
from (select explode(split(line, ' ')) as word from docs) w insert into table wc select word, count(1) as totalword group by word order by word;
select * from wc;
分桶表是对列值取哈希值的方式,将不同数据放到不同文件中存储。
对于hive中每一个表、分区都可以进一步进行分桶。
由列的哈希值除以桶的个数来决定每条数据划分在哪个桶中。
适用场景:
数据抽样( sampling )、map-join
set hive.enforce.bucketing=true;
默认:false;设置为true之后,mr运行时会根据bucket的个数自动分配reduce task个数。(用户也可以通过mapred.reduce.tasks自己设置reduce任务个数,但分桶时不推荐使用)
注意:一次作业产生的桶(文件数量)和reduce task个数一致。
select * from bucket_table tablesample(bucket 1 out of 4 on columns);
TABLESAMPLE语法:
TABLESAMPLE(BUCKET x OUT OF y)
x:表示从哪个bucket开始抽取数据
y:必须为该表总bucket数的倍数或因子
创建普通表
例:
CREATE TABLE mm( id INT, name STRING, age INT) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';
测试数据:
1,tom,11
2,cat,22
3,dog,33
4,hive,44
5,hbase,55
6,mr,66
7,alice,77
8,scala,88
创建分桶表
CREATE TABLE psnbucket( id INT, name STRING, age INT) CLUSTERED BY (age) INTO 4 BUCKETS ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';
加载数据:
insert into table psnbucket select id, name, age from mm;
抽样
select id, name, age from psnbucket tablesample(bucket 2 out of 4 on
age);
hive Lateral View
Lateral View用于和UDTF函数(explode、split)结合来使用。
首先通过UDTF函数拆分成多行,再将多行结果组合成一个支持别名的虚拟表。
主要解决在select使用UDTF做查询过程中,查询只能包含单个UDTF,不能包含其他字段、以及多个UDTF的问题
语法:
LATERAL VIEW udtf(expression) tableAlias AS columnAlias (’,’ columnAlias)
例:
统计人员表中共有多少种爱好、多少个城市?
select count(distinct(myCol1)), count(distinct(myCol2)) from psn2
LATERAL VIEW explode(likes) myTable1 AS myCol1
LATERAL VIEW explode(address) myTable2 AS myCol2, myCol3;
与hdfs交互:
执行dfs命令:例子:dfs -ls
与Linux交互
!开头:例子:!pwd
Hive Web GUI接口
web界面安装:
hive.hwi.listen.host 0.0.0.0 hive.hwi.listen.port 9999 hive.hwi.war.file lib/hive-hwi.war
5、启动hwi服务(端口号9999)
hive --service hwi
6、浏览器通过以下链接来访问
http://node03:9999/hwi/
Hive - SQL Standards Based Authorization in HiveServer2
Storage Based Authorization in the Metastore Server基于存储的授权
可以对Metastore中的元数据进行保护,但是没有提供更加细粒度的访问控制(例如:列级别、行级别)。
SQL Standards Based Authorization in HiveServer2基于SQL标准的Hive授权
完全兼容SQL的授权模型,推荐使用该模式。
Default Hive Authorization (Legacy Mode) hive默认授权
设计目的仅仅只是为了防止用户产生误操作,而不是防止恶意用户访问未经授权的数据。
基于SQL标准的完全兼容SQL的授权模型,除支持对于用户的授权认证,还支持角色role的授权认证
role可理解为是一组权限的集合,通过role为用户授权
一个用户可以具有一个或多个角色
默认包含俩种角色:public、admin
限制:
在hive服务端修改配置文件hive-site.xml添加以下配置内容:
hive.security.authorization.enabled true hive.server2.enable.doAs false hive.users.in.admin.role root hive.security.authorization.manager org.apache.hadoop.hive.ql.security.authorization.plugin.sqlstd.SQLStdHiveAuthorizerFactory hive.security.authenticator.manager org.apache.hadoop.hive.ql.security.SessionStateUserAuthenticator
服务端启动hiveserver2;客户端通过beeline进行连接
角色的添加、删除、查看、设置:
CREATE ROLE role_name; – 创建角色
DROP ROLE role_name; – 删除角色
SET ROLE (role_name|ALL|NONE); – 设置角色
SHOW CURRENT ROLES; – 查看当前具有的角色
SHOW ROLES; – 查看所有存在的角色
GRANT role_name TO user;-- 授权
REVOKE role_name FROM user-- 移除权限
SHOW ROLE GRANT user–查看某个用户的角色列表
SHOW PRINCIPALS role_name–查看该角色属于哪个用户
权限的添加、删除,查看:
GRANT priv_type on/to user/role_name --授予权限
REVOKE priv_type on/from user/role_name --移除权限
SHOW GRANT on user/role_name --查看权限
核心思想:把Hive SQL 当做Mapreduce程序去优化
以下SQL不会转为Mapreduce来执行
–select仅查询本表字段
–where仅对本表字段做条件过滤
Explain 显示执行计划
EXPLAIN [EXTENDED] query
Hive运行方式:
本地模式 100MB
集群模式
开启本地模式:
set hive.exec.mode.local.auto=true;
注意:
hive.exec.mode.local.auto.inputbytes.max默认值为128M【134217728】
表示加载文件的最大值,若大于该配置仍会以集群方式来运行!
查询限制:
1、对分区表查询时,必须添加where对于分区字段的条件过滤;
2、order by语句必须包含limit输出限制;
3、限制执行笛卡尔积的查询
Hive排序
Order By - 对于查询结果做全排序,只允许有一个reduce处理
(当数据量较大时,应慎用。严格模式下,必须结合limit来使用)
Sort By - 对于单个reduce的数据进行排序
Distribute By - 分区排序,经常和Sort By结合使用
Cluster By - 相当于 Sort By + Distribute By
(Cluster By不能通过asc、desc的方式指定排序规则;
可通过 distribute by column sort by column asc|desc 的方式)
Hive Join
Join计算时,将小表(驱动表)放在join的左边
Map Join:在Map端完成Join
两种实现方式:
SQL方式,在SQL语句中添加MapJoin标记(mapjoin hint)
语法:
SELECT /*+ MAPJOIN(smallTable) */ smallTable.key, bigTable.value
FROM smallTable JOIN bigTable ON smallTable.key = bigTable.key;
开启自动的MapJoin
通过修改以下配置启用自动的mapjoin:
set hive.auto.convert.join = true;
(该参数为true时,Hive自动对左边的表统计量,如果是小表就加入内存,即对小表使用Map join)
其他相关配置参数:
hive.mapjoin.smalltable.filesize;
(大表小表判断的阈值25MB左右,如果表的大小小于该值则会被加载到内存中运行)
hive.ignore.mapjoin.hint;
(默认值:true;是否忽略mapjoin hint 即mapjoin标记)
hive.auto.convert.join.noconditionaltask;
(默认值:true;将普通的join转化为普通的mapjoin时,是否将多个mapjoin转化为一个mapjoin)
hive.auto.convert.join.noconditionaltask.size;
(将多个mapjoin转化为一个mapjoin时,其表的最大值)
相关配置参数:
hive.groupby.mapaggr.checkinterval:
map端group by执行聚合时处理的多少行数据(默认:100000)
hive.map.aggr.hash.min.reduction:
进行聚合的最小比例(预先对100000条数据做聚合,若聚合之后的数据量 /100000的值大于该配置0.5,则不会聚合)
hive.map.aggr.hash.percentmemory:
map端聚合使用的内存的最大值
hive.map.aggr.hash.force.flush.memory.threshold:
map端做聚合操作是hash表的最大可用内容,大于该值则会触发flush
hive.groupby.skewindata
是否对GroupBy产生的数据倾斜做优化,默认为false
Reduce数量相关的参数
mapred.reduce.tasks
强制指定reduce任务的数量
hive.exec.reducers.bytes.per.reducer
每个reduce任务处理的数据量
hive.exec.reducers.max
每个任务最大的reduce数 [Map数量 >= Reduce数量 ]
通过 set mapred.job.reuse.jvm.num.tasks=n; 来设置
(n为task插槽个数)
缺点:设置开启之后,task插槽会一直占用资源,不论是否有task运行,
直到所有的task即整个job全部执行完成时,才会释放所有的task插槽资源!
hive和hbase同步
https://cwiki.apache.org/confluence/display/Hive/HBaseIntegration
把hive-hbase-handler-1.2.1.jar cp到hbase/lib 下
同时把hbase中的所有的jar,cp到hive/lib
在hive的配置文件增加属性:
hbase.zookeeper.quorum
node01,node02,node03
在hive中创建临时表
CREATE EXTERNAL TABLE tmp_order
(key string, id string, user_id string)
STORED BY ‘org.apache.hadoop.hive.hbase.HBaseStorageHandler’
WITH SERDEPROPERTIES (“hbase.columns.mapping” = “:key,order:order_id,order:user_id”)
TBLPROPERTIES (“hbase.table.name” = “t_order”);
CREATE TABLE hbasetbl(key int, name string, age string)
STORED BY ‘org.apache.hadoop.hive.hbase.HBaseStorageHandler’
WITH SERDEPROPERTIES (“hbase.columns.mapping” = “:key,cf1:name,cf1:age”)
TBLPROPERTIES (“hbase.table.name” = “xyz”, “hbase.mapred.output.outputtable” = “xyz”);
注:实际文件保存在hbase中hive只有映射,但是可以查看数据