IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> hive数据倾斜的优化 -> 正文阅读

[大数据]hive数据倾斜的优化

一.join操作数据倾斜

1.mapjoin

map join 默认开启

set hive.auto.convert.join = true0.11版本后默认是trueset hive.mapjoin.smalltable.filesize=25000000(设置小表的大小,默认就是25M)

不管大小表放左边还是右边,自动将小表放入内存,然后在map端顺序扫描大表跟内存中的数据进行join,没有reduce阶段,没有shuffle

2.类型不一致

关联字段不一致引发的数据倾斜操作有一个a表关联字段是string类型,b表关联字段是bigint类型,将bigint转换为string类型就可以了

select
a.guid,
a.oid,
b.name
from a
join b
on a.guid=cast(b.guid as string)

3.特殊值过多

如null,空,0导致的数据倾斜
可以将特殊值加盐,可以打散到多个reduce中

select
b.guid,
a.oid,
b.name
from a
join b
on (case when a.guid is null or a.guid=0 or a.guid='null' then CONCAT('hive',RAND()) else a.guid end) = b.guid

4.大表join大表skewjoin

综合以上几点,先进行 行列过滤,然后有特殊值将特殊值加盐,类型不一致的类型转换一致
除此之外,还可以skewjoin开启join倾斜优化参数

set hive.optimize.skewjoin=true;
set hive.skewjoin.key=100000;   --(处理的总记录数/reduce个数)的2-4倍都可以接受

hive 在运行的时候没有办法判断哪个key 会产生多大的倾斜,所以使用这个参数控制倾斜的阈值,如果超过这个值,新的值会发送给那些还没有达到的reduce, 一般可以设置成你处理的(总记录数/reduce个数)的2-4倍都可以接受

原理:

对于skewjoin.key,在执行job时,将它们存入临时的HDFS目录,其它数据正常执行;
对倾斜数据开启map join操作,对非倾斜值采取普通join操作;
将倾斜数据集和非倾斜数据及进行合并操作。

5.简单的增加 reduce 并行个数

set mapred.reduce.tasks=100

二.group by操作数据倾斜

1.map端聚合

在map端部分聚合,然后在reduce端全局聚合

set hive.map.aggr = true;

2.开启group by负载均衡参数,会分两阶段聚合

原理如3

set hive.groupby.skewindata=true;

3.在sql中给group by的key加盐

在sql中给group by的key加盐,将key打散到多个reduce中
先聚合一次,然后将第一阶段的结果中key去除随机数,然后再总的聚合.明显第一阶段使相同的key都打散到了多个reduce中,并且拉去到
第二阶段reduce中的数据明显减少,这就是两阶段聚合.

select
user_id,
sum(cts) as s_cts
from
(
select
user_id,
round(rand()*1000) as rk,  --根据具体情况设置随机数的范围
count(1) as cts
from group_t
group by user_id,round(rand()*1000) --根据具体情况设置随机数的范围
) t1
group by user_id

4.避免count(distinct)操作

count(distinct)操作是用一个reduce来完成的,如果数据量很大,会导致整个job很难完成
使用sum()  group by 代替
  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2021-07-30 22:44:58  更:2021-07-30 22:45:06 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/4 1:04:28-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码