Hive数据倾斜

HIVE关联key数据类型不一致导致数据重复 结论:字段类型不一致,关联时将key转为double,导致精度丢失 示例:select cast(186994576061124660 as double)和select cast(186994576061124559 as double)结果都是1.86994576061124672E17 导致最终mapping结果重复 解决方法:需要将id转为string,修改后执行计划见图2 ... 阅读详情

  数据倾斜主要表现在MapReduce程序执行时,Reduce节点大部分执行完毕,但由于个别Reduce节点运行很慢,导致整个程序的处理时间很长。这是因为某一个Key的条数比其他Key多很多,导致这条Key所在的Reduce节点所处理的数据量比其他节点就大很多,从而导致某几个节点迟迟运行不完。

发生数据倾斜的Situation

数据倾斜可能会发生在group过程/join过程

join过程

大表和小表关联时

  一个上千万行的记录表和一个几千行表之间join关联时,容易发生数据倾斜。Hive中小表与大表join的优化策略——把重复关联键少的表放在join前面做关联可以提高join的效率。
  Reduce在接收全部Map的输出后会有一个排序所有键值对并合并写入磁盘文件的操作。写入磁盘(spill)有可能是多次的,因此有可能会生成多个临时文件,但是最终都要合并成一个文件,即最终每一个Reduce都只处理一个文件。不论多复杂的Hive查询,最终都要转化成Mapreduce的job去执行,因此Hive对于关联的实现和Mapreduce对于关联的实现类似,即:把关联键和标记是在join左边还是右边的标识位作为组合键(key),把一条记录以及标记是在join左边还是右边的标识位组合起来作为值(value)。在Reduce的shuffle阶段,按照组合键的关联键进行主排序,当关联键相同时,再按照标识位进行辅助排序。而在分区段时,只用组合键中的关联键进行分区段,这样关联键相同的记录就会放在同一个value list中,同时保证了join左边的表的记录在value list的前面,而join右边的表的记录在value list的后面。
  对于A join B ON (A.id = b.id) ,假设A表和B表都有1条id =6的记录,那么A表这条记录的组合键是(6,0),B表这条记录的组合键是(6,1)。排序时可以保证A表的记录在B表的记录的前面。而在Reduce做处理时,把id=6的放在同一个value list中,形成 key = 6,value list = [A表id=6的记录,B表id=6的记录]。当两个表做关联时,Reduce会一起处理id相同的所有记录。把value list用数组来表示。
  1) Reduce先读取第一条记录v[0],如果发现v[0]是B表的记录,那说明没有A表的记录,最终不会关联输出,因此不用再继续处理这个id了,读取v[0]用了1次读取操作。如果发现v[0]到v[length-1]全部是A表的记录,那说明没有B表的记录,同样最终不会关联输出,但是这里注意,已经对value做了length次的读取操作。
  2) 例如A表id=6有1条记录,B表id=6有10条记录。首先读取v[0]发现是A表的记录,用了1次读取操作。然后再读取v[1]发现是B表的操作,这时v[0]和v[1]可以直接关联输出了,累计用了2次操作。这时候Reduce已经知道从v[1]开始后面都是B 表的记录了,因此可以直接用v[0]依次和v[2],v[3]……v[10]做关联操作并输出,累计用了11次操作。
  3) 换过来,假设A表id=6有10条记录,B表id=6有1条记录。首先读取v[0]发现是A表的记录,用了1次读取操作。然后再读取v[1]发现依然是A表的记录,累计用了2次读取操作。以此类推,读取v[9]时发现还是A表的记录,累计用了10次读取操作。然后读取最后1条记录v[10]发现是B表的记录,可以将v[0]和v[10]进行关联输出,累计用了11次操作。接下来可以直接把v[1]~v[9]分别与v[10]进行关联输出,累计用了20次操作。
  4) 当Reduce检测A表的记录时,还要记录A表同一个key的记录的条数,当发现同一个key的记录个数超过hive.skewjoin.key的值(默认为1000000)时,会在Reduce的日志中打印出该key,并标记为倾斜的关联键。
结论:写在关联左侧的表每有1条重复的关联键时底层就会多1次运算处理。假设A表有一千万个id,平均每个id有3条重复值,那么把A表放在前面做关联就会多做三千万次的运算处理。

