HIVE 数据倾斜浅谈

HIVE 数据倾斜浅谈

一、数据倾斜现象

  map100%,reduce一直卡在一个值,如99%。

二、数据倾斜的原因

  数据按key的hash值分配到reduce中,如果有的key值比较集中,就会导致某个或某些reduce分配的数据量太大,这样当其他reduce运行完毕,分配数据量过大的reduce仍在运行,导致reduce进度一直卡着不动,这种现象被称为数据倾斜。造成数据倾斜的根本原因就是key值分布不均匀。

三、数据倾斜的操作

join、group by、Count Distinct

四、数据倾斜的处理方法

1. 参数配置方案

1.groupby、count distinct数据倾斜:

hive.map.aggr = true
hive.groupby.skewindata=true

  有数据倾斜的时候进行负载均衡,当选项设定为 true,生成的查询计划会有两个 MR Job。第一个 MR Job 中,Map 的输出结果集合会随机分布到 Reduce 中,每个 Reduce 做部分聚合操作,并输出结果,这样处理的结果是相同的 Key 有可能被分发到不同的 Reduce 中,从而达到负载均衡的目的;第二个 MR Job 再根据预处理的数据结果按照 Key 分布到 Reduce 中(这个过程可以保证相同的 Key 被分布到同一个 Reduce 中),最后完成最终的聚合操作。
2.join 的数据倾斜:

hive.optimize.skewjoin=true

  如果join过程中出现了数据倾斜,应该设置为true

set hive.skewjoin.key=100000

  这个是join的键对应的记录条数超过这个值则会进行优化,优化措施:正常是只有一个job的,优化后会有两个job。当倾斜Key值达到100000以上的时候,hive会把不倾斜的key进行join,倾斜的 key 的数据将会被写入HDFS临时文件,hive会再启动一个job,然后将倾斜的数据进行map 端join,最终将两个结果合并。
  但是这种处理方式不是所有地方都有效。

2. sql优化方案

1. count distinct、group by

  • 当group by key为空时,如果只是计算count
    distinct,可以不用处理,直接过滤,在最后结果中加1。如果还有其他计算,需要进行group
    by,可以先将值为空的记录单独处理,再和其他计算结果进行union。
  • count(distinct user_id),采用
select count(1) from (select user_id from log group by user_id)  t;

来替换count(distinct)完成计算。

  • 在业务逻辑优化效果的不大情况下,有些时候是可以将倾斜的数据单独拿出来处理。最后union回去。

2. 空值产生的数据倾斜

1.把空值单独处理,再与其他值的处理结果进行uinon all.
2.把空值的key变为随机数。

select *from log aleft join users bon case when a.user_id is null then concat(‘hive’,rand() ) else a.user_id end = b.user_id;

  方法2比方法1效率更好,不但io少了,而且作业数也少了。解决方法1中 log读取两次,jobs是2。解决方法2 job数是1 。这个优化适合无效 id (比如 -99 , ’’, null 等) 产生的倾斜问题。把空值的 key 变成一个字符串加上随机数,就能把倾斜的数据分到不同的reduce上 ,解决数据倾斜问题。

3. 条件中等号两端数据类型不同

  类型转换过程中可能会出现转换失败,比较常见的是string转int,失败后会造成大量null值,进而流入同一个reduce,导致数据倾斜。
  处理办法就是在条件中进行类型转换,保证两端数据类型一致。

4.小表关联大表

  Map端join会使所有的 maptask 节点都装载小表 b 的所有数据,然后大表 a 的 一个数据块数据比如说是 a1 去跟 b 全量数据做链接。实现方法:

select /* +mapjoin(a) */ a.id aid, name, age from a join b on a.id = b.id;

  在 hive0.11 版本以后会自动开启 map join 优化,由两个参数控制:

set hive.auto.convert.join=true; //设置 MapJoin 优化自动开启
set hive.mapjoin.smalltable.filesize=25000000 //设置小表不超过多大时开启 mapjoin 优化

5.小表不小关联大表——处理大表文件,使其变为可加载到内存的小表

  可以根据业务逻辑,只取必要数据(行、列两个维度限制),尽量减小数据大小,使之成为小表。比如:
当分析某段时间的日志表logs数据是亿级的,用户表users数目有数十万,把users当小表做map join会超出内存时,我们可以把users行数减少到只取出logs中包含的users,然后进行列裁剪,这样可能大大缩减users所占空间,从而可以实现map join。

select /*+mapjoin(t1)*/* from log t1
left outer join (select /*+mapjoin(t11)*/ d.*from ( select distinct user_id from log ) t11 join users t12 on t11.user_id = t12.user_id
) t1
on t0.user_id = t1.user_id;

6.大表关联大表

  两个Hive表进行join的时候,如果数据量都比较大,那么此时可以看一下两个Hive表中的key分布情况。

6.1 如果出现数据倾斜,是因为其中某一个Hive表中的少数几个key的数据量过大,而另一个Hive表中的所有key都分布比较均匀

