赞
踩
Hive是基于Hadoop的一个数据仓库工具。可以键结构化的数据文件映射为一张表,并提供完整的sql查询功能,可以将sql语句转换为MapReduce任务进行。其优点是学习成本低,可以通过类SQL语句快速实现MapReduce统计,不必开发专门的MapReduce应用,十分适合数据仓库的统计分析。
Hive是建立在Hadoop上的数据仓库基础构架。它提供了一系列的工具,可以用来进行数据提取、转化、加载(ETL),也叫数据清洗,这是一种可以存储、查询和分析存储在hadoop中的大规模数据的机制。hive定义了简单的类SQL查询语言,即HiveQL,它允许熟悉SQL的用户查询数据。
HQL-Hive通过类SQL的语法,来进行分布式的计算。HQL用起来和SQL非常的相似,Hive在执行的过程总会将HQL
转换为MapReduce去执行,所以Hive其实是基于Hadoop的一种分布式计算框架,底层仍然是MapReduce,所以它的本质上还是一种离线大数据分析工具。
1.数据仓库是多个异构数据源所集成的。
2.数据仓库存储的一般是历史数据,大多数的应用场景是读取数据(分析数据),所以数据仓库是弱事务的。
3.数据库是为捕获数据而设计的,数据仓库是为分析数据而设计的。
4.数据仓库是时变的,数据存储从历史的角度提供信息。即数据仓库中的关键结构都是隐身=式或包含时间元素。
5.数据仓库是弱事务的,因为数据仓库存储的是历史数据,一般都是(分析)数据场景。
数据库属于OLTP(Online Transaction Processing)练级事务处理系统。涵盖了企业大部分的日常操作,入购物、存存、制造等,比如:Mysql、Oracle等关系型数据库
数据仓库属于OLAP系统(Online Analytical Processing)联机分析处理系统。比如:Hive、Hbase等
OLTP是面向用户的、用于程序员的事务处理以及客户的查询处理。
OLAP是面向市场的,用于知识工人(经理、主管和数据分析人员)的数据分析。
OLAP通常会集成多个异构数据源的数据,数据量巨大。
OLTP系统的访问由于要保证原子性,所以有事务机制和恢复机制。
OLAP系统一般存储历史数据,所以大部分都是只读操作,不需要事务。
Hive构建在基于静态(离线)批处理的Hadoop之上,Hadoop通常都有较高的延迟并且在作业提交和调度的时候需要大量的开销。因此,Hive并不能够在大规模数据集上实现低延迟快速的查询。Hive查询操作过程严格遵守Hadoop MapReduce的作业执行模型,Hive将用户的HiveQL语句通过解释器转换为MapReduce作业提交到hadoop集群上,hadoop监控作业执行过程,然后返回作业执行结果给用户。Hive并非为联机事务处理而设计,Hive并不提供实时的查询和基于行级的数据更新操作。Hive的最佳使用场合是大数据集的离线批处理作业,例如,网络日志分析。
1.show databases:查看都有那些数据库
2.create database park:创建park数据库
3.use park:进入park数据库
4.show tables:查看当前数据库下所有表
5.crate table stu(id int,name string):创建stu表,以及相关的两个字段
6.insert into stu values(1,‘zhang’):向stu表中插入数据–HDFS不支持数据的修改和删除,但是2.0版本之后支持数据的追加,实际上,insert into 语句执行的是追加操作–hive支持查询,行级别的插入。不支持行级别的删除和修改。
7.select * from stu:查询表数据
8.drop table stu:删除表
9.load data local inpath ‘/home/software/1.txt’ into table stu:通过加载我那件数据到指定的表中
10.crate table stu1(id int,name string) row format delimited fields terminated by ’ ':创建stu1表,并指定分隔符 空格
11.desc stu:查看stu表结构
12.create table stu2 like stu:创建一张stu2表,表结构和stu表结构相同–like只复制表结构,不复制数据
13.insert overwrite table stu2 select * from stu:把stu表数据插入到stu2表中–inset overwrite可以将select查询出的数据插入或指定的目录下
14.alter table stu rename to stu2:为stu重命名为stu2
15.alter table stu add columns (age int):为表stu增加一个列字段age 类型为int
16.exit :退出hive
先在hive里建一张表,然后向这个表插入数据(用insert可以插入数据,也可以通过加载外部文件的方式来插入数据),这样的表称为内部表。简单来说,就是先有hive表,再有数据。其特点是:当内部表被删除时,对应的HDFS的数据也会被删除掉
HDFS里已经有数据了。然后通过hive创建一张表来管理这个文件数据,这样的表称为外部表。即先有数据再创建hive表。特点是:删除外部表,但是对应的数据依然还在。在实际生产环境下,大多数创建的都是外部表。注意:hive外部表管理的是HDFS里的某一个目录下的文件数据。
创建外部表的命令:进入hive,执行:
create external table stu (id int,name string) row format delimited fields terminated by ’ 'location ‘/目录路径’
通过hive执行:drop table stu。这是删除表操作。如果stu是一个内部表,则HDFS对应的目录节点会被删除。如果stu是一个外部表,HDFS对目录节点不会删除。
Hive的表有两种,①内部表 ②外部表 。此外,内部表和外部表都可以是分区表。
分区表的作用:可以避免查询整表,在生产环境下,基本都是建立带有分区字段的表,在查询时带上分区条件。
分区表在HDFS上,一个分区对应一个目录。
分区表的实际应用:一般以天为单位来建立分区,这样方便管理表数据,尤其是按日期查询很方便。比如:
普通表和分区表区别:大量数据增加的,需要建立分区表
执行:create table book(id int,name string)partitioned by (category string) row format delimited fields terminated by “\t”;
注:在创建分区表时,partition字段可以不再字段列表中。生成的表中自动就会具有该字段。category是自定义的字段。
1)load data local inpath '/home/cn.txt ’ overwrite into table book partition(category=‘cn’)
2)load data local inpath './book_en.txt ’ overwrite into table book partition(category=‘en’)
select * from book;查询book目录下的所有数据
select * from book where category=‘cn’;值查询cn分区的数据
通过查看mysql的SDS表来查询元数据信息
通过创建目录来增加分区
如果想先在HDFS的目录下,自己创建分区目录,然后在此目录下上传文件,比如:
此时手动创建目录时无法被hive使用的,因为元数据库中没有该分区的记录。需要执行:
ALTER TABLE book add PARTITION(category=‘fr’) location ‘/user/hive/warehouse/park01.db/book/category=fr’;
这行命令的作用是在元数据Dock表里创建对应的元数据信息
1.显示分区
show partitions iteblog;
2.添加分区
alter table book add partition(category=‘jp’)location ‘/user/hive/warehouse/test.db/book/category=jp’;或者:msck repair table book;
3.删除分区
alter table book drop partition(category=‘cn’)
4.修改分区
alter table book partition(category=‘french’)rename to partition(category=‘hh’);
常用的基本数据类型:
复杂数据类型:
如果hive的内置函数不够用,可以自己定义函数来使用,这样的函数称为hive的用户自定义函数,简称UDF。
实现步骤:
1.新建java工程,导入hive相关的包,导入hive相关的lib
2.创建拉诶继承UDF
3.编写一个evaluate方法,返回值和 参数任意。
代码示例:
4.为了能让MapReduce处理,String要用Text处理。
5.简写好的类打成jar包,上传到Linux中
6.在hive命令下,向hive注册UDF:add jar /xxxx/xxxx.jar
7.在hive命令行下,为当前UDF起一个名字:create temporary function fname as ‘类的全路径名’;
8.之后就可以在Hql中使用自定义的函数了
什么是数据倾斜以及数据倾斜是怎么产生的?
简单来说,数据倾斜就是数据的key的分化严重不均,造成一部分数据很多,一部分数据很少的局面。
数据倾斜产生的原因一般是在选取key值时因为数据重复或者数据有规律造成的。
为什么说数据倾斜于业务逻辑和数据量有关?
从另外角度看数据倾斜,其本质还是单台接单在执行那一部分数据Reduce任务的时候,由于数据量大,跑不动,造成任务卡住。若是这台机器内存足够大,CPU、网络等资源充足,跑80G左右的数据量和跑10M数据量所消耗时间不是很大差距,那么也就不存在问题,倾斜也无所谓。所以机器配置和数据量在一个合理的比例,一旦数据量远超机器的极限,那么不管每一key的数据如何分布,总会有一个key的数据量超出机器的能力,造成Reduce缓慢甚至卡顿。
业务逻辑造成的护具倾斜会很多,日常操作中,容易造成数据倾斜的原因可以归纳为几点:
1)group by
2)distinct count(distinct xx)
3)join
如何处理group by的数据倾斜?
1.调优参数
set hive.groupby.skewindata = true;
hive.groupby.skewindata=true:数据倾斜是负载均衡,当选项设定为true,生成的查询计划会有两个MRJob。第一个MRJob中,Map的输出结果集合会随机分布到Reduce中,每个Reduce做部分聚合操作,并输出结果,这样处理的结果是相同的GroupBy有可能被分发到不同的Reduce中,从而达到负载均衡的目的;第二个MRJob再根据预处理的数据结果按照GroupBy Key分发到Reduce中(这个过程可以保证相同的GroupBy Key被分布到同一个Reduce中),最后完成最后的聚合操作。
由上面可以看出起到至关重要的作用的其实是第二个参数的设置,它使计算变成了连个MapReduce,先在第一个的shuffle过程partition是随机给key答标记,使每一个key随机均匀分布到各个Reduce上计算,但是这样只能完成部分计算,因为相同key没有分配到相同reduce上,所以需要二次的MapReduce,这次就回归正常shuffle,但是数据分布不均匀的问题在第一次MapReduce已经有了很大的改善,因此基本解决数据倾斜。
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语句优化
注意:Hive在做join时,小表写在前(左边)。
3)group by优化
hive.groupby.skewindata = true
如果group by过程出现倾斜,应该设置为true
4)count distinct 优化
注意:count这种全局计数的操作,Hive只会用一个Reduce来实现
5)调整切片数(map任务数)
Hive地层自动对小文件做优化,用了CombinTextInputFormat,将副讴歌小文件切片合成一个切片。合成完成之后的切片大小,如果大于mapred.max.split.size 的大小,就会生成一个新出的切片。
mapred.max.split.size 默认是128M
set mapred.max.split.size=134217728(128M)
对于切片数(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)启用严格模式
8)关闭推测执行机制
因为在测试环境下我们都把应用程序跑通了,如果还加上推测执行,入伏哦有一个数据分片本来就会发生数据倾斜,执行时间就是比其他时间长,那么hive就会把这个执行时间长的job当做运行失败来处理,继而又产生一个相同的job区执行,后果可想而知。可通过如下设置关闭推测执行:
1.创建带桶的table:
create table teacher(name string) clustered by (name) into 3 buckets row format delimited fields terminated by ’ ';
2.开启分桶机制:
set hive.enforce.bucketing=true;
3.往表中插入数据:
insert overwrite table teacher select * from tmp;//需要提前准备好temp,从temp查询数据写到teacher
注:teacher是一个分桶表,对于分桶表,不允许以外部文件方式导入数据,只能从另一张表数据导入。分桶表只能是内部表。
做用及原理:
分桶的原理是根据指定的列的计算hash值模余分桶数量后将数据分开存放。方便数据抽样
1.针对海量数据的高性能查询和分系统
2.类SQL的查询语言
3.HiveQL灵活的可扩展性(Extendibility)
4.高扩展性和容错性
5.与hadoop其他产品完全兼容
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。