解决方式:
1.多表关联时,将小表(关联键记录少的表)依次放到前面,这样可以触发Reduce端更少的操作次数,减少运行时间。
2.同时可以使用Map Join让小的维度表缓存到内存。在Map端完成join过程,从而省略掉Redcue端的工作。但是使用这个功能,需要开启map-side join的设置属性:set hive.auto.convert.join=true(默认是false),同时还可以设置使用这个优化的小表的大小:set hive.mapjoin.smalltable.filesize=25000000(默认值25M)

大表和大表的关联

  大表与大表关联,但是其中一张表多是空值或者0比较多,容易shuffle给一个Reduce,造成运行慢。

解决方式1:
  这种情况可以对异常值赋一个随机值来分散key,均匀分配给多个Reduce去执行,解决办法的突破点就在于把左表的未关联记录的key尽可能打散,若左表关联字段无效(为空、字段长度为零、字段填充了非整数),则在关联前将左表关联字段设置为一个随机数,再去关联右表,这么做的目的是即使是左表的未关联记录,它的key也分布得十分均匀,比如:

select  ...
from trackinfo a left outer join pm_info b
on ( case when (a.ext_field7 is not null and length(a.ext_field7) > 0    and a.ext_field7 rlike ' ^ [0-9]+$')
      then cast(a.ext_field7 as bigint)
      else cast(ceiling(rand() * -65535) as bigint) end = b.id ) 
  #将A表垃圾数据(为null,为0,以及其他类型的数据)赋一个随机的负数,然后将这些数据shuffle到不同Reduce处理。

解决方式2:
  当key值都是有效值时,解决办法为设置以下几个参数:

set hive.exec.reducers.bytes.per.reducer = 1000000000
//每个节点的Reduce默认是处理1G大小的数据
set hive.optimize.skewjoin = true;
set hive.skewjoin.key = skew_key_threshold (default = 100000)

  Hive 在运行的时候没有办法判断哪个key 会产生多大的倾斜,所以使用这个参数控制倾斜的阈值,如果超过这个值,新的值会发送给那些还没有达到阈值的Reduce, 一般可以设置成处理的总记录数/Reduce个数的2-4倍。倾斜是经常会存在的,一般select 的层数超过2层,翻译成执行计划多于3个以上的MapReduce job很容易产生倾斜,建议每次运行比较复杂的SQL之前都可以设置这个参数。官方默认的1个Reduce 只处理1G 的算法,那么skew_key_threshold = 1G/平均行长或者默认设成250000000 (差不多算平均行长4个字节)。

group过程

  使用Hive对数据做一些类型统计的时候遇到过某种类型的数据量特别多,而其他类型数据的数据量特别少也会造成数据倾斜。当按照类型进行group by的时候,会将相同的group by字段的Reduce任务需要的数据拉取到同一个节点进行聚合,而当其中每一组的数据量过大时,会出现其他组的计算已经完成而这里还没计算完成,其他节点的一直等待这个节点的任务执行完成,所以会看到一直Map 100%;Reduce 99%的情况。

解决方式1:

hive.map.aggr=true  //(默认true) 这个配置项代表是否在map端进行聚合,相当于Combiner
hive.groupby.skewindata=true//(默认false)

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

其他情况

不同数据类型关联产生数据倾斜

  一张表tab的日志,每个商品一条记录,要和商品表关联。tab的日志中有字符串商品id,也有数字的商品id,类型是String的,但商品中的数字id是bigint类型的。造成数据倾斜的原因是把tab的商品id转成数字id做hash来分配Reduce,所以字符串id的tab日志,都到一个Reduce上了。

解决方法:把数字类型转换成字符串类型

Select * from tab a Left outer join r_auction_auctions b On a.auction_id =cast(b.auction_id as string);

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;

Reduce个数太少

  Reduce数太少set mapred.reduce.tasks=800;默认是先设置hive.exec.reducers.bytes.per.reducer这个参数,设置了后Hive会自动计算Reduce的个数,因此两个参数一般不同时使用。

Hive优化join操作

