首页 > 其他分享 >HIVE数据倾斜解决办法

HIVE数据倾斜解决办法

时间:2022-08-25 15:27:00浏览次数:42  
标签:解决办法 倾斜 map reduce HIVE 内存 join 数据


在map和reduce两个阶段中,最容易出现数据倾斜的阶段是 reduce 阶段
因为从map 到 reduce 会经过shuffle阶段 ,shuffle 默认按照key 进行hash
如果相同的key太多 ,那么hash的结果 大量相同的key就会进入同一个reduce 导致数据倾斜
当然map阶段 也会出现数据倾斜:
map读取一个不支持切割格式文件、压缩文件的时候 并且文件超过一个数据块的大小(128M) 他只能分配一个map读取,就会在map阶段发生数据倾斜

本质来说:数据倾斜的原因:任务中处理大量相同key的数据,任务读取不可切割的大文件。

数据倾斜原因及解决办法:

1、空值引发数据倾斜:

  a、过滤掉null数据

  b、给随机值

2、不同数据类型引发数据倾斜:(join的时候)

  a、统一数据类型

3、不可拆分大文件(GZIP)

  a、避免使用分割的文件格式,尽量使用bzip和zip 等可分割的文件格式。

4、数据膨胀(分组聚合字段过多 with rollup)表示针对grouping sets/rollups/cubes这类多维聚合的操作

select a,b,c,count(1)from log group by a,b,c with rollup;

  a、拆解语句

  b、调整参数:hive.new.job.grouping.set.cardinality 默认30;自动控制作业的拆解

  如果最后拆解的键组合大于该值,会启用新的任务去处理大于该值之外的组合。如果在处理数据时,某个分组聚合的列有较大的倾斜,可以适当调小该值

5、表连接(两表进行普通的repartition join时,如果表连接的键存在倾斜,那么在 Shuffle 阶段必然会引起数据倾斜)

  a、mapjoin 在map阶段完成join ,避免shuffle (适用小表join大表场景)(注意加载进内存的小表的大小)

  b、调整参数:hive.auto.convert.join=true 默认值为true,自动开启MAPJOIN优化。

  hive.mapjoin.smalltable.filesize=2500000 默认值为2500000(25M),通过配置该属性来确定使用该优化的表的大小,如果表的大小小于此值就会被加载进内存中。

  如果map端内存溢出 mapreduce.map.memory.mb 调节Map端内存的大小

6、无法解决数据量引发的数据倾斜:

select s_age,collect_list(s_score) list_score

from student

group by s_age;

  

collect_list:将分组中的某列转为一个数组返回。

1、reduce端内存溢出 调整 reduce 内存的大小 mapreduce.reduce.memory.mb

 

标签:解决办法,倾斜,map,reduce,HIVE,内存,join,数据
From: https://www.cnblogs.com/zhongxuzhi/p/16624352.html

相关文章

  • Github不稳定的解决办法
    一段时间访问github总是不稳定,刷新一下页面就会出现无法访问的问题,一开始以为是网络有问题。。。后面让同事访问看看,他们都没问题,所以问题就出现在我的本地电脑上了。。。......
  • Qt 'QApplication'file not found 解决办法
    本人初次接触Qt,第一个程序就折腾了大半天。hello.cpp#include<QApplication>#include<QLabel>intmain(intargc,char*argv[]){QApplicationa(argc,arg......
  • mysql按日期分组(group by)查询统计的时候,没有数据补0的解决办法。
    echarts折线图所需要的数据时间坐标是连续的,但数据库的数据在没有某天的数据的时候查出来的是不连续的解决之前的查询SELECTSUM(amount_data)num,group_codecode,p......
  • ORA-01950: no privileges on tablespace 'USERS'-- 解决办法
    ORA-01950:noprivilegesontablespace'USERS' 原因: 在表空间“USERS”无权限解决办法: 用户登录,查看当前用户所属表空间:select 用户名,default_tablespace......
  • docker中的mysql中文乱码解决办法
    博主最近在做谷粒商城,因为要使用docker安装mysql,但是由于安装的时候没有指定mysql的数据库的utf8格式,导致插入的时候就出现了中文是问号的情况,到处百度终于解决,于是打......
  • 解决办法:git错误 error: failed to push some refs to 'https://github.com/...
    今天提新分支代码发现这个错误,在网上尝试了很多未果。最后发现是项目没有分配开发权限,只是浏览者的权限。分下权限重新gitpush就好了。下面是有权限的时候解决方法:问题......
  • ansible unarchive模块
    ansibleunarchive模块解压复制远程主机上的压缩文件1.1ansibleunarchive模块creates:一个文件名,当它已经存在时,这个步骤将不会被运行。copy:默认为yes,拷贝的文件从ans......
  • 使用element-ui的upload组件时.el-upload__input样式出错的解决办法
    使用element-ui的upload组件时.el-upload__input样式出错的解决办法错误复现:这个样式错误折磨了我一下午!得记录一下。这个样式突然出现问题,基本解决办法有两种。一种是......
  • Presto与Hive语法差异
    Presto与Hive的语法差异示例: PrestoHive备注数组数组有动态下标,下标从1开始下标从0开始 标识符不能以数字开头命名,与java保持一致无 string......
  • CentOS忘记用户名或者密码解决办法
    一.在开机启动的时候按键盘上的“E”键会进入如下界面。二.选择相应的内核,再次按“E”,出现下图,选择第二项,再次按“E”键三.经过第二步,这个画面可以编辑,在信息的最后加......