Hive数据倾斜的原因及主要解决方法

2023-11-12

数据倾斜产生的原因

数据倾斜的原因很大部分是join倾斜和聚合倾斜两大类

Hive倾斜之group by聚合倾斜

  • 原因:
    • 分组的维度过少,每个维度的值过多,导致处理某值的reduce耗时很久;
    • 对一些类型统计的时候某种类型的数据量特别多,其他的数据类型特别少。当按照类型进行group by的时候,会将相同的group by字段的reduce任务需要的数据拉取到同一个节点进行聚合,而当其中每一组的数据量过大时,会出现其他组的计算已经完成而这个reduce还没有计算完成,其他的节点一直等待这个节点的任务执行完成,所以会一直看到map 100% reduce99%的情况;
  • 解决方法:
    • set hive.map.aggr=true;
    • set hive.groupby.skewindata=true;
  • 原理:
    • hive.map.aggr=true 这个配置代表开启map端聚合;
    • hive.groupby.skewindata=true,当选项设定为true,生成的查询计划会有两个MR Job。当第一个MR Job中,Map的输出结果结合会随机分布到Reduce中,每个Reduce做部分聚合操作,并输出结果。这样处理的结果是相同的Group By Key有可能被分发到不同的Reduce中,从而达到负载均衡的目的。第二个MR Job再根据预处理的数据结果按照Group By Key分布到reduce中,这个过程可以保证相同的key被分到同一个reduce中,最后完成最终的聚合操作。

Hive倾斜之Map和Reduce优化

  • 1-原因:当出现小文件过多,需要合并小文件。可以通过set hive.merge.mapredfiles=true来解决;
  • 2-原因:输入数据存在大块和小块的严重问题,比如 说:一个大文件128M,还有1000个小文件,每 个1KB。 解决方法:任务输入前做文件合并,将众多小文件合并成一个大文件。通过set hive.merge.mapredfiles=true解决;
  • 3-原因:单个文件大小稍稍大于配置的block块的大小,此时需要适当增加map的个数。解决方法:set mapred.map.tasks的个数;
  • 4-原因:文件大小适中,但是map端计算量非常大,如:select id,count(*),sum(case when...),sum(case when ...)...需要增加map个数。解决方法:set mapred.map.tasks个数,set mapred.reduce.tasks个数;

Hive倾斜之HQL中包含count(distinct)时

  • 如果数据量非常大,执行如select a,count(distinct b) from t group by a;类型的sql时,会出现数据倾斜的问题。
  • 解决方法:使用sum...group by代替。如:select a,sum(1) from(select a,b from t group by a,b) group by a;

Hive倾斜之HQL中join优化

  • 当遇到一个大表和一个小表进行join操作时。使用mapjoin将小表加载到内存中。如:select /*+ MAPJOIN(a) */ a.c1, b.c1 ,b.c2 from a join b where a.c1 = b.c1; 
    hive0.11以上版本默认可以设置自动的进行map_join。
  • 遇到需要进行join,但是关联字段有数据为null,如表一的id需要和表二的id进行关联;
    • 解决方法1:id为null的不参与关联
      比如:
select * from log a 
 join users b 
on a.id is not null and a.id = b.id 
union all 
select * from log a 
where a.id is null; 
  • 解决方法2: 给null值分配随机的key值
    比如:
select * from log a 
left outer join users b 
on 
case when a.user_id is null 
then concat(‘hive’,rand() ) 
else a.user_id end = b.user_id; 

合理设置Map数

对上文描述的总结

  • 1)通常情况下,作业会通过input的目录产生一个或者多个map任务。
    主要的决定因素有:input的文件总个数,input的文件大小,集群设置的文件块大小。
  • 2)是不是map数越多越好?
    答案是否定的。如果一个任务有很多小文件(远远小于块大小128m),则每个小文件也会被当做一个块,用一个map任务来完成,而一个map任务启动和初始化的时间远远大于逻辑处理的时间,就会造成很大的资源浪费。而且,同时可执行的map数是受限的。
  • 3)是不是保证每个map处理接近128m的文件块,就高枕无忧了?
    答案也是不一定。比如有一个127m的文件,正常会用一个map去完成,但这个文件只有一个或者两个小字段,却有几千万的记录,如果map处理的逻辑比较复杂,用一个map任务去做,肯定也比较耗时。
  • 针对上面的问题2和3,我们需要采取两种方式来解决:即减少map数和增加map数;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Hive数据倾斜的原因及主要解决方法 的相关文章