第一:在map端产生join
  map Join的主要意思就是,当链接的两个表是一个比较小的表和一个特别大的表的时候,把比较小的table直接放到内存中去,然后再对比较大的表进行map操作。join就发生在map操作的时候,每当扫描一个大的table中的数据,就要去去查看小表的数据,哪条与之相符,继而进行连接。这里的join并不会涉及reduce操作。map端join的优势就是在于没有shuffle。在实际的应用中设置:set hive.auto.convert.join=true; 这样设置,Hive会自动识别比较小的表,继而用map Join来实现两个表的联合。在本质上map join根本就没有运行MR进程,仅仅是在内存就进行了两个表的联合。

第二:common join
  common join也叫做shuffle join,reduce join操作。这种情况下两个table的大小相当,但是又不是很大的情况下使用的。具体流程就是在map端进行数据的切分,一个block对应一个map操作,然后进行shuffle操作,把对应的block shuffle到reduce端去,再逐个进行联合,这里优势会涉及到数据的倾斜,大幅度的影响性能有可能会运行speculation。

第三:SMBJoin
  SMB是sort merge bucket操作,首先进行排序,继而合并,然后放到所对应的bucket中去,bucket是Hive中和分区表类似的技术,就是按照key进行hash,相同的hash值都放到相同的buck中去。在进行两个表联合的时候。我们首先进行分桶,在join会大幅度的对性能进行优化。也就是说,在进行联合的时候,是table1中的一小部分和table1中的一小部分进行联合,table联合都是等值连接,相同的key都放到了同一个bucket中去了,那么在联合的时候就会大幅度的减小无关项的扫描。

set hive.auto.convert.sortmerge.join=true;
set hive.optimize.bucketmapjoin = true;
set hive.optimize.bucketmapjoin.sortedmerge = true;
set hive.auto.convert.sortmerge.join.noconditionaltask=true;
Hive解决数据倾斜 数据倾斜(Data Skew)问题是指在分布式计算系统中,由于某些数据分布不均匀,导致某些节点处理的数据量远远大于其他节点,从而引起性能瓶颈、计算延迟甚至计算失败的现象。在Hive中,在处理或者问题时,如果分组字段或者连接字段存在分布不均匀,即某个key或者某些key的数量远超其他key,就会造成在按key分区发往reduce端的时候,某个reduce接收了大量的数据,所需的处理时间也会远超其他reduce,成为整个任务的瓶颈。 阅读详情

相关推荐

【Hive】Hive数据倾斜以及解决方案

数据倾斜就是我们在计算数据的时候,数据的分散度不够,导致大量的数据集中到了一台或者几台机器上计算,这些数据的计算速度远远低于平均计算速度,导致整个计算过程过慢。

qq_37472274的博客 3471

hive sql join 时字段类型不一致问题

在用hive sql 查询数据时会遇到 两个表通过字段join,假如两个字段类型不一样,有可能出现莫名其妙的结果。 解决方法: 将2个字段类型转成一样。比如 两个表通过id关联, 一个是 string 一个是 int,可以将 string 转成int  eg: (cast id as int) as id

weifengs 的博客 7717

Hive数据倾斜的优化配置

Hive本质 Hive的本质其实就是 Hdfs+MapReduce,HDFS存储、MR执行任务 发生数据倾斜的原因 1.数据本身倾斜 内容倾斜、group by倾斜、小表Join大表 2.过多 Join过多导致Job过多、小文件过多、Mapper或Reducer过多 3.SQL语句使用问题 count(distinct)->全盘扫描 join ... where 笛卡尔乘积 关于数据倾斜见我的博客: 大数据常见问题:数据倾斜的原理及处理方案_AriesLY0411的博客-优快云

AriesLY0411的博客 2487

Hive map阶段缓慢

不同数据类型关联产生数据倾斜 场景:用户表中user_id字段为int,log表中user_id字段既有string类型也有int类型。当按照user_id进行两个表的Join操作时,默认的Hash操作会按int型的id来进行分配,这样会导致所有string类型id的记录都分配到一个Reducer中。 解决方法:把数字类型转换成字符串类型 select * from users a   l...

hellojoy的博客 4239

Hive数据倾斜解决思路

Hive数据倾斜总结 发生倾斜的根本原因在于,shuffle之后,key的分布不均匀,使得大量的key集中在某个reduce节点,导致此节点过于“忙碌”,在其他节点都处理完之后,任务的结整需要等待此节点处理完,使得整个任务被此节点堵塞,要解决此问题,主要可以分为两大块:一是尽量不shuffle;二是shuffle之后,在reduce节点上的key分布尽量均匀。 倾斜探查 join key倾斜 se...

