Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >join实践: 万亿级数据量任务优化历程

join实践: 万亿级数据量任务优化历程

作者头像
Flink实战剖析
发布于 2022-04-18 05:46:19
发布于 2022-04-18 05:46:19
60900
代码可运行
举报
文章被收录于专栏:Flink实战剖析Flink实战剖析
运行总次数:0
代码可运行

优化前

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT  count(*)
FROM    tbl_0 a
JOIN    tbl_1 b
ON      a.ds = 20220310
AND     b.ds = 20220310
AND     a.key = b.key
;

大概执行2h, 还未得出结果。

第一次优化

暴力增加join 的并行度, 没有什么优化是比加资源来得更直接。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
set odps.sql.joiner.instances=1000; //表示join 的并行度加到1000 
SELECT  count(*)
FROM    tbl_0 a
JOIN    tbl_1 b
ON      a.ds = 20220310
AND     b.ds = 20220310
AND     a.key = b.key
;

大概执行2h, 仍未得出结果。

第二次优化

重新分析两张表数据量,a 表数据量750w+, b 表数据量350w+, 在未做任何优化情况下数据是需要经过shuffle, 将相同的key分布到相同的节点上, 首先考虑使用mapjoin 解决,使其不用执行shuffle操作。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT /*+mapjoin(b)*/ count(*)
FROM    tbl_0 a
JOIN    tbl_1 b
ON      a.ds = 20220310
AND     b.ds = 20220310
AND     a.key = b.key
;

大概执行2h, 仍未得出结果。

第三次优化

重新分析表数据分布情况, 查看a、b 两张表的join-key 的数据情况:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT
        key
        ,count(*)
FROM    tbl_0/tbl_1
WHERE   ds =20220312
GROUP BY KEY
ORDER BY count(*) desc;

只取top5数据量的key:

a 表

WorkWell

1586079

GoodQuality

1428452

ProductExperience

1186742

BuyerRecomendSeller

1147469

UserExperience

763998

b表

ProductExperience

832075

UserExperience

309142

GoodQuality

245208

BuyerRecomendSeller

213484

SPS_Material

196508

两张表的key 的类型不多,但是单个key值的个数比较多,例如

GoodQuality 在a表中1428452条记录,在b表中245208条记录,最终就会产生 1428452*245208=3500亿的数据量,这样相同的GoodQuality 分布到同一个节点去处理,很明显发生数据长尾效应。对于这样的情况,普通的mapjoin 或者是sort-merge已经不适合了,需要尽可能的将key分散,分发到不同的节点去处理,因此使用随机前缀+扩容的方式处理。

什么是随机前缀+扩容?对其中一张表数据量扩容n倍,另外一张表对join-key生成随机0~n的随机前缀数据,通过这种方式将join-key充分打散到下游不同的节点处理,以达到优化效果。在这里通过定义udf 实现随机前缀, udtf实现数据扩容:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//生成max以内的随机数
public class RandomData extends UDF {
     public Random r;
     @Override
    public void setup(ExecutionContext ctx) throws UDFException {

      r=new Random();
    }
    public Integer evaluate(Integer max) {
        return  r.nextInt(max);
    }
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//数据量扩充
public class ExpandData extends UDTF {
    @Override
    public void setup(ExecutionContext ctx) throws UDFException {
    }

    @Override
    public void process(Object[] args) throws UDFException {
      Long expand=(Long)(args[0]);//代表了扩充的倍数
      Object[] args1=new Object[args.length];
      for(int i=0;i<expand;i++){

           for(int j=0;j<args.length;j++){
               args1[j]=i+"_"+args[j];
           }
          super.forward(args1);
      }
    }