随机推荐

  • python 列表(list)排序

    使用python的sorted函数 可对列表进行排序 该函数默认从小到大排序 1 列表中为普通元素 a 80 85 90 100 a sorted a sorted函数默认从小到大排序 print a 输出结果 80 85 90 100 倒
  • RIA项目失败的教训

    作者 Abel Avram 译者 崔康 发布于 2009年7月22日 上午11时6分 社区 Architecture Java 主题 可用性 用户界面 RIA 富客户端 桌面 EffectiveUI公司主席Anthony Franco最近做
  • MySQL Note

    一 MySQL动作关键字 1 1 create 用途 创建index procedure function schema table 语法 index create unique fulltext spatial index index n
  • Vim知识详解

    这是一个笔记 Shift Lock 大小写锁定键没有按下 正常模式 按ESC处于正常模式 移动光标 q 丢弃改动并退出 x 删除当前字符 i 在当前光标插入文本 a 在句子最后添加文本 wq 保存文件以退出 dw 从光标处删除至一个单词的末
  • Matlab实现电动汽车系列仿真(附上多个完整仿真源码+数据)

    Matlab是一种功能强大的数学软件 可以用于实现各种仿真模型和算法 在本文中 我们将介绍如何使用Matlab来实现电动汽车系列仿真 说明 首先 我们需要定义电动汽车的物理模型 电动汽车的物理模型可以包括电池 电动机 传动系统和车辆动力学模
  • Microsoft Store打不开解决办法

    1 打开 运行 输入 inetcpl cpl 或者 WINDOWS R 键 输入 inetcpl cpl亦可 2 点开高级往下拉 勾上 使用TLS 1 2 选项 或者点还原高级设置 3 打开Microsoft Store刷新页面可成功打开
  • #define相关语法

    跨行的宏定义 跨行宏定义使用反斜杠 连接 define YW GPIO ERR do printk yw gpio err d LINE printk VA ARGS while 0 使用 功能 用来把参数转化成字符串 示例代码 defin
  • SpringBoot用slf4j日志 及其 项目配置、MVC支持

    一 Slf4j日志的使用 我一直以来用的都是最传统的System out println 来打印一些错误信息时 其实我也面临过一些问题 这样做的话 错误信息和别的输出结果混在一起 我一直都很难从结果里面找到我调试出来的问题 而且我用这种传统
  • Linux:函数和脚本参数

    使用以下方式定义函数 function function name 语句 1 语句 2 举例 向函数传递参数和返回值 1 在函数中获取传递的参数时 可以像脚本获取参数那样 使用位置变量 1 2 3 等 升级 vim fun sh 脚本调用
  • Unity获取Animtor过渡信息

    Animator切换动画时候 会有一个过渡的过过程 可以通过 AnimatorTransitionInfo transitionInfo animator GetAnimatorTransitionInfo 0 来获取切换状态 Animat
  • postgresql_quick_start

    文章目录 创建数据库 选择数据库 删除数据库 建表 删表 关于模式 模式的增删 和表一起操作 创建用户 示例 所有 开头的命令必须使用 postgresql 自带的可执行程序 postgresql 提供的程序大小写敏感 创建数据库 CREA
  • 2014 新版ITC 重新上传ipa 修改build version

    之前上传ipa的时候 不想改版本号 但是又想重新提交ipa的时候 提交不了 上网查了资料看到以下的解决方法就可以重新提交ipa
  • electron在window7上安装白屏问题

    问题描述 electron5 0 13以上的版本打包win7上需要 NET Framework 4 6 版本及以上版本才可以运行 但是有些win7由于是SP1的系统属于精简版window所以无法安装 NET Framework 4 6及其以
  • 教你如何在Android 6.0上创建系统悬浮窗

    转自郭林的微信公众号 今天周二 又该跟大家分享由我执笔的文章了 从之前我写的deep links 通知栏微技巧这两篇文章中 大家应该能明显体会出什么叫短小精炼 但又很有技术价值的文章 后面我还会坚持分享这种类型的文章 尽量让大家十分钟内就可
  • 华为OD机试 C++ 最快到达医院的方法

    描述 武汉出现了交通封锁 导致大壮在考虑去附近的医院时遇到了难题 大壮住在武汉 他家附近有两家医院 医院A距离他X公里 去这家医院 大壮只能乘坐计程车 车速为M米 分钟 但要等车L分钟 医院B距离他Y公里 但去这家医院 大壮只能选择步行 速
  • neo4j搭建豆瓣电影top250知识图谱踩过的坑

    neo4j 4 0 1 重置neo4j 将安装地址data文件夹中两个文件夹databases和transactions直接删除 再启动neo4j 进入浏览器会回到最开始的输入原始用户名和密码 neo4j neo4j 之前创建的数据库会清空
  • Ubuntu18.04/16.04+RTX2080Ti+docker的深度学习环境配置

    Ubuntu18 04 16 04 RTX2080Ti docker的深度学习环境配置 1 NVIDIA的GPU驱动安装 根据显卡型号去NVIDIA官网下载驱动 官网链接https www nvidia com Download index
  • 小程序更多的手势事件(左右滑动、放大缩小、双击、长按)

    小程序更多的手势事件 左右滑动 放大缩小 双击 长按 前言 一 组件事件的设置 二 左右滑动事件 1 流程图 2 代码示例 三 放大缩小事件 1 流程图 2 代码示例 四 双击事件 1 流程图 2 代码示例 前言 微信小程序提供的原生事件有
  • gnuradio的安装以及安装常见错误

    本文是从纯小白 0基础的出发点上 从概念入手 不仅介绍gnuradio在Linux上的安装流程 及安装时的常见错误 还普及了一些小白需要了解的必备知识 目录 1 虚拟机的安装 2 Linux系统的安装 3 gnuradio的安装 4 安装常
  • Hive数据倾斜的原因及主要解决方法

    数据倾斜产生的原因 数据倾斜的原因很大部分是join倾斜和聚合倾斜两大类 Hive倾斜之group by聚合倾斜 原因 分组的维度过少 每个维度的值过多 导致处理某值的reduce耗时很久 对一些类型统计的时候某种类型的数据量特别多 其他的