strongyoung的专栏 2423

Hive 数据倾斜

数据倾斜:数据分布不均匀,造成数据大量的集中到一点,造成数据热点。主要表现为任务进度长时间维持在 99%或者 100%的附近,查看任务监控页面,发现只有少量 reduce 子任务未完成,因为其处理的数据量和其他的 reduce 差异过大。单一 reduce 处理的记录数和平均记录数相差太大,通常达到好几倍之多,最长时间远大 于平均时长。根本原因就是大量相同的key被分配到一个reduce里,造成一个reduce任务累死了,但是其他的reduce任务闲死4.1重新分区(Repartitioning)

ziaoming_biu的博客 1683

hive数据倾斜(超详细)

说到hive的数据倾斜,可能有的小伙伴还不了解什么是数据倾斜,所以咱们这一次就从hive数据倾斜的表现、hive数据倾斜发生的原因、hive数据倾斜的解决方案这三个方面来聊一聊hive的数据倾斜。

wind96的博客 9757

【对比学习+分割】CRIS:CLIP驱动RIS图像分割(CVPR 2022)

CRIS: CLIP-Driven Referring Image Segmentation

这个博客太懒了什么都没说 3325

Hive基础之:hive数据倾斜原因及解决方案

hive数据倾斜原因总结和及解决方案

weixin_43542605的博客 1万+

实战指南:CentOS 7下VOS3000 8.0从零部署到授权激活全流程

本文提供了一份详尽的CentOS 7系统下部署VOS3000 8.0的实战指南。从环境准备、使用FileZilla上传安装包、执行自动化安装脚本,到获取软件码、利用注册机生成授权文件并激活,手把手带领用户完成从零部署到投入商用的全流程,确保系统稳定运行。

zero1的博客 896

别再傻傻分不清了!一文搞懂电机里的‘旋变’和‘编码器’到底有啥区别

本文深度解析电机位置传感器中旋转变压器(旋变)与编码器的核心区别,包括工作原理、精度对比及环境适应性。通过实测数据和典型应用场景,帮助工程师在工业机器人、新能源汽车电机等关键领域做出精准选型决策,提升系统可靠性和控制精度。

weixin_28689507的博客 504

Hive解决数据倾斜的各种优化方法

一、概念 数据处理中的数据倾斜:个人理解,在数据处理的MapReduce程序中,由于数据的特殊性,数据中存在大量相同key的数据,根据业务需求需要对这个key进行分区操作(group by/join)时,在map的partition阶段将大数据量的相同key的数据全部分配到同一个Reduce,导致Reduce的节点数据量分配极度不均衡的现象,称为数据倾斜。 数据倾斜有哪些表现: 最直观的表现就是:Hive SQL运行得慢 任务进度长时间维持在99%(或100%),查看任务监控页面,发现只有少量.

TRX的博客 7545

LPDDR6与LPDDR5 State Diagram技术探讨

LPDDR6与LPDDR5 State Diagram技术探讨

zilan23的博客 1176

Hive数据倾斜总结

这里写目录标题前言一、什么是Hive的数据倾斜二、发生数据倾斜的原因三、如何解决不同类型的数据倾斜 前言         数据倾斜是大数据处理不可避免会遇到的问题,那么在Hive中数据倾斜又是如何导致的?通过本片本章,你可以清楚的认识为什么Hive中会发生数据倾斜;发生数据倾斜时我们又该用怎么的方案去解决不同的数据倾斜问题。 一、什么是Hive的数据倾斜       

wsjslient的博客 2075

电子设计(1)二极管防电源反接电路

二极管经常用来作电源防反接保护,所需器件少,电路简单。

记得诚 1万+

从底层结构开始学习FPGA(8)----Block RAM(BRAM,块RAM)

BRAM作为FPGA底层的存储资源,作用很大,比如可以RAM/ROM/FIFO。

孤独的单刀 2万+

Hive中常见的数据倾斜问题的处理

