Hadoop----Hive

Hadoop-----Hive

    • Hive及数据仓库简介
    • 数据处理分类
    • hive如何执行
    • Operator操作
    • ANTLR词法语法分析工具解析hql
    • Hive架构原理
    • Hive搭建
    • 三种模式
    • HQL详解
      • 创建/删除/修改/使用数据库
      • 创建/删除/表(*)
      • 修改表,更新,删除数据(这些很少用)
    • DML语句
      • 四种插入/导入数据(重要)
      • 查询数据并保存
      • 备份数据或还原数据
      • Hive的group by\join(left join right join等)\having\sort by \order by等操作和MySQL没有什么大的区别:
      • Hive SerDe
    • Beeline和Hiveserver2
    • Hive的JDBC
    • Hive分区
      • 静态分区
      • 动态分区--注意外部表
    • 函数自定义
      • UDF开发(常用)
      • UDAF自定义集函数(不常用)
      • UDTF(不常用)
    • Hive索引
    • 实际案例
      • 基站掉话率
      • 单词统计
    • 分桶
      • 分桶表及应用场景
      • 开启支持分桶
      • 往分桶表中加载数据
    • Hive Lateral View
    • 运行方式
    • hive的GUI接口
    • 权限管理
    • Hive的优化
  • Hive和Hbase整合

Hive及数据仓库简介

  • Hive是基于 Hadoop 的一个【数据仓库工具】,可以将结构化的数据文件映射为一张hive数据库表,并提供简单的 sql 查询功能,可以将 hql 语句转换为 MapReduce 任务进行运行。非Java编程者对HDFS的数据做mapreduce操作。
  • 使用SQL来快速实现简单的MapReduce 统计,不必开发专门的MapReduce 应用,学习成本低,十分适合数据仓库的统计分析。
  • 【数据仓库】英文名称为 Data Warehouse,可简写为 DW 或 DWH。数据仓库,是为企业所有级别的决策制定过程,提供所有类型数据支持的战略集合。它是单个数据存储,出于分析性报告和决策支持目的而创建。为需要业务智能的企业,提供指导业务流程改进、监视时间、成本、质量以及控制.

数据处理分类

  • 数据处理大致可以分成两大类: 联机事务处理OLTP(on-line transaction processing)、联机分析处理OLAP(On-Line Analytical Processing)。
  • OLTP是传统的关系型数据库的主要应用,主要是基本的、日常的事务处理,例如银行交易。
  • OLAP是数据仓库系统的主要应用,支持复杂的分析操作,侧重决策支持,并且提供直观易懂的查询结果。
  • OLTP系统强调数据库内存效率,强调内存各种指标的命令率,强调绑定变量,强调并发操作;
  • OLAP系统则强调数据分析,强调SQL执行市场,强调磁盘I/O,强调分区等。

hive如何执行

简而言之,数据仓库是用来做查询分析的数据库,基本不用来做插入,修改,删除操作。

  • Hive:数据仓库。
  • Hive:解释器,编译器,优化器等。
  • Hive运行时,元数据存储在关系型数据库里面。
    –编译器将一个Hive SQL转换操作符,操作符是Hive的最小的处理单元,每个操作符代表HDFS的一个操作或者一道MapReduce作业

Operator操作

Operator都是hive定义的一个处理过程
Operator都定义有:
protected List > childOperators;
protected List > parentOperators;
protected boolean done; // 初始化值为false
Hadoop----Hive_第1张图片

ANTLR词法语法分析工具解析hql

Hadoop----Hive_第2张图片

Hive架构原理

用户接口主要有三个:CLI,Client 和 WUI。
Hadoop----Hive_第3张图片
其中最常用的是CLI命令行,Cli启动的时候,会同时启动一个Hive副本;Client是Hive的客户端,用户连接至Hive Server。在启动 Client模式的时候,需要指出Hive Server所在节点,并且在该节点启动Hive Server。 WUI是通过浏览器访问Hive。

  • Hive将元数据存储在数据库中,如mysql、 derby 。 Hive中的元数据包括表的名字,表的列和分区及其属性,表的属性(是否为外部表等),表的数据所在目录等。
  • 解释器、编译器、优化器完成HQL查询语句从词法分析、语法分析、编译、优化以及查询计划的生成。生成的查询计划存储在HDFS中,并在随后有MapReduce调用执行。
  • Hive的数据存储在HDFS中,大部分的查询、计算由MapReduce完成(包含*的查询,比如select * from tbl不会生成MapRedcue任务)

