oracle数据倾斜优化,Hive数据倾斜优化 - ericquan8的个人页面 - OSCHINA - 中文开源技术交流社区...

数据倾斜成因:由于数据分布不均匀,造成数据大量的集中到一点,造成数据热点。具体为某一个reduce接收到的数据是其他reduce的n倍,导致明显的木桶效应。

症状:

1,对表做select count(1) from tb group by key,看表中是否有大量相同的key。

2,查看监控界面,任务进度长时间维持在99%(或100%),只有少量(1个或几个)reduce子任务未完成或某几个reduce子任务是平均reduce时长的n倍;

d7b50f152206b5ac4bf4fe6fcc61ebc6.png

上图的其中的一个job的reduce时间远远超出其他reduce时长,表明该reduce处理的数据远超出其他的reduce,可见此次统计发生数据倾斜。

解决方案

参数调优:

1,set hive.groupby.skewindata=true:这个参数的意思是做Reduce操作的时候,拿到的key并不是所有相同值给同一个Reduce,而是随机分发,然后Reduce做聚合,做完之后再做一轮MR,拿前面聚合过的数据再算结果。所以这个参数其实跟Hive.Map.aggr做的是类似的事情,只是拿到Reduce端来做,而且要额外启动一轮Job,所以其实不怎么推荐用,效果不明显。

2,set hive.skewjoin.key=100000:这个是join的键对应的记录条数超过这个值则会进行优化。

3,set mapred.reduce.tasks=500:增加Reducer个数,通常数据(KV数值对)Shuffle到某个Reducer是根据Key进行Hash然后对Reducer个数进行取模。

HQL语句优化:

1,小表join大表:

将小表放在join左边,减少oom的几率;

使用mapjoin,小表数据最好在1000条以内。select /*+mapjoin(a)*/ count(1) from tb_a a left outer join tb_b b on a.uid=b.uid;

2,大表join大表:

把空值的key变成一个字符串加上随机数,把倾斜的数据分到不同的reduce上,由于null值关联不上,处理后并不影响最终结果。

select * from tb_a a left outer join tb_b b on (case when a.userid is null then concact('xxx', rand()) else a.userid end = b.userid);

3,不同数据类型关联产生数据倾斜,在join之前先转换数据类型:

select * from users a left outer join logs b on a.usr_id = cast(b.user_id as string);

4,count distinct优化

采用sum() group by的方式来替换count(distinct )进行计算

原语句:select a, count(distinct b) as c from tbl group by a;

改写后:select a, count(*) as c from (select distinct a, b from tbl) group by a;

另外,count distinct时,将值为空的情况单独处理,如果是计算count distinct,可以不用处理,直接过滤,在最后结果中加1。如果还有其他计算,需要进行group by,可以先将值为空的记录单独处理,再和其他计算结果进行union。

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

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

相关文章

STM32单片机低功耗配置

一、低功耗模式 当CPU不需继续运行时,可以利用多种低功耗模式来节省功耗,STM32支持三种低功耗模式,可以在要求低功耗、短启动时间和多种唤醒事件之间达到最佳的平衡。 睡眠模式SleepMode。在睡眠模式,只有CPU停止,所…

我的第一个REST客户端程序!

Delphi:XE8 看了好几天的资料了,也没有弄出来一个REST程序,尝试了XE8中带的例子,也都没有搞懂。我在网上不断搜索,看是否能够找到适合自己的文章,希望能够做出来一个REST的小例子,万幸&#xff…

GB4208中规定的外壳防护等级IP

外壳防护等级IP 经常看到仪器设备的介绍中包括防护等级,例如IP67,IP50等,不同的防护等级到底对应的是什么级别的防护呢,国标GB4208中有明确的规定。现摘录相关的描述,供查看。

如何对linux文件进行编译,linux编译和执行命令都有哪些?该如何实现?

我们知道,Linux是比如手机、平板电脑、路由器、台式计算机计算机设备的核心,它们都使用着Linux系统。以现在来说,一个合格的开发者必须要对Linux有一定的了解,那么,下面就跟小编一起来看看Linux是如何编译及执行的吧。…

如何给虚拟机上的linux系统添加虚拟硬盘

From: http://www.ezloo.com/2008/03/vmware_linux.html 给vmware虚拟机上的linux系统添加一个虚拟硬盘,并对硬盘进行分区、格式化、给分区创建文件系统,实现挂载,自动挂载! 步骤如下:保证你的linux系统处于关闭状态&a…

linux命令行打开写字板,在Linux操作系统中使用手写板

2009-07-28/14:24手写输入系统的出现拉近了大家与计算机之间的距离,使我们无须苦练输入法。此外,它也是绘画和平面设计爱好者手里的利器。Windows系统下使用手写板已经是司空见惯的事情了,但要在Linux中使用手写板呢?手写板和Linu…

Linux 普通用户和超级用户的切换

ubuntu16环境下。 1、输入su - 2、输入sudo passwd root,修改root密码。 3、切换普通用户 输入 su - jianwang16

winfrom 图片互传

private void button1_Click(object sender, EventArgs e)//从硬盘打开图片显示在窗体里面{OpenFileDialog op new OpenFileDialog();//造一个打开对话框DialogResult dr op.ShowDialog();//将打开对话框显示出来if(drDialogResult.OK) //如果点的是"打开"{FileStre…

Silverlight动画制作之From/To/By基本动画

Silverlight动画制作之From/To/By基本动画From/To/By基本动画其中包含了三个最重要的属性:From;To;By。From指的是对象目标属性的起始值,To指的是对象目标属性的结束值,By指的是结束状态相对于起始状态的偏移量。这里我…

在 Delphi 中调用 JavaScript(二)

本例效果图: 代码文件: unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 class(TForm) Memo1: TMemo; Button1: TButton; Edit1: TEdit; Label1: TLabel; procedure Button1Click(…

linux可配置哪些服务,linux操作系统下服务配置

linux操作系统下服务配置 (5页)本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦!17.90 积分实用标准文案数学与信息技术学院实 验 报 告实验课程名称: 信息系统与系统集成 实验项目名称&…

你会给别人提反馈吗?

几个例子 你会提反馈吗?不急回答,我们先来看几个例子。 例子一: 项目经理:“xxx,我本来对你的期望特别高,但是你让我有些失望啊。” xxx:“啊,不知道哪些地方做的不好呢?” 项目经理…