如何解决大数据计算中常见的数据倾斜问题?

数据倾斜是在大数据计算中常见的问题,用最通俗易懂的话来说,数据倾斜无非就是大量的相同key被partition分配
到一个分区里,造成了‘一个人累死,其他人闲死‘的情况,这种情况是我们不能接受的,这也违背了并行计算的初衷,首先
一个节点要承受着巨大的压力,而其他节点计算完毕后要一直等待这个忙碌的节点,也拖累了整体的计算时间,可以说
效率是十分低下的。
以下针对spark具体计算场景,给出数据倾斜解决方案:
场 景
当RDD执行reduceByKey等聚合类shuffle算子或者在Spark SQL中使用group by语句进行分组聚合时,产生数据
倾斜。
出现数据倾斜原因:
在上述分组场景中,具有相同的key的数据就会被分配到同一个组当中,从而分配到同一分区。如果某些相同key
的数据量非常大,而其他是key的数据量相对较小,此时就可能产生比较严重的数据倾斜。
解决方案
本方案通过两个阶段聚合:
阶段一
先给每个key都打上一个随机数,比如10以内的随机数,比如(spark,1) (spark, 1) (spark, 1) (spark, 1),就会变成
(1_spark, 1) (1_spark, 1) (2_spark, 1) (2_spark, 1)。打上随机数以后,原先一样的key就变成不一样的了。然后对
数据进行reduceByKey等聚合操作,局部聚合结果变成了(1_spark, 2) (2_spark, 2)。
阶段二
基于阶段一局部聚合的数据,将各个key的前缀给去掉,就会变成(spark,2)(spark,2),再次进行全局聚合操作,得
到最终结果,比如(spark, 4)。

小结
数据倾斜是大数据计算中常见的问题,很多场景的计算都会出现数据倾斜的情况,而解决数据倾斜的主体思路都是
在计算过程当中尽量能将数据均匀地分配到各个分区,从而充分提高每个计算节点的利用率,提高整体的计算效
率。本文当中是针对spark一个计算场景出现数据倾斜问题给出解决方案。

更多资源请关注黑马程序员广州中心官方公号获取。

原文地址:https://blog.51cto.com/14360146/2404392

时间: 2024-09-30 04:54:52

如何解决大数据计算中常见的数据倾斜问题?的相关文章

Mysql 如何删除数据表中的重复数据!

1.使用distinct查询所有不重复的记录 2.创建数据表相同结构的临时表,将第一步的数据复制进去 create temporary table if not exists student_temp as (select distinct(name), sex from student); 3.truncate table student; 4.insert into student(id,name,sex) select null,name,sex from student_temp; My

ASP.NET MVC搭建项目后台UI框架—8、将View中选择的数据行中的部分数据传入到Controller中

ASP.NET MVC搭建项目后台UI框架—1.后台主框架 ASP.NET MVC搭建项目后台UI框架—2.菜单特效 ASP.NET MVC搭建项目后台UI框架—3.面板折叠和展开 ASP.NET MVC搭建项目后台UI框架—4.tab多页签支持 ASP.NET MVC搭建项目后台UI框架—5.Demo演示Controller和View的交互 ASP.NET MVC搭建项目后台UI框架—6.客户管理(添加.修改.查询.分页) ASP.NET MVC搭建项目后台UI框架—7.统计报表 ASP.NE

mssql sqlserver 禁止删除数据表中指定行数据(转自:http://www.maomao365.com/?p=5323)

转自:http://www.maomao365.com/?p=5323 摘要:下文主要讲述,如何禁止删除数据表中指定行数据 最近收到用户一个需求,禁止所有人删除”表A”中,ID 为1.2.3.4.5的系统默认数据,通过项目组同事仔细研究,我们得到一致的答案为:在表上新增一个触发器,当删除数据ID为 1 2 3 4 5时候,直接弹出相应的错误,采用这种模式,可以限制所有端口的异常操作(程序 查询分析器),具体实现方式,如下文所示: create trigger trTriggerA on A fo

如何解决报表关联计算中的性能问题

报表开发过程中经常要在报表中完成数据关联计算,有时为了降低报表制作复杂度,会将关联关系放到可视的报表模板中完成:而有时则必须在报表中完成关联,如多数据源.异构数据源的情况.在报表中做关联往往导致报表效率不高,计算过慢,从而引发性能问题.为此,润乾报表提供了高性能数据关联方式(需要结合集算器实现),可以显著提升报表的计算效率.这里就通过一个常见的多源关联分片报表实例来说明润乾报表的实现过程: 报表说明 根据销售情况等信息按照时间.地区.销售人员.产品等维度汇总销售额,报表样式如下: 以下为实现过程

解决读取Excel表格中某列数据为空的问题 c#

解决同一列中“字符串”和“数字”两种格式同时存在,读取时,不能正确显示“字符串”格式的问题:set xlsconn=CreateObject("ADODB.Connection") xlsconn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="&server.mappath(xlspath)&";Extended Properties=""Excel 8.0;HD

java的for循环问题的解决,以及安卓中ListView插入数据的问题

package test.testdemo; import org.springframework.jdbc.core.JdbcTemplate; import com.util.Pub; public class Test4 { public static void main(String[] args) { String sql = " insert into temp_spring (AAC003, AAC002, D, E, F, G, H, I, J, K)" + "

js数据计算中的一个bug,9.44+4.8计算结果竟然是14.239999999999998

在使用js计算数据时,遇到一个很奇怪的问题,9.44+4.8计算结果竟然是14.239999999999998这个??很夸张. 于是享有经验的同事请教,这是怎么回事,原来是js的bug,在减法时,经常出现,加法时出现的少,需要修正,修正方式有两种,一种是转化为整数,另一种是使用toFixed() ,还有一种方式就是给加上一个很小的数,例如0.000000001,然后在取几位小数 第一种方法:使用整数的方法: alert( (9.44*100+4.8*100)/100.0) 第二种方法:使用toF

C# DataAdapter.Update() 无法更新数据表中删除的数据行

用DataAdapter.Update() 方法更新删除了部分DataRow 的 DataTable .但是数据库中的数据没有随着更新而变化. 原因:DataTable 删除 DataRow 时,使用的是DataTable.Rows.Remove(DataRow ) 或 DataTable.Rows.RemoveAt(DataRowIndex) 方法. 解决方法:使用 DataTable.Rows[rowIndex].Delete() ; 方法删除数据. 详解如下: DataAdapter.Up

MySQL 使用while语句向数据表中批量插入数据

1.创建一张数据表 mysql> create table test_while ( -> id int primary key) charset = utf8; Query OK, 0 rows affected (0.28 sec) 查看数据表的结构 mysql> desc test_while; +-------+---------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Ext