专栏名称: 大数据架构
分享和交流大数据领域技术,包括但不限于Storm、Spark、Hadoop等流行分布式计算系统,Kafka等分布式消息系统,PostgreSQL、MySQL等RDBMS。更多精彩好文见www.jasongj.com
目录
相关文章推荐
数局  ·  70人聚众淫乱被抓! ·  15 小时前  
CDA数据分析师  ·  【干货】如何用 AI 从0到1 ... ·  4 天前  
CDA数据分析师  ·  【干货】如何用 AI 从0到1 ... ·  5 天前  
CDA数据分析师  ·  被统计公式劝退?这门极简课程让你14天学会用 ... ·  3 天前  
51好读  ›  专栏  ›  大数据架构

解决Spark数据倾斜(三) 使用随机前缀分散倾斜Key

大数据架构  · 公众号  · 大数据  · 2017-03-13 07:30

正文

请到「今天看啥」查看全文



原理

为数据量特别大的Key增加随机前/后缀,使得原来Key相同的数据变为Key不相同的数据,从而使倾斜的数据集分散到不同的Task中,彻底解决数据倾斜问题。Join另一则的数据中,与倾斜Key对应的部分数据,与随机前缀集作笛卡尔乘积,从而保证无论数据倾斜侧倾斜Key如何加前缀,都能与之正常Join。

案例

通过如下SQL,将id为9亿到9.08亿共800万条数据的id转为9500048或者9500096,其它数据的id除以100取整。从而该数据集中,id为9500048和9500096的数据各400万,其它id对应的数据记录数均为100条。这些数据存于名为test的表中。


对于另外一张小表test_new,取出50万条数据,并将id(递增且唯一)除以100取整,使得所有id都对应100条数据。

INSERT OVERWRITE TABLE test

SELECT CAST(CASE WHEN id < 908000000 THEN (9500000  + (CAST (RAND() * 2 AS INT) + 1) * 48 )

ELSE CAST(id/100 AS INT) END AS STRING),

name

FROM student_external

WHERE id BETWEEN 900000000 AND 1050000000;


INSERT OVERWRITE TABLE test_new

SELECT CAST(CAST(id/100 AS INT) AS STRING),

name

FROM student_delta_external

WHERE id BETWEEN 950000000 AND 950500000;


通过如下代码(具体代码请点击“阅读原文”),读取test表对应的文件夹内的数据并转换为JavaPairRDD存于leftRDD中,同样读取test表对应的数据存于rightRDD中。通过RDD的join算子对leftRDD与rightRDD进行Join,并指定并行度为48。



从下图可看出,整个Join耗时1分54秒,其中Join Stage耗时1.7分钟。







请到「今天看啥」查看全文