    @Override
    public void close() throws UDFException {

    }
}

然后重新执行SQL:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
set odps.sql.joiner.instances=1000;
SELECT 
  count(*)
from (
select *, CONCAT_WS('_',RandomData(1000),key) newKey  from  tbl_0
where ds=20220312
) a join (
SELECT  newKey from (
SELECT 
 key
from
tbl_1  where ds=20220312)
LATERAL view  ExpandData(1000,key) tmp as cnt,newKey
) b on a.newKey=b.newKey;

耗时20min左右得出结果,最终得到的结果大于一万亿。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-03-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Flink实战剖析 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
重磅:关于hive的join使用必须了解的事情
Hive支持连接表的以下语法: 本文主要讲hive的join 编写连接查询时要考虑的一些要点如下,不同版本支持的情况可能会有些许不同: 1,可以编写复杂的链接表达式,如下 SELECT a.* FR
Spark学习技巧
2018/03/20
7.4K0
重磅:关于hive的join使用必须了解的事情
HiveSQL中的JOIN ON条件,你理解对了吗?
HiveSQL很常用的一个操作就是关联(Join)。Hive为用户提供了多种JOIN类型,可以满足不同的使用场景。但是,对于不同JOIN类型的语义,或许有些人对此不太清晰。简单的问题,往往是细节问题,而这些问题恰恰也是重要的问题。本文将围绕不同的JOIN类型,介绍JOIN的语义,并对每种JOIN类型需要注意的问题进行剖析,希望本文对你有所帮助。
Spark学习技巧
2023/03/21
1.7K0
HiveSQL中的JOIN ON条件,你理解对了吗?
❤ 想知道大厂面试都问什么吗,附最强面试技巧!!(大数据开发岗)❤
蓝桥签约作者、大数据&Python领域优质创作者。维护多个大数据技术群,帮助大学生就业和初级程序员解决工作难题。
不吃西红柿
2022/07/29
6500
❤ 想知道大厂面试都问什么吗,附最强面试技巧!!(大数据开发岗)❤
数据倾斜解决方法总结
本文通过介绍数据倾斜以及数据倾斜解决方法,总结归纳了Hive、Spark、HBase等大数据处理框架在实际应用中出现的各种数据倾斜问题及其解决方法,为大数据处理框架的优化提供了方向。
谢慧志
2017/06/07
6.2K0
Hive Join方式与优化
Hive支持的Join方式有Inner Join和Outer Join,这和标准SQL一致。除此之外,还支持一种特殊的Join:Left Semi-Join。
十里桃花舞丶
2021/01/06
9720
Count-Distinct实践: 万亿级数据量任务优化方式
在默认情况下,相同的visit_type 的pv_id 会被分配到同一个reducer中处理,如果某个visit_type的数据量特别大,那么对应的reducer执行耗时会比较久或者可能会发生OOM,因此常规优化方式是:
Flink实战剖析
2022/04/18
9160
Count-Distinct实践: 万亿级数据量任务优化方式
hive regex insert join group cli
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/118336.html原文链接:https://javaforall.cn
全栈程序员站长
2022/07/13
8590
Hive 基础(2):库、表、字段、交互式查询的基本操作
1、命令行操作 (1)打印查询头,需要显示设置: set hive.cli.print.header=true; (2)加"--",其后的都被认为是注释,但 CLI 不解析注释。带有注释的文件只能通过这种方式执行: hive -f script_name (3)-e后跟带引号的hive指令或者查询,-S去掉多余的输出: hive -S -e "select * FROM mytable LIMIT 3" > /tmp/myquery (4)遍历所有分区的查询将产生一个巨大的MapRe
用户1177713
2018/02/24
3.5K0
[1218]hive之Map Join使用方法
MAPJION会把小表全部加载到内存中,在map阶段直接拿另外一个表的数据和内存中表数据做匹配,由于在map端是进行了join操作,省去了reduce运行的时间,算是hive中的一种优化。
周小董
2023/10/10
1.8K0
[1218]hive之Map Join使用方法
Hadoop Hive sql语法详解
Hive 是基于Hadoop 构建的一套数据仓库分析系统,它提供了丰富的SQL查询方式来分析存储在Hadoop 分布式文件系统中的数据,可以将结构
黄规速
2022/04/14
2.2K0
得物数据研发优化策略
在离线数据研发中,随着业务的快速发展以及业务复杂度的不断提高,数据量的不断增长,尤其得物这种业务的高速增长,必然带来数据逻辑复杂度的提升,数据量越大,复杂度越高,对任务的性能的要求就越高,因此,任务性能的优化就成了大家必然的话题,在离线数仓招聘中,这几乎成了必考题目。
得物技术
2023/06/01
5550
得物数据研发优化策略
Hive SQL优化思路
Hive的优化主要分为:配置优化、SQL语句优化、任务优化等方案。其中在开发过程中主要涉及到的可能是SQL优化这块。
五分钟学大数据
2021/12/27
2.1K0
数据科学|Hive SQL语法总结
Hive是一个数据仓库基础的应用工具,在Hadoop中用来处理结构化数据,它架构在Hadoop之上,通过SQL来对数据进行操作,了解SQL的人,学起来毫不费力。
陆勤_数据人网
2019/12/31
1.9K0
「干货」Hive常用10大应用技巧『Hive系列2』
阅读建议:本文总结Hive应用过程中的「实用技巧」及「需避开的坑」,偏知识总结类文章,欢迎「收藏」「分享」哦。
小火龙说数据
2022/06/30
1.8K0
「干货」Hive常用10大应用技巧『Hive系列2』
Hive简介
Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供类SQL查询功能。
用户1217611
2020/06/19
3.2K0
Hive简介
【大数据哔哔集20210117】Hive大表关联小表到底该怎么做
当一个大表和一个或多个小表做JOIN时,最好使用MAPJOIN,性能比普通的JOIN要快很多。另外,MAPJOIN 还能解决数据倾斜的问题。MAPJOIN的基本原理是:在小数据量情况下,SQL会将用户指定的小表全部加载到执行JOIN操作的程序的内存中,从而加快JOIN的执行速度。
大数据真好玩
2021/01/21
2.6K0
Hive Join优化
在阐述Hive Join具体的优化方法之前,首先看一下Hive Join的几个重要特点,在实际使用时也可以利用下列特点做相应优化:
大数据学习与分享
2020/07/31
2.2K0
【Hive】hive 数据倾斜、优化策略、hive执行过程、垃圾回收
group by和聚合函数(sum count max min)一起使用 group by和以上的聚合函数一起使用的时候会默认在map端执行一次combiner(局部聚合:减少reducetask的数据量,这个时候reduce端接受的数据就会大大减少 一般不会出现数据倾斜 select id,count(*) from course group by id;
从大数据到人工智能
2022/09/16
1.7K0
【Hive】hive 数据倾斜、优化策略、hive执行过程、垃圾回收
盘点6个SQL小技巧
但注意上图,里面还有几个Key is null的情况,它可以将两表相交的那部分数据排除掉! 也正是因为这个特性,一种很常见的SQL技巧是,用left join可替换not exists、not in等相关子查询,如下:
程序猿川子
2024/05/30
1280
【专题】spark/MR 数据倾斜优化
原理:在进行shuffle的时候,须将各个节点上相同的key拉取到某个节点上的一个task来进行处理,比如按照key进行聚合或join等操作。此时如果某个key对应的数据量特别大的话,就会发生数据倾斜。比如大部分key对应10条数据,但是个别key却对应了100万条数据,那么大部分task可能就只会分配到10条数据,然后1秒钟就运行完了;但是个别task可能分配到了100万数据,要运行一两个小时。因此,整个Spark作业的运行进度是由运行时间最长的那个task决定的。
艾利
2022/08/30
2.1K0
相关推荐
重磅:关于hive的join使用必须了解的事情
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验