zoukankan      html  css  js  c++  java
  • Flink实战(九十三):数据倾斜(二)keyby 窗口数据倾斜的优化

    在大数据处理领域,数据倾斜是一个非常常见的问题,今天我们就简单讲讲在flink中如何处理流式数据倾斜问题。

    我们先来看一个可能产生数据倾斜的sql.

    select TUMBLE_END(proc_time, INTERVAL '1' MINUTE) as winEnd,plat,count(*) as pv  from source_kafka_table 
    group by TUMBLE(proc_time, INTERVAL '1' MINUTE) ,plat

    在这个sql里,我们统计一个网站各个端的每分钟的pv,从kafka消费过来的数据首先会按照端进行分组,然后执行聚合函数count来进行pv的计算。如果某一个端产生的数据特别大,比如我们的微信小程序端产生数据远远大于其他app端的数据,那么把这些数据分组到某一个算子之后,由于这个算子的处理速度跟不上,就会产生数据倾斜。

    查看flink的ui,会看到如下的场景。

    对于这种简单的数据倾斜,我们可以通过对分组的key加上随机数,再次打散,分别计算打散后不同的分组的pv数,然后在最外层再包一层,把打散的数据再次聚合,这样就解决了数据倾斜的问题。

    优化后的sql如下:

    select winEnd,split_index(plat1,'_',0) as plat2,sum(pv) from (
    
      select TUMBLE_END(proc_time, INTERVAL '1' MINUTE) as winEnd,plat1,count(*) as pv from (
    
        -- 最内层,将分组的key,也就是plat加上一个随机数打散
        select plat || '_' || cast(cast(RAND()*100 as int) as string) as plat1 ,proc_time from source_kafka_table 
    
    ) group by TUMBLE(proc_time, INTERVAL '1' MINUTE), plat1
    
    ) group by winEnd,split_index(plat1,'_',0)

    在这个sql的最内层,将分组的key,也就是plat加上一个随机数打散,然后求打散后的各个分组(也就是sql中的plat1)的pv值,然后最外层,将各个打散的pv求和。

    注意:最内层的sql,给分组的key添加的随机数,范围不能太大,也不能太小,太大的话,分的组太多,增加checkpoint的压力,太小的话,起不到打散的作用。在我的测试中,一天大概十几亿的数据量,5个并行度,随机数的范围在100范围内,就可以正常处理了。

    修改后我们看到各个子任务的数据基本均匀了。

    本文来自博客园,作者:秋华,转载请注明原文链接:https://www.cnblogs.com/qiu-hua/p/14056780.html

  • 相关阅读:
    static变量的生命周期
    关于C++的new是否会对内存初始化的问题
    行列式的本质是什么?
    C++本质:类的赋值运算符=的重载,以及深拷贝和浅拷贝
    C++拷贝(复制)构造函数详解
    随机生成指定长度字符字符串(C语言实现)
    【npm】npm install的报错
    【HTTP】http请求url参数包含+号,被解析为空格
    【ngx-ueditor】百度编辑器按下Shift键不触发contentChange事件
    【Angular】No component factory found for ×××.
  • 原文地址:https://www.cnblogs.com/qiu-hua/p/14056780.html
Copyright © 2011-2022 走看看