首页 > 其他分享 >flink上下游并行度不一致导致的数据乱序问题

flink上下游并行度不一致导致的数据乱序问题

时间:2024-08-19 23:37:57浏览次数:8  
标签:12 19 分区 flink 并行度 算子 数据 乱序

问题描述

SingleOutputStreamOperator<Row> aggregatedStream = patrolStream
                .union(timerGarbageStream)
                .filter(v -> v.getFacility() != null && (v.getFacility().getType() == 11 || v.getFacility().getType() == 48))
                .setParallelism(12)
                .map(x -> (PatrolRecord) x)
                .setParallelism(12)
                .filter(x -> x.getInOutState() != 2)
                .setParallelism(12)
                .keyBy(v -> (Integer) v.getFacility().getId())
                .window(TumblingEventTimeWindows.of(Time.seconds(86400), Time.seconds(-Constants.offsetSeconds)))
                .allowedLateness(Constants.allowedLateness)
                .trigger(CountAndEventTimeTrigger.of(1L))
                .aggregate(new GarbageReduceFunction(), new GarbageProcessWindowFunction())
                .setParallelism(12)
                .returns(rowTypeInfo);

image
算子A(红色)往侧流中写入数据:

{"s":"2024-08-19 07:16:36","e":"2024-08-19 07:19:36","w":350000,"inferred":false,"rk":"DELETE","f_id":549737,"f_type":11,"inOutState":0,"loadCount":19}
{"s":"2024-08-19 07:16:36","e":"2024-08-19 07:19:36","w":318181,"inferred":false,"rk":"INSERT","f_id":549737,"f_type":11,"inOutState":0,"loadCount":19}

e是事件时间,相同的key、相同的事件时间,写入程序一定是先写入RowKind为DELETE的数据,后写入RowKind为INSERT的数据。

下游算子C(右下角)从侧流中消费数据,并写入DB。
问题在于,消费到的数据,部分数据的顺序乱了,先消费到RowKind为INSERT的数据,后消费到RowKind为DELETE的数据。

问题分析

算子A(红色)的并行度是16
算子B(中间的filter)并行度是12
算子C(右下角)并行度是12

从A到B,进行了rebalance

rebalance 是一个数据重分布(redistribution)操作,它将上游算子的输出数据重新分配到下游的并行子任务中。rebalance 通过循环(round-robin)的方式将数据均匀地分配到所有下游任务槽(task slot)上,从而实现负载均衡。

也就是说,这一步一定存在打乱顺序的可能性。可能出现的结果:

key1、eventTime1、DELETE => 子任务1
key1、eventTime1、INSERT => 子任务2

本来连续的两行数据,被路由到两个不同的算子。

接下来从算子B到算子C,执行的是HASH分区:

hash 是一种分区策略,用于将数据根据其 key 的哈希值分配到不同的并行任务槽(task slot)上。这种分区方式可以确保相同的 key 始终被分配到同一个任务槽中,从而实现数据的分组操作。

此时,尽管key1一定会被路由到同一个子任务上,但是顺序已经无法保证了。

接下来把所有算子并行度都修改为12,看下效果

image

这时候从A到B,执行的是forward分区策略。

forward 是一种分区策略,用于将数据从上游算子直接传递到下游算子的对应并行实例中,而不进行任何重新分区或重新分配。也就是说,forward 保证了数据会直接从上游的一个并行子任务传递到下游的同一个并行子任务。

接下来再执行HASH分区,因此呢,同一个KEY的数据的相对顺序并没有改变。

结论

虽然验证结果还没出来,但是大概率这就是答案了。

标签:12,19,分区,flink,并行度,算子,数据,乱序
From: https://www.cnblogs.com/xushengbin/p/18368362