方案实现思路

  • 对包含少数几个数据量过大的key的那个表,通过sample算子采样出一份样本来,然后统计一下每个key的数量,计算出来数据量最大的是哪几个key。
  • 然后将这几个key对应的数据从原来的表中拆分出来,形成一个单独的表,并给每个key都打上n以内的随机数作为前缀;
  • 接着将另一个表,也过滤出来这几个key对应的数据并形成一个单独的表,将每条数据膨胀成n条数据,这n条数据都按顺序附加一个0~n的前缀。
  • 再将附加了随机前缀的独立表与另一个膨胀n倍的独立表进行join,此时就可以将原先相同的key打散成n份,分散到多个task中去进行join了。
  • 不倾斜的数据照常join即可。
  • 最后将两个join的结果使用union all算子合并起来即是最终结果。
  • 比较集中的key值如果不想做数据膨胀,也可以使用map join将记录较少的表加载到内存中。

方案优点:对于join导致的数据倾斜,如果只是某几个key导致了倾斜,采用该方式可以用最有效的方式打散key进行join。而且只需要针对少数倾斜key对应的数据进行扩容n倍,不需要对全量数据进行扩容。避免了占用过多内存。
方案缺点:如果导致倾斜的key特别多的话,比如成千上万个key都导致数据倾斜,那么这种方式也不适合。

方案二:分桶join+map join
参见:https://blog.csdn.net/Samaritan_H/article/details/79090103

6.2 如果出现数据倾斜的key比较多

方案一:我们可以按6.1的方式对倾斜表所有数据加上n以随机前缀,对另一张表进行全表数据膨胀操作,然后进行关联。
这样可以缓解数据倾斜问题。但是比较消耗内存资源。
方案二:依旧分离出比较集中的key值记录,另一张表也取出相应的key值记录,然后开启map join进行关联操作,对结果进行uion。
方案三:分桶join+map join
参考文献:https://blog.csdn.net/jin6872115/article/details/79878391

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/556951.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

es6 依赖循环_require 和 import 的循环依赖详解

说到前端模块化,就不得不说到循环加载,就像混乱背后隐藏着的清晰地秩序。什么叫循环加载?我们来看一段代码。12345678910111213const b require(./b);b();module.exports function(){console.log(This is a.js);}//b.jsconst a require(./…

浅谈对称加密与非对称加密

在数字加密算法中,通过可划分为对称加密和非对称加密。 一:什么是对称加密? 在对称加密算法中,加密和解密使用的是同一把钥匙,即:使用相同的密匙对同一密码进行加密和解密; 加密过程如下&…

ios跨线程通知_一种基于Metal、Vulkan多线程渲染能力的渲染架构

快手Y-tech 原创最新技术干货分享随着3D渲染场景规模越来越复杂,单线程渲染架构在满足业务性能要求时已经捉襟见肘,因此,多线程渲染显得愈发重要。本文首先介绍了新一代图形渲染接口Metal、Vulkan,以及它们的多线程渲染特性&…

58同城面试盘点

58同城面试盘点 1.一张订单表,有user_name,order_id,order_time,order_amount 四个字段,怎么取出每个用户2021年10月以来第一个订单的金额(下单时间格式为’yyyy-MM-dd HH:mm:ss’)? select user_name,order_id,orde…

stringbuffer判断是否为空

StringBuffer sbnew StringBuffer();if(sb!null && sb.length()>0){System.out.println("证明sb不为空!"); }

virtualbox: win11主机安装deepin双向复制问题

virtualbox: win11主机安装deepin双向复制问题1.安装virtualbox增强组件(确保光驱可用)2.终端挂载3. 运行BoxLinuxAdditions4. 重启虚拟机,验证OK!使用virtualbox安装深度系统deepin虚拟,发现虚拟机和宿主机之间不能双向复制,已经…

基坑监测日报模板_刚刚!温州瓯海突发塌陷,初步判断为临近地块地下室基坑支护桩移位...

资料来源:瓯海新闻网 | 温州百事通 | 土木吧 | 岩土新鲜事 等版权归原作者所有如有侵权请联系删除9月10日中午11点左右,温州市瓯海区娄桥街道商汇路道路塌陷。塌陷路面位于商汇路的公交车站旁,几十米长的路面已经开裂,公交站台发生…

java 从一个总的list集合中,去掉指定的集合元素,得到新的集合——removeAll()

