Hive概述
Hive是基于Hadoop的一个数据仓库工具。可以将结构化的数据文件映射为一张表,并提供完整的sql查询功能,可以将sql语句转换为MapReduce任务进行运行。其优点是学习成本低,可以通过类SQL语句快速实现MapReduce统计,不必开发专门的MapReduce应用,十分适合数据仓库的统计分析。
1.复习数据仓库的概念
OLTP概念->在线联机事务系统
OLAP概念->在线联机分析系统
2.ETL
数据提取、转化、加载(ETL Extract-Transform-Load )
数据仓库的特征
1.数据仓库是多个异构数据源所集成的。
2.数据仓库存储的一般是历史数据。大多数的应用场景是读数据(分析数据),所以数据仓库是弱事务的。
3.数据库是为捕获数据而设计,数据仓库是为分析数据而设计。
4.数据仓库是时变的,数据存储从历史的角度提供信息。即数据仓库中的关键结构都隐式或显示地包含时间元素。
5.数据仓库是弱事务的,因为数据仓库存的是历史数据,一般都读(分析)数据场景。
3.Hive的表类型
①内部表
②外部表
内部表和外部表都可以是分区表
1.创建分区表create table book (id int,name string)partitioned by (category string)
row format delimited fields terminated by ' \t’;
2.为一个表添加分区信息
alter table book add partition (category='jp') location'/user/hive/warehouse/test.db/book/category=jp’;
3.删除分区
alter table book drop partition(category='cn')
4.修改分区
alter table book partition(category=' french') rename topartition (category=' hh') ;
分桶表
create table teacher(name string) clustered by (name) into 3buckets row format delimited fields terminated by ' ';
hive常用字符串操作函数
①select length
②select substr
③select reverse
④select concat
⑤select regexp_replace正则替换
⑥regexp_extract正则提取
⑦split
⑧explode(切分,切完之后每个元素占一行)
UDF
Hive的各种join操作
left semi join
补充: hive在做join时,将小表写在左边,底层会自动优化,实现map side join(避免产生数据倾斜)
小表默认的阙值大小是25MB
复习Hive如何解决数据倾斜问题
①group by分组操作可能会产生数据倾斜比如 wordcount 单词频次统计案例。
解决思想:将一个MRJob拆解成两个MRJob。
第一个Job做随机分区,第二个Job做最终的分组统计set hive.groupby.skewindata=true;
②join连接操作可能会产生数据倾斜解决思想:
小表-大表做join->利用map side join ,把小表写在左边大表-大表做join->利用分桶表
③count全局计数可能会产生数据倾斜
解决思想: set hive.groupby.skewindata=true;
Hive 调优
1 ) map side join
mapJoin的主要意思就是,当链接的两个表是一个比较小的表和一个特别大的表的时候,我们把比较小的table直接放到内存中去,然后再对比较大的表格进行map操作。join就发生在map操作的时候,每当扫描一个大的table中的数据,就要去去查看小表的数据,哪条与之相符,继而进行连接。这里的join并不会涉及reduce操作。map端join的优势就是在于没有shuffle,在实际的应用中,我们这样设置:
set hive.auto.convert.join=true;
此外,hive有一个参数: hive.mapjoin.smalltable.filesize,默认值是25mb (其中一个表大小小于25mb时,自动启用mapjoin )
要求:在hive做join时,要求小表在前(左)
2)join语句优化
优化前
select m.cid,u.id form order m join customer u on m.cid=u.id wherem.dt= 2o160801’ ;
优化后
select m.cid,u.id from (select cid from order where dt='20160801’)mjoin customer u on m.cid = u.id
3 ) group by优化
hive.groupby.skewindata=true
如果group by过程出现倾斜,应该设置为true4 ) count distinct优化
优化前
select count(distinct id )from tablename优化后
select count(*) from (select distinct id from tablename)tmp;此外,再设定一下reduce的任务数量。
注意:count这种全局计数的操作,Hive只会用一个Reduce来实现
5)调整切片数( map任务数)
Hive底层自动对小文件做了优化,用了CombineTextInputFormat,将做个小文件切片合成一个切片。
合成完之后的切片大小,如果>mapred.max.split.size的大小,就会生成一个新的切片。
mapred.max.split.size默认是128MBset mapred.max.split.size=I
对于切片数(MapTask )数量的调整,要根据实际业务来定,比如一个100MB的文件假设有1千万条数据,此时可以调成10个MapTask,则每个MapTask处理1百万条数据。
6 )JVM重利用
set mapred.job.reuse.jvm.num.tasks=20(默认是1个)
JVM重用是hadoop调优参数的内容,对hive的性能具有非常大的影响,特别是对于很难避免小文件的场景或者task特别多的场景,这类场景大多数执行时间都很短。这时JVM的启动过程可能会造成相当大的开销,尤其是执行的job包含有成千上万个task任务的情况。
JVM重用可以使得一个JVM进程在同一个JOB中重新使用N次后才会销毁。
7)启用严格模式
在hive里面可以通过严格模式防止用户执行那些可能产生意想不到的不好的效果的查询,从而保护hive的集群。
用户可以通过set hive.mapred.mode=strict来设置严格模式,改成unstrict则为非严格模式。
在严格模式下,用户在运行如下query的时候会报错:
①分区表的查询没有使用分区字段来限制
②使用了order by但没有使用limit语句。(如果不使用limit,会对查询结果进行全局排序,消耗时间长)
③产生了笛卡尔积
当用户写代码将表的别名写错的时候会引起笛卡尔积
Sqoop
导入和导出指令
Hive JDBC
Hive 的工作流程
1.通过客户端提交一条Hql语句
2.通过complier(编译组件)对Hql进行词法分析、语法分析。在这一步,编译器要知道此hql语句到底要操作哪张表
3.去元数据库找表信息
4.得到信息
5.complier编译器提交Hql语句分析方案。
6.1 executor执行器收到方案后,执行方案( DDL过程)。在这里注意,执行器在执行方案时,会判断如果当前方案不涉及到MR组件,比如为表添加分区信息、比如字符串操作等,比如简单的查询操作等,此时就会直接和元数据库交互,然后去HDFS上去找具体数据。
如果方案需要转换成MR job,则会将job提交给Hadoop的JobTracker。
6.2 MR job完成,并且将运行结果写入到HDFS上。
6.3执行器和HDFS交互,获取结果文件信息。
7.如果客户端提交Hql语句是带有查询结果性的,则会发生:7-8-9步,完成结果的查询。