1、什么是数据倾斜? 数据倾斜主要表现在,map/reduce程序执行时,reduce节点大部分执行完毕,但是有一个或者几个reduce节点运行很慢,导致整个程序的处理时间很长,这是因为某一个key的条数比其他key多很多(有时是百倍或者千倍之多),这条Key所在的reduce节点所处理的数据量比其他节点就大很多,从而导致某几个节点迟迟运行不完。 2、常见容易出现数据倾斜的...

Running-小猛的博客 9164

深入解读WT软件湍流强度计算与分析

深入解读WT软件湍流强度计算与分析

weixin_46713695的博客 1023

hive数据倾斜

hive数据倾斜 1. join时产生数据倾斜 1.1 小表join大表 使用mapjoin 1.2 大表join大表 1.2.1 key为空值造成的影响 空值太多join时,会把所有key为空值的数据发送到同一个reduce中,发生数据倾斜 解决方法: 空值不重要的情况,先把空值过滤掉,在进行join 空值不能过滤,使用case when 对空值附上随机值,然后进行join,这样会把所有key为空值的数据发送到不同的reduce中去处理. 1.2.2 热点key 可以将热点数据和非热点数据分别进行处理

weixin_47699191的博客 2290

USB驱动(URB)

本文介绍了Linux内核中USB驱动开发的核心概念URB(USB Request Block)。URB是主机与USB设备间传输数据的抽象结构体,包含目标设备、端点信息、数据缓冲区等关键字段。文章详细解析了URB的生命周期(分配、填充、提交、回调、释放)、四种传输类型(控制、批量、中断、等时)及其应用场景,并提供了鼠标设备的中断传输示例代码。最后强调了URB使用注意事项,包括DMA缓冲区分配、错误处理和资源释放等。URB作为USB驱动与内核通信的桥梁,是构建稳定USB驱动程序的基础。

m0_49476241的博客 915

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

hive 数据倾斜

hive 数据倾斜

qq_43192537的博客 2729

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Hive中的数据倾斜

列举Hive中出现数据倾斜的几种情况: 一、没开Map端聚合产生的计算不均衡 例如有一张客户表customer,里面存有客户ID(cust_id)和性别(gender),男女各1亿条记录,cust_id没有重复。 现在要按性别分组统计记录数: select gender, count(1) from customer group by gender; 没开Map端聚合的数据处理流程如下: ...

andyguan01_2的博客 5810

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Hive SQL 解决数据倾斜

这样,数据就会基于加盐后的。重新分布,减轻数据倾斜。

言之。 1万+

hive解决数据倾斜问题_hive数据倾斜的解决办法

数据倾斜是进行大数据计算时常见的问题。主要分为map端倾斜和reduce端倾斜,map端倾斜主要是因为输入文件大小不均匀导致,reduce端主要是partition不均匀导致。在hive中遇到数据倾斜的解决办法:一、倾斜原因:map端缓慢,输入数据文件多,大小不均匀当出现小文件过多,需要合并小文件。可以通过set hive.merge.mapfiles=true来解决。set hive.map.a...

weixin_35785014的博客 2610

hive解决数据倾斜问题_hive数据倾斜及处理

火山日常啰嗦学习了一些大数据的相关框架后,发现应用层的东西确实不难,真正难的都是底层原理,所以我查看了很多资料,借鉴了前人的方法再加上自己的理解,写下了这篇文章。数据倾斜的直白概念:数据倾斜就是数据的分布不平衡,某些地方特别多,某些地方又特别少,导致的在处理数据的时候,有些很快就处理完了,而有些又迟迟未能处理完,导致整体任务最终迟迟无法完成,这种现象就是数据倾斜。针对mapreduce的过程来说就...

weixin_34169503的博客 1536

hive中数据倾斜

数据倾斜通常指hive根据key值hash分发到各个节点,相同的key值会分发到一个执行节点中,由于某些key值对应的数据量比其它key值的数据量大很多,导致某些执行节点的运行时间远大于其它节点,从而导致整个job执行时间较长。 在hive中执行的sql会有map和reduce两个阶段,map阶段的数据倾斜主要为数据从磁盘读入内存时、join,reduce阶段数据倾斜主要有join、group b...

Guetse的博客 1235
上一篇: 常见数据结构-TrieTree/线段树/TreeSet
下一篇: TopK问题
K. Bob
博客等级 码龄8年 82粉丝 294原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值