Hive搭建

  1. 安装Hive
  • 安装环境以及前提说明:首先,Hive是依赖于hadoop系统的,因此在运行Hive之前需要保证已经搭建好hadoop集群环境。
  • 安装一个关系型数据mysql
  1. 配置环境变量
  • HADOOP_HOME=/**/*
  • HIVE_HOME=$/**/
  1. 替换和添加相关jar包
  • 修改HADOOP_HOME/share/hadoop/yarn/lib目录下的jline-*.jar 将其替换成HIVE_HOME/lib下的jline-2.12.jar。
  • 将hive连接mysql的jar包:mysql-connector-java-5.1.32-bin.jar拷贝到hive解压目录的lib目录下
  1. 修改配置文件(选择3种模式里哪一种)见三种安装模式
  2. 启动hive或者bin/hive

三种模式

  1. 内嵌模式(元数据保存在内嵌的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
    
    
    
    
  2. 本地模式(本地安装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;

  1. 远程模式–remote 一体(远程安装mysql 替代derby存储元数据)【重要】
    这种存储方式需要在远端服务器运行一个 mysql 服务器,并且需要在 Hive 服务器启动 meta服务。



	
		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. 远程模式— Remote 分开(公司企业经常用)
    将 hive-site.xml 配置文件拆为如下两部分

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

HQL详解

  1. DDL语句
    具体参见:https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL
    Hive的数据定义语言 (LanguageManual DDL)重点是 hive 的建表语句和分区。

创建/删除/修改/使用数据库

  1. 创建数据库
    查看 show databases;
    CREATE (DATABASE|SCHEMA) [IF NOT EXISTS] database_name
    [COMMENT database_comment];
  2. 删除数据库
    DROP (DATABASE|SCHEMA) [IF EXISTS] database_name;
  3. 修改数据库(了解)
    ALTER (DATABASE|SCHEMA) database_name SET DBPROPERTIES (property_name=property_value, …);
    ALTER (DATABASE|SCHEMA) database_name SET OWNER [USER|ROLE] user_or_role;
  4. 使用数据库
    USE database_name;
    use ww;

创建/删除/表(*)

  1. 创建表(重要!)
    数据类型:
    data_type
    : primitive_type 原始数据类型
    | array_type 数组
    | map_type map
    | struct_type
    | union_type – (Note: Available in Hive 0.7.0 and later)
primitive_type
TINYINT
| SMALLINT
| INT
| BIGINT
| BOOLEAN
| FLOAT
| DOUBLE
| DOUBLE PRECISION
| STRING 基本可以搞定一切
| BINARY
| TIMESTAMP
| DECIMAL
| DECIMAL(precision, scale)
| DATE
| VARCHAR
| CHAR
array_type
ARRAY < data_type >
map_type
MAP < primitive_type, data_type >
struct_type
STRUCT < col_name : data_type [COMMENT col_comment], …>
union_type
UNIONTYPE < data_type, data_type, … >

完整的建表语句:
Hadoop----Hive_第4张图片
建表实例:
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.中

  1. 删除表
    DROP TABLE [IF EXISTS] table_name [PURGE];

修改表,更新,删除数据(这些很少用)

  1. 重命名表
    ALTER TABLE table_name RENAME TO new_table_name;
    Eg: alter table abc rename to jack;

  2. 更新数据
    UPDATE tablename SET column = value [, column = value …] [WHERE expression]

  3. 删除数据
    DELETE FROM tablename [WHERE expression]

DML语句

具体参见: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中将数据重定向到文件中:

Hadoop----Hive_第5张图片

备份数据或还原数据

  1. 备份数据:
    例: EXPORT TABLE db_1128.emp TO ‘/user/hadoop/hive/datas/export/emp’ ;
  2. 删除再还原数据:
    先删除表。
    drop table db_1128.emp;
    show tables from db_1128;
    再还原数据:
    IMPORT FROM ‘/user/hadoop/hive/datas/export/emp’ ;

Hive的group by\join(left join right join等)\having\sort by \order by等操作和MySQL没有什么大的区别:

http://www.2cto.com/kf/201609/545560.html

Hive SerDe

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;

Beeline和Hiveserver2

  • Hiveserver2直接启动
  • 启动 beeline
    !connect jdbc:hive2://node5:10000 root 123

Hive的JDBC

一般是平台使用展示或接口,服务端启动hiveserver2后,在java代码中通过调用hive的jdbc访问默认端口10000进行连接、访问
Hadoop----Hive_第6张图片

Hive分区

注意:必须在表定义时创建partition !
分区分为:单分区和多分区
分区分为:静态分区和动态分区

静态分区

  1. 单分区建表语句:create table day_table(id int, content string) partitioned by (dt string) row format delimited fields terminated by ‘,’;
  2. 双分区建表语句:create table day_hour_table (id int, content string) partitioned by (dt string, hour string) row format delimited fields terminated by ‘,’;
  • 注意:在创建 删除多分区等操作时一定要注意分区的先后顺序,他们是父子节点的关系。分区字段不要和表字段相同
  1. 添加分区表的分区
    ALTER TABLE day_table ADD PARTITION (dt=‘2008-08-08’, hour=‘08’);
  2. 删除分区
    ALTER TABLE day_hour_table DROP PARTITION (dt=‘2008-08-08’, hour=‘08’);
  3. 数据加载进分区表中
    LOAD DATA INPATH ‘/user/pv.txt’ INTO TABLE day_hour_table PARTITION(dt=‘2008-08-08’, hour=‘08’);
  • 当数据被加载至表中时,不会对数据进行任何转换。Load操作只是将数据复制至Hive表对应的位置。数据加载时在表下自动创建一个目录基于分区的查询的语句:SELECT day_table.* FROM day_table WHERE day_table.dt >= ‘2008-08-08’;
  1. 查看分区语句:
    hive> show partitions day_hour_table;
  2. 重命名分区:
    ALTER TABLE day_table PARTITION (tian=‘2018-05-01’) RENAME TO PARTITION (tain=‘2018-06-01’);

动态分区–注意外部表

  1. 在本地文件/home/grid/a.txt中写入以下4行数据:
    aaa,US,CA
    aaa,US,CB
    bbb,CA,BB
    bbb,CA,BC
  2. 建立非分区表并加载数据
  • CREATE TABLE t1 (name STRING, cty STRING, st STRING) ROW FORMAT DELIMITED FIELDS TERMINATED BY ‘,’;
  • LOAD DATA LOCAL INPATH ‘/home/grid/a.txt’ INTO TABLE t1;
  • SELECT * FROM t1;
  1. 建立外部分区表并动态加载数据 (注意删除外部表的相关事项)
  • CREATE EXTERNAL TABLE t2 (name STRING) PARTITIONED BY (country STRING, state STRING);
    这时候就需要使用动态分区来实现,使用动态分区需要注意设定以下参数:
    ~ hive.exec.dynamic.partition
    默认值:false
    是否开启动态分区功能,默认false关闭。
    使用动态分区时候,该参数必须设置成true;
    ~ hive.exec.dynamic.partition.mode
    默认值:strict
    动态分区的模式,默认strict,表示必须指定至少一个分区为静态分区,nonstrict模式表示允许所有的分区字段都可以使用动态分区。
    一般需要设置为nonstrict
    ~ hive.exec.max.dynamic.partitions.pernode
    默认值:100
    在每个执行MR的节点上,最大可以创建多少个动态分区。
    该参数需要根据实际的数据来设定。
    比如:源数据中包含了一年的数据,即day字段有365个值,那么该参数就需要设置成大于365,如果使用默认值100,则会报错。
    ~ hive.exec.max.dynamic.partitions
    默认值:1000
    在所有执行MR的节点上,最大一共可以创建多少个动态分区。
    同上参数解释。
    ~ hive.exec.max.created.files
    默认值:100000
    整个MR Job中,最大可以创建多少个HDFS文件。
    一般默认值足够了,除非你的数据量非常大,需要创建的文件数大于100000,可根据实际情况加以调整。
    ~ hive.error.on.empty.partition
    默认值:false
    当有空分区生成时,是否抛出异常。
    一般不需要设置。
  • set hive.exec.dynamic.partition=true;
  • set hive.exec.dynamic.partition.mode=nonstrict;
  • set hive.exec.max.dynamic.partitions.pernode=1000;
  • INSERT INTO TABLE t2 PARTITION (country, state) SELECT name, cty, st FROM t1;
  • INSERT INTO TABLE t2 PARTITION (country, state) SELECT name, cty, st FROM t1;
  • SELECT * FROM t2;

函数自定义

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

  • Hive的函数课参考官网,用时查阅即可: https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF
  • 自定义函数包括三种 UDF、UDAF、UDTF
    UDF:一进一出
    UDAF:聚集函数,多进一出。如:Count/max/min
    UDTF:一进多出,如 lateralview explore()
  • 使用方式 :在HIVE会话中add自定义函数的jar 文件,然后创建 function 继而使用函数

UDF开发(常用)

http://blog.csdn.net/duan19056/article/details/17917253

  1. UDF 函数可以直接应用于 select 语句,对查询结构做格式化处理后,再输出内容。
  2. 编写 UDF 函数的时候需要注意一下几点:
  • 自定义 UDF 需要继承 org.apache.hadoop.hive.ql.UDF。
  • 需要实现 evaluate 函数,evaluate 函数支持重载。
  1. 步骤
  • 把程序打包放到目标机器上去;
  • 进入 hive 客户端,添加 jar 包:hive>add jar /jar/udf_test.jar;(清除缓存时记得删除jar包delete jar /*)
  • 创建临时函数:hive>CREATE TEMPORARY FUNCTION add_example AS ‘hive.udf.Add’;
  • 查询 HQL 语句:
    SELECT add_example(8, 9) FROM scores;
    SELECT add_example(scores.math, scores.art) FROM scores;
    SELECT add_example(6, 7, 8, 6.8) FROM scores;
  • 销毁临时函数:hive> DROP TEMPORARY FUNCTION add_example;

UDAF自定义集函数(不常用)

多行进一行出,如 sum()、min(),用在 group by 时

  1. 必须继承org.apache.hadoop.hive.ql.exec.UDAF(函数类继承)
    org.apache.hadoop.hive.ql.exec.UDAFEvaluator(内部类 Eval uator 实现 UDAFEvaluator 接口)
  2. Evaluator 需要实现 init、iterate、terminatePartial、merge、t erminate 这几个函数
  • init():类似于构造函数,用于 UDAF 的初始化
  • iterate():接收传入的参数,并进行内部的轮转,返回 boolean
  • terminatePartial():无参数,其为 iterate 函数轮转结束后,返回轮转数据,类似于 hadoop 的 Combinermerge():接收 terminatePartial 的返回结果,进行数据 merge 操作,其返回类型为 boolean
  • terminate():返回最终的聚集函数结果
    开发一个功能同:
    Oracle 的 wm_concat()函数
    Mysql 的 group_concat()
    Hive UDF 的数据类型:

UDTF(不常用)

UDTF:一进多出,如 lateral view explore()

Hive索引

索引是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"];

一个表上创建索引创建一个索引使用给定的列表的列作为键。看到创建索引索引设计文档。

实际案例

基站掉话率

  1. 建表
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;
  1. load数据

LOAD DATA LOCAL INPATH ‘/opt/data/cdr_summ_imei_cell_info.csv’
OVERWRITE INTO TABLE cell_monitor;

  1. 找出掉线率最高的基站
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;

单词统计

  1. 建表
create table docs(line string);
create table wc(word string, totalword int);
  1. 加载数据

load data local inpath ‘/tmp/wc’ into table docs;

  1. 统计
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;
  1. 查询结果

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

hive Lateral View
Lateral View用于和UDTF函数(explode、split)结合来使用。
首先通过UDTF函数拆分成多行,再将多行结果组合成一个支持别名的虚拟表。
主要解决在select使用UDTF做查询过程中,查询只能包含单个UDTF,不能包含其他字段、以及多个UDTF的问题
语法:
LATERAL VIEW udtf(expression) tableAlias AS columnAlias (’,’ columnAlias)

例:
统计人员表中共有多少种爱好、多少个城市?
Hadoop----Hive_第7张图片
select count(distinct(myCol1)), count(distinct(myCol2)) from psn2
LATERAL VIEW explode(likes) myTable1 AS myCol1
LATERAL VIEW explode(address) myTable2 AS myCol2, myCol3;

运行方式

  1. Hive 运行方式:
  • 命令行方式cli:控制台模式
  • 脚本运行方式(实际声场环境中使用最多)
  • JDBC:hiveserver2
  • web GUI借口(hwi、hue 等)
  1. Hive在CLI模式中
  • 与hdfs交互:

    执行dfs命令:例子:dfs -ls

  • 与Linux交互

    !开头:例子:!pwd

  1. Hive脚本运行方式:
  • hive -e “”
  • hive -e “”>aaa
  • hive -S -e “”>aaa
  • hive -f file
  • hive -i /home/my/hive-init.sql
  • hive> source file (在hive cli中运行)

hive的GUI接口

Hive Web GUI接口
web界面安装:

  1. 下载源码包apache-hive-*-src.tar.gz
  2. 将hwi war包放在$HIVE_HOME/lib/
    制作方法:将hwi/web/*里面所有的文件打成war包
    cd apache-hive-1.2.1-src/hwi/web
    jar -cvf hive-hwi.war *
  3. 复制tools.jar(在jdk的lib目录下)到$HIVE_HOME/lib下
  4. 修改hive-site.xml

    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

  1. 三种授权模型:
  • 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

限制:

  • 启用当前认证方式之后,dfs, add, delete, compile, and reset等命令被禁用。
  • 通过set命令设置hive configuration的方式被限制某些用户使用。
    (可通过修改配置文件hive-site.xml中hive.security.authorization.sqlstd.confwhitelist进行配置)
  • 添加、删除函数以及宏(批量规模)的操作,仅为具有admin的用户开放。
  • 用户自定义函数(开放支持永久的自定义函数),可通过具有admin角色的用户创建,其他用户都可以使用。
  • Transform功能被禁用

在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的优化

  1. 核心思想:把Hive SQL 当做Mapreduce程序去优化
    以下SQL不会转为Mapreduce来执行
    –select仅查询本表字段
    –where仅对本表字段做条件过滤

  2. Explain 显示执行计划
    EXPLAIN [EXTENDED] query

  3. Hive运行方式:
    本地模式 100MB
    集群模式

开启本地模式:
set hive.exec.mode.local.auto=true;
注意:
hive.exec.mode.local.auto.inputbytes.max默认值为128M【134217728】
表示加载文件的最大值,若大于该配置仍会以集群方式来运行!

  1. 严格模式
    通过设置以下参数开启严格模式[防止误操作]:
    set hive.mapred.mode=strict;
    (默认为:nonstrict非严格模式)

查询限制:
1、对分区表查询时,必须添加where对于分区字段的条件过滤;
2、order by语句必须包含limit输出限制;
3、限制执行笛卡尔积的查询

  1. 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 的方式)

  2. 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时,其表的最大值)

  1. Map-Side聚合 如count()等聚合函数
    通过设置以下参数开启在Map端的聚合:
    set hive.map.aggr=true;

相关配置参数:
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
  1. 控制Hive中Map以及Reduce的数量
    Map数量相关的参数
    mapred.max.split.size
    一个split的最大值,即每个map处理文件的最大值
    mapred.min.split.size.per.node
    一个节点上split的最小值
    mapred.min.split.size.per.rack
    一个机架上split的最小值

Reduce数量相关的参数
mapred.reduce.tasks
强制指定reduce任务的数量
hive.exec.reducers.bytes.per.reducer
每个reduce任务处理的数据量
hive.exec.reducers.max
每个任务最大的reduce数 [Map数量 >= Reduce数量 ]

  1. Hive - JVM重用
    适用场景:
  • 小文件个数过多
  • task个数过多

通过 set mapred.job.reuse.jvm.num.tasks=n; 来设置
(n为task插槽个数)

缺点:设置开启之后,task插槽会一直占用资源,不论是否有task运行,
直到所有的task即整个job全部执行完成时,才会释放所有的task插槽资源!

Hive和Hbase整合

hive和hbase同步
https://cwiki.apache.org/confluence/display/Hive/HBaseIntegration

  1. 把hive-hbase-handler-1.2.1.jar cp到hbase/lib 下
    同时把hbase中的所有的jar,cp到hive/lib

  2. 在hive的配置文件增加属性:

    hbase.zookeeper.quorum
    node01,node02,node03

  3. 在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只有映射,但是可以查看数据

你可能感兴趣的:(Hadoop----Hive)