相关文章

  • 易优flink 友情链接-EyouCms手册
    【基础用法】名称:flink功能:用于获取友情链接列表。语法:{eyou:flinktype='text'row='30'titlelen='15'}{$field.title}{/eyou:flink}参数:type=''链接类型,text为文字链接,image为图片链接,all为全部链接row='30'链接类型数量titlelen='100'标题长度......
  • flink车联网项目:业务实现2(维表开发)(第68天)
    系列文章目录3.2维表开发3.2.1创建库3.2.2示例3.2.2.1类型转换3.2.2.2创建mysql映射表3.2.2.3创建paimon映射表3.2.2.4从mysql插入到paimon表3.2.2.5结果查看3.2.2.6测试3.2.3其他表开发3.2.4部署文章目录系列文章目录前言3.2维表开发3.2.1创建......
  • flink + iceberg 快速搭建指南
    flink+iceberg快速搭建theenvironmentincludes:minioicebergflinkCentos更换tencent的yum源备份系统旧配置文件mv/etc/yum.repos.d/CentOS-Base.repo/etc/yum.repos.d/CentOS-Base.repo.backup获取对应版本的CentOS-Base.repo到/etc/yum.repos.d/目录各版......
  • Kettle PDI小白新手/进阶/必备 大数据基础之一数据清洗(ETL)基础进阶总结 1.6万字长文
    Kettle是一个开源的数据集成工具,主要用于ETL(抽取、转换、加载)过程。它的全名是PentahoDataIntegration(PDI),而Kettle是其早期的名字,Kettle在2006年被Pentaho收购后,正式更名为PentahoDataIntegration(PDI),因此现在更常被称为PDI。PDI仍然是Pentaho产品套件中的一个重要......
  • flink车联网项目前篇:数据开发(第66天)
    系列文章目录03_数据仓库开发开发规范1.1数据库划分规范1.2表命名规范1.3表字段类型规范开发前准备3.1业务系统表3.2数据导入04_维度主题相关表结构1.1dim_area-城市字典表1.2dim_car_info-车辆信息表1.3dim_car_vendor-车队信息表1.4dim_date_w......
  • 易优Flink友情链接-Eyoucms标签手册
    【基础用法】名称:flink功能:用于获取友情链接列表。语法:{eyou:flinktype='text'row='30'titlelen='15'}<ahref='{$field.url}'>{$field.title}</a>{/eyou:flink}参数:type=''链接类型,text为文字链接,image为图片链接,all为全部链接row=&......
  • 代表性大数据技术:Hadoop、Spark与Flink的框架演进
    MapReduce编程模型的提出为大数据分析和处理开创了一条先河,之后陆续涌现出了Hadoop、Spark和Flink等大数据框架。Hadoop2004年,Hadoop的创始人受MapReduce编程模型等一系列论文的启发,对论文中提及的思想进行了编程实现。Hadoop的名字来源于创始人DougCutting儿子的玩具大......
  • flink-cdc实时同步(oracle to mysql)
    FlinkCDC于2021年11月15日发布了最新版本2.1,该版本通过引入内置Debezium组件,增加了对Oracle的支持。Flink下载地址https://flink.apache.org/downloads/其他必需的jar包(cdc、jdbc、mysq和oracle等驱动包) 下载Flink后,直接解压到指定目录下即可;tarzxvf flink-......
  • Flink1.19 JobSubmitHandler源码解析
    文章目录概要整体架构流程概要JobGraph在客户端生成后,需要发送到服务端,首先会被JobSubmitHandler(WebMonitor内处理http请求的处理类)接收处理,然后会发送到Dispatcher进一步处理整体架构流程首先会进入JobSubmitHandler对象的handleRequest方法有两个参数:request:封......
  • 混合处理框架:Flink
    ApacheFlink是一个开源的流处理框架,用于实现有状态的计算。它能够同时支持批处理和流处理,并且可以无缝地在两者之间切换。Flink的设计目标是提供低延迟、高吞吐量和强大的状态管理能力。以下是Flink的一些关键特性:1.**事件驱动**:Flink是基于事件的流处理引擎,能够实......