Hive
Hive简介:
Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供类SQL查询功能
本质:是将sql转换为mapreduce程序
主要用途:用来做离线数据分析,比直接用MapReduce开发效率更高
元数据存储在:mysql/derby这种关系型数据库
Hive和hadoop和MapReduce的关系:Hive利用HDFS存储数据,利用MapReduce查询分析数据。
Hive的metadata、metastore:
metadata:元数据
metastore(元数据服务):客户端连接metastore服务,metastore再去连接Mysql数据库来存取元数据。有了metastore服务,就可以有多个客户端同时连接,而这些客户端不需要知道Mysql数据库的用户名和密码,只需要连接metastore服务即可。
metastore三种配置方式:
-
内嵌模式:
使用的是内嵌的Derby数据库来存储元数据,也不需要额外起Metastorefuw
-
本地模式:
采用外部数据库来存储元数据(mysql)
-
远程模式:
远程模式下,需要单独起metastore服务,然后每个客户端都在配置文件里配置连接到该metastore服务,远程模式的metasore服务和hive运行在不同的进程里
HIve的内部表和外部表:
内部表(Internal table):称为被Hive拥有和管理的托管表,Hive拥有该表的结构和文件,当删除内部表时,它会删除数据以及表的元数据
create table student(
num int,
name string,
sex string,
age int,
dept string)
row format delimited
fields terminated by ',';
外部表(External table):表中的数据不是Hive拥有或者管理的,只管理表元数据的生命周期,要创建一个外部表,需要使用External语法关键字,删除外部表只会删除元数据,而不会删除实际数据,在Hive外部仍然能访问实际数据,而且外部表更为方便的是可以搭配location语法指定数据的路径
create external table student_ext(
num int,
name string,
sex string,
age int,
dept string)
row format delimited
fields terminated by ','
location '/stu';
Hive分区表和分通表:
分区表:
创建表语法:
create table table_name (column1 data_type,column2 data_type)partitioned by (partition1 data_type,partiton2 data_type...);
静态分区:分区的字段值是由用户在加载数据的时候手动指定的
静态插入:
load data local inpath '/root/hivedata/archer.txt' into table t_all_hero_part partition(role='sheshou');
load data local inpath '/root/hivedata/assassin.txt' into table t_all_hero_part partition(role='cike');
load data local inpath '/root/hivedata/mage.txt' into table t_all_hero_part partition(role='fashi');
load data local inpath '/root/hivedata/support.txt' into table t_all_hero_part partition(role='fuzhu');
load data local inpath '/root/hivedata/tank.txt' into table t_all_hero_part partition(role='tanke');
load data local inpath '/root/hivedata/warrior.txt' into table t_all_hero_part partition(role='zhanshi');
动态分区:分区的字段值是基于查询结果自动推断出来的
动态插入:
insert into table t_all_hero_part_dynamic partition(role) select tmp.*,tmp.role_main from t_all_hero tmp;
多重分区表:
建表语句的时候Hive支持多个分区字段。
多重分区下,分区之间是一种递进关系,可以理解为在前一个分区的基础上继续分区,从HDFS的角度来看就是文件夹下继续划分子文件夹
分桶表:
--分桶表建表语句:
create [external] table [db_name.]table_name [(col_name data_type,...)] clustered by (col_name) into n buckets;
--into n buckets 代表分几桶
分桶的字段必须是表中已经存在的字段
分桶表的好处:
- 基于分桶表查字段时,减少全表扫描
- join时可以提高MR程序效率,减少笛卡尔乘积数量
- 分桶表数据进行抽样
Hive数据压缩:
压缩分析:
首先说明MapReduce哪些过程可以设置压缩:需要分析处理的数据在进入map前可以压缩,然后解压处理,map处理完成后的输出可以压缩,这样可以减少网络i/o(reduce通常和map不在同一个节点上),reduce拷贝压缩的数据后进行解压,处理完成后可以压缩存储在hdfs上,以减少磁盘占用量
优点:
减少存储磁盘空间,降低单节点的磁盘Io
由于压缩后的数据占用的带宽更少,因此可以加快数据在Hadoop集群流动的速度,减少网络传输宽带
缺点:
需要花费额外的时间/cpu做压缩和解压计算
HIve数据存储格式:
列式存储和行式存储:
逻辑表中的数据,最终需要落到磁盘上,以文件的形式存储,有两种常见的存储形式,行存储和列存储
行式存储:
优点:
相关的数据是保存在一起,比较符合面向对象的思维,因为一行数据就是一条记录
这种存储格式比较方便进行insert/update操作
缺点:
如果查询只涉及某几个列,它会把整行数据都读取出来,不能跳过不必要的列读取,当然数据比较少,一般没啥问题,如果数据量比较大就比较影响性能
由于每一行中,列的数据类型不一致,导致不容易获取一个极高的压缩比,也就是空间利用率不高
列式存储:
优点:
查询时,只有涉及到的列才会被查询,不会把所有列都查询出来,即可以跳过不必要的列查询;
高效的压缩率,不仅节省存储空间也节省计算内存和CPU
任何列都可以作为索引
缺点:
insert/update很麻烦,不方便
不适合扫描小量数据
Hive支持的存储数的格式主要有:TEXTFILE(行式存储) 、SEQUENCEFILE(行式存储)、ORC(列式存储)、PARQUET(列式存储)
Hive调优:
-
Fetch抓取机制:
Hive中对某些情况的查询可以不必使用Mapreduce计算,例如:select * from employees;在这种情况下,HIve可以简单地读取employees对应的存储目录下的文件,然后输出查询结果到控制台
在hive-default.xml.template文件中hive.fetch.task.conversion默认是more,老版本hive默认是minimal,该属性修改为more以后,在全局查找、字段查找、limit查找等都不走mapreduce
-
mapreduce本地模式:
mapreduce程序除了可以提交到yarn执行之外,还可以使用本地模拟环境运行,此时就不是通过分布式执行的程序,但是针对小文件小数据处理特别有效
用户可以通过设置hive.exec.mode.local.auto的值为true,来让Hive在适当的时候自动启动这个优化
-
join查询优化
-
map join(大小表关联):
MapJoin顾名思义,就是在Map阶段进行表之间的连接。而不需要进入到Reduce阶段才进行连
接。这样就节省了在Shuffle阶段时要进行的大量数据传输。从而起到了优化作业的作用 -
Bucket-MapJoin(中小表关联):
两个表join的时候,小表不足以放到内存中,但是又想用map side join这个时候就要用到bucket
Map join。其方法是两个join表在join key上都做hash bucket,并且把你打算复制的那个(相对)
小表的bucket数设置为大表的倍数。这样数据就会按照key join,做hash bucket。小表依然复制到
所有节点,Map join的时候,小表的每一组bucket加载成hashtable,与对应的一个大表bucket做
局部join,这样每次只需要加载部分hashtable就可以了。 -
SMB Join(大大表关联):
大表对小表应该使用MapJoin来进行优化,但是如果是大表对大表,如果进行shuffle,那就非
常可怕,第一个慢不用说,第二个容易出异常,此时就可以使用SMB Join来提高性能。SMB Join
基于bucket-mapjoin的有序bucket,可实现在map端完成join操作,可以有效地减少或避免shuffle
的数据量。SMB join的条件和Map join类似但又不同。 -
group by优化–map端聚合:
默认情况下,当进行group by的时候,Map阶段同一Key数据分发给一个reduce,当一个key数据过大是就倾斜了,但并不是所有的聚合操作都需要在Reduce端完成,很多聚合操作都可以先在Map端进行部分聚合,最后在Reduce端得出最终结果
-
MapReduce引擎并行度调整:
maptask个数调整
reducetask个数调整
-
执行计划-explain
-
并行执行机制
-
严格模式
-
推测执行机制
-