大数据学习笔记(十三)-Hive高级

本文介绍了Hive数据库的元数据管理、执行计划分析、不同类型的JOIN操作及其优化方法,并探讨了数据倾斜问题及解决策略。此外,还涉及了Hive性能调优的各种技巧,包括并行执行配置、合理设置Reduce数量等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.Hive的元数据表
TBLS:TBL_ID、DB_ID、SD_ID、TBL_NAME、TBL_TYPE
TABLE_PARAMS:存储表/视图的属性信息
TBL_PRIVS:存储表/视图的权限信息,一般不用HIVE的权限,而是用sentry来进行权限控制
SDS:保存文件存储的基本信息,比如INPUT_FORMAT、OUTPUT_FORMAT、是否压缩
COLUMNS_V2:存储表对应的字段信息
PARTITIONS:存储分区表的基本信息
PARTITION_KEYS:存储分区表的字段信息
PARTITION_KEY_VALS:存放分区字段值
FUNCS:用户注册的函数信息

2.Hive的执行计划
EXPLAIN [EXTENDED|DEPENDENCY|AUTHORIZATION] query
分析Hive的执行计划有助于了解Hive具体是如何执行的,帮助对Hive进行性能调优。

3.Hive当中的join
例子

create table a(id int, name string) row format delimited fields terminated by '\t';
hive> create table b(id int, age int) row format delimited fields terminated by '\t';
hive> load data local inpath '/home/hadoop/data/a.txt' overwrite into table a;
hive> load data local inpath '/home/hadoop/data/b.txt' overwrite into table b;
hive> select * from a;
OK
1   zhangsan
2   lisi
3   wangwu
hive> select * from b;
OK
1   30
2   29
4   21

①inner join

hive> select a.id, a.name, b.age from a join b on a.id=b.id;

②left join

hive> select a.id, a.name, b.age from a left join b on a.id=b.id;

③right join

hive> select a.id, a.name, b.age from a right join b on a.id=b.id;

③full join

hive> select a.id, a.name, b.age from a full join b on a.id=b.id;

4.join的优化
普通的join可称为common join/shuffle join/reduce join,这种操作会引起数据的网络传输,速度比较慢。
优化方法适用map join即spark当中利用broadcast的join优化,原理是将小表传到每台worker上,那么相当于将join操作本地化了。

5.Hive元数据升级方案
场景集群机器名修改hodoop000=>new_name
解决方案:
①直接修改元数据中DBS表中的相关字段
②适用bin\metatool
-listFSRoot查看文件系统根目录
-updateLocation更新location

-updateLocation hdfs://new_name:xxx hdfs://old_name:xxx

6.MapReduce和Hive如何支持递归目录
MapReduce支持文件递归修改mapreduce-site.xml文件配置

<property>
    <name>mapreduce.input.fileinputformat.input.dir.recursive</name>
    <value>true</value>
</property>

Hive支持文件递归修改hive-site.xml文件配置

<property>
    <name>mapreduce.input.fileinputformat.input.dir.recursive</name>
    <value>true</value>
</property>
<property>
    <name>hive.mapred.supports.subdirectories</name>
    <value>true</value>
</property>

7.多行数据形成一行
相同编号的学生合成一行数据
使用concat_ws、collect_set函数实现

select
id
concat_ws(',',collect_set(name)) as name,
concat_ws(',',collect_set(url)) as url
from tt groupby id;

8.Hive的调优
①Hive的并行执行配置

hive.exec.parallel=false;//默认设置
hive.exec.parallel=true;//允许并行执行

②合理设置Reduce的数量
reduce数量决定了最终作业落地的个数
reduce决定的因素
1)hive.exec.reducers.bytes.per.reducer 默认值256000000
每个Reduce能够处理的数量
2)hive.exec.reducers.max 默认值1009
每个作业最大的reduce数量
计算公式:reduce的实际数量N=min(参数二,总输入数据量/参数一)

生产中实际会调整mapred.reduce.tasks=-1的参数,手工调整启动reduce的数量。

③多个job之间共享中间结果集
创建临时表,作为中间结果表
好处:减少磁盘IO,减少网络IO
缺点:依赖关系更加严重

9.数据倾斜
导致数据清洗的原因
①join
②groupBy
③count(distinct column)
join的数据倾斜问题:
大小表,使用mapjoin
两个大表使用桶表

情形:大表与大表,但是分桶的判断字段0值或空值过多
后果:这些空值都由一个reduce处理,非常慢
大表Join大表:
把空值的key变成一个字符串加上随机数,把倾斜的数据分到不同的reduce上,由于null值关联不上,处理后并不影响最终结果。

groupBy
双层groupBy

count(disctinct column)
采用groupBy改造

10.Hive调优的其他手段
列裁剪
分区裁剪
压缩
列式存储
合并小文件

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值