/*** 两个list集合的差集* author*/ public class ListSubstract {public static void main(String[] args) {List<String> list new ArrayList<>();//作为总的listList<String> existList new ArrayList<>();//存在的listlist.add("aa");…

virtualbox:win11上的deepin如何设置与宿主机共享文件

1. 安装virtualbox增强功能 这个没有测试&#xff0c;只是理论上需要。我在上一篇帖子《virtualbox: win11主机安装deepin双向复制问题》已经安装了增强功能&#xff0c;大家可以参考安装。 2.在virtualbox上配置共享 2.1 关闭虚拟机&#xff0c;进行设置 共享文件夹路径点击…

三角形外接球万能公式_秒杀三角形问题!!三角形分角线的几个重要结论及其应用...

点击“高中数学资料共享”关注我们解三角形问题在高考中的选择、填空、解答题一般都会涉及到(最少也有两块涉及到)&#xff0c;其中有一类涉及角平分线长度、中线长、高线长度问题&#xff0c;难度不大&#xff0c;但运算量不小&#xff0c;那我们如果在考试中能在最短时间内把…

java自定义注解为空值——自定义注解的魅力你到底懂不懂

前言 你知道自定义注解的魅力所在吗&#xff1f; 你知道自定义注解该怎么使用吗&#xff1f; 本文一开始的这两个问题&#xff0c;需要您仔细思考下&#xff0c;然后结合这两个问题来阅读下面的内容&#xff1b; 本文主线&#xff1a; 注解是什么&#xff1b;实现一个自定义注…

uniapp动态修改样式_掌握Photoshop图层样式技术

凹凸贴图效果“等等&#xff0c;什么&#xff1f;” 您会惊叹&#xff1a;““图层样式”菜单中没有凹凸贴图效果&#xff01;” 的确如此&#xff0c;但是通过将“图案覆盖”和“斜面和浮雕”结合使用&#xff0c;我们可以使用可控光源实现带纹理的凹凸贴图表面。此技术需要两…

一个专业搬砖人的幻想:全国实现旬休制度

每逢过年&#xff0c;总觉得假期不够忙&#xff0c;如果折腾折腾&#xff0c;应该还是可以的。 于是想了一个替代方案&#xff0c;以弥补春节余额不足、各种假期调休的诟病。以下是设计与比较表单&#xff1a; 调整后可以实现以下愿望&#xff1a; 旬休是每月分上、中、下三…

IoT -- (七)MQTT协议详解

MQTT是什么&#xff1f; MQTT&#xff08;Message Queuing Telemetry Transport&#xff0c;消息队列遥测传输协议&#xff09;&#xff0c;是一种基于发布/订阅&#xff08;Publish/Subscribe&#xff09;模式的轻量级通讯协议&#xff0c;该协议构建于TCP/IP协议上&#xff…

刀片服务器改台式电脑_服务器到底是个什么东东?跟电脑有啥区别?电脑知识学习!...

一位朋友留言点的内容&#xff0c;想了解服务器方面的知识&#xff0c;对于普通用户而言&#xff0c;确实对服务器感觉很神秘&#xff0c;不知道服务器到底是个什么东东&#xff0c;我保证看完这篇&#xff0c;你就会明白服务器到底是个啥了。首先可以很明确的告诉你&#xff0…

IoT -- (一) 物联网平台架构设计分析

现在网上讨论的有关物联网的帖子非常之多&#xff0c;但大部分都是介绍理论或者有关硬件&#xff0c;通讯相关的问题&#xff0c;比如物联网模块&#xff0c;物联网通讯协议MQTT、XMPP、NB_IOT等&#xff0c;个人认为这些只是物联网中一部分&#xff0c;而涉及到物联网的设备如…

SFTP批量下载与中文文件名乱码问题

一、批量下载 #!/bin/bashUSERroot #密码 PASSWORD123456 #下载文件目录 SRCDIR/data #FTP目录(待下载文件目录) DESDIR/ydfile #银联IP IP 192.111.111.111 #端口 PORT22# 清空当前目录下的旧文件 rm -rf /data/*#连接远程服务器摘取数据资源 lftp sftp://${USER}:${PASSWOR…

华为路由器hilink怎么用_华为无线充电怎么用?MatePadPro无线充电使用方法

越来越多的华为产品支持无线充电&#xff0c;比如Mate 30 Pro支持最高27W无线超级快充&#xff0c;FreeBuds 3 蓝牙无线耳机、荣耀V30 Pro&#xff0c;MatePad Pro平板也都支持无线充电。今天就跟大家分享华为手机无线充电技术原理图&#xff0c;无线充怎么用&#xff0c;无线充…

IoT -- (二) 物联网传感器介绍

传感器(Sensor)可以说是 物联网(Internet of Things, IoT)架构下&#xff0c;让智能自动化设备与智能联网产品&#xff0c;像是智能机器人、智能工厂、智能电动车、智能手环、智能医疗装置、智能家电、智能移动电话等&#xff0c;执行即时互动的关键元件。 资策会MIC资深产业分…

python乘法表运算_Python入门教程(三):史上最全的Numpy计算函数总结,建议收藏!...

点击上方 蓝字 关注我们Numpy提供了灵活的、静态类型的、可编译的程序接口口来优化数组的计算&#xff0c;也被称作向量操作&#xff0c;因此在Python数据科学界Numpy显得尤为重要。Numpy的向量操作是通过通用函数实现的。今天小编会给大家较为全面地介绍下Numpy的通用函数。01…