首页 > 其他分享 >Flink实战之Flink乱序场景汇总

Flink实战之Flink乱序场景汇总

时间:2024-03-19 22:59:45浏览次数:32  
标签:场景 处理 分区 Flink 汇总 数据 乱序

目录

一 数据乱序场景

1 数据源乱序

2 ETL造成乱序

二 Flink处理乱序数据方案

1 Watermark 和 Event Time 模式

2 提前创建保序任务

3 使用事务性 Sink保证下游数据时序

三 结语


       在数据处理领域,无论离线批处理领域还是实时流处理领域,数据时序性对于最终数据的准确性有着比较大的影响,因此乱序场景处理就显得很必要。在离线处理领域,典型的乱序数据会造成迟到的事实和迟到的维度场景发生,只不过相比于实时数据处理场景来说,离线数据对于乱序的忍耐性要明显高出很多。在实时处理领域,数据时序性的保证重要性进一步提升,乱序数据不仅对于ETL逻辑有着较大的影响,同时乱序数据还可能造成数据不一致、数据延迟以及数据丢失场景发生,进而影响数据可信度乃至可用性。由于乱序数据在数据处理领域影响深远,那么处理乱序数据就成为不可逃避的现实。乱序数据产生场景多种多样,对于不同乱序情况的处理手段也不尽相同,但总归一点,想要更好的处理乱序数据,我们要更清晰的认识乱序数据产生的情况。在本文中,笔者将结合个人工作经验对乱序场景及解决方案尝试进行归纳总结,目标站在更高的角度来审视数据时序性及衍生的解决方案,以便更好的服务业务,提升数据价值。

一 数据乱序场景

        数据乱序根据产生端不同可以分为”源端乱序“和”ETL乱序“两种情况。

1 数据源乱序

  • 日志端乱序

    日志端数据乱序是指在日志记录系统过程中,日志消息的顺序与其发生的实际顺序不一致的情况。造成日志乱序的原因可以是多方面的,主要包括:并发问题、异步处理、分布式系统、程序bug、写入异常、网络故障、缓冲区溢出、服务器故障等多种原因。由此可知,日志端数据乱序是无法完全避免的,同时也是数据处理必须面对的问题。

    日志记录包含数据发生时间戳,消费端通过适度等待根据时间戳可以处理乱序数据。

  • Kafka乱序

    为了保证发送kafka topic数据有序,一般情况我们会根据数据key将相同key的消息发送到不同分区,这在正常情况下可以保证kafka topic内数据有序性,但特殊情况下可能导致数据乱序。

    • 生产端发送数据没有按key分区(比如生产端发送数据按照hash规则分配数据),造成kafka数据乱序;

    • 当生产端是异步发送时,此时有消息发送失败,造成kafka数据乱序;

    • 当 Broker 宕机出现问题,此时生产端有可能会把顺序消息发送到不同的分区,这时会发生短暂消息顺序不一致的现象。

    • kafka topic分区变更,增加分区或者减少分区后生产端发送数据到下游的hash规则改变,导致相同key数据前后不能发往同一个分区。

    • kafka topic分区单副本,当副本宕机,发送端发送消息失败,经过尝试过后还未及时恢复,生产端会将剩余消息路由到其他分区。

2 ETL造成乱序

        除了数据源本身乱序,对于一些特定的ETL动作也会对下游产生乱序数据,这种属于技术本身问题,无技术解决方案。

  • Join乱序

    Flink SQL Join 左右流 一对多关系,右流使用的是 NoUniqueKey,NoUniqueKey 使用的是 MapState,而 MapState 无法保证数据顺序,所以查询这类结果会有乱序的情况。

  • 聚合乱序

    Flink SQL 中如果存在多次 Keyby 并且 Key 字段不一致也会导致乱序问题。

  • 异步操作

    在 Flink 中执行异步操作可能导致数据乱序。例如,在异步 I/O 操作中,处理元素的顺序可能与它们被发送到 Sink 的顺序不一致。

二 Flink处理乱序数据方案

        乱序数据无法避免,那么合理设置处理数据逻辑就成了必要方案,基于Flink来说,常规用来解决数据乱序的方案有以下几种情况。

1 Watermark 和 Event Time 模式

        在 Flink 中,合理设计Watermark规则,根据数据的事件时间戳推进水位线,使得系统能够正确处理乱序数据。同时可以考虑设置允许延时最大间隔和侧输出流能力进一步处理乱序数据。

2 提前创建保序任务

        

对于乱序数据,可以在处理之前对数据进行重排,使得数据按照事件时间顺序排列(最好的保序任务利用下游OLAP引擎的更新能力对迟到数据进行动态更新,只有这样才能保证数据的时效性和最终一致性)。针对FlinkSQL任务可以根据row_number创建保序任务,保证发送下游数据的顺序性,对于出现的已经发送下游数据,回撤之前数据,发送新数据替换。在后续处理中,考虑回撤对业务逻辑影响。

FlinkSQL保序任务:

set table.exec.state.ttl = 3600;
select 
    t.* 
from (
    select 
        t.*,
        row_number()over(partition by order_id order by create_time asc) as rn 
    from tbl_order t
    where t.status = 1 
) t 
where t.rn = 1 
;

3 使用事务性 Sink保证下游数据时序

        对于 Sink 操作,可以选择使用支持事务性写入的 Sink,例如 Flink 提供的 Kafka 事务性 Sink 或者 Flink 提供的 TwoPhaseCommitSinkFunction,以确保数据写入的原子性和顺序性。

三 结语

        在数据处理领域面临乱序数据带来的ETL挑战是不可避免的,充分理解乱序发生场景才能更好的处理乱序数据。对于有哪些场景需要补充,读者可以留言或加微信,保证及时更新文档。

标签:场景,处理,分区,Flink,汇总,数据,乱序
From: https://blog.csdn.net/wen811651208/article/details/136825651

相关文章

  • Flink 自定义 ClickHouse Table Connector 的简单实现
    本次实现基于Flink1.18版本,具体的对象之间的关系可以先参考官网的图:先拿官网上的Socket示例来说一下实现过程:首先编写SocketDynamicTableFactory实现DynamicTableSourceFactory接口。在SocketDynamicTableFactory中会返回SocketDynamicTableSource,同时返回实现......
  • Excel/WPS超级处理器,合并单元格汇总3种方式
    在处理职场数据表格,会遇到在合并单元格中汇总求和,计算平均值或统计个数。如何快速被统计汇总呢?接下来,我们就使用超级处理器中的合并单元格汇总菜单来完成这些,鼠标点选即可。超级处理器下载与安装1)合并单元格汇总-求和2)合并单元格汇总-求平均3)合并单元格汇总-计数想......
  • 特新介绍 | MySQL生态现有计算下推方案汇总
    作者:卢文双资深数据库内核研发本文首发于2024-03-0620:52:24https://dbkernel.com前言计算下推是数据库优化器优化查询性能的一种常见手段,早期的数据库系统提及的计算下推一般是指谓词下推,其理论源自关系代数理论。2000年以后,随着OracleRAC的盛行以及一众开源分布式......
  • leedcode-汇总区间
    自己写的:classSolution:defsummaryRanges(self,nums):my_li=[]#创建一个空列表用于存储结果ifnotnums:#如果输入列表为空returnmy_li#返回空列表iflen(nums)==1:#如果输入列表只有一个元素my......
  • python疑难杂症(9)---python的数据类型字典(dict)的创建、访问、修改、删除等方法汇总
    在Python中,字典(Dictionary)是一种内置的数据烈性,是无序的数据结构,用于存储键值对(key-value)。字典中的每个元素由一个键(key)和一个对应的值(value)组成,键和值之间使用冒号(:)进行分隔,每个键值对之间使用逗号(,)进行分隔。字典中的键必须是唯一的,而值可以是任意类型的对象,字典可以用来存......
  • Linux 运维工程师面试真题-5-常考题目汇总
    Linux运维工程师面试真题-5-常考题目汇总1.解释下什么是GPL,GNU,自由软件?GPL:(通用公共许可证):一种授权,任何人有权取得、修改、重新发布自由软件的权力。GNU:(革奴计划):目标是创建一套完全自由、开放的的操作系统。自由软件:是一种可以不受限制地自由使用、复制、研究、修改和分......
  • 软件项目管理资料汇总(规格说明书、详细设计、测试计划、验收报告)
      前言:在软件开发过程中,文档资料是非常关键的一部分,它们帮助团队成员理解项目需求、设计、实施、测试、验收等各个环节,确保项目的顺利进行。以下是针对您提到的各个阶段的文档资料概述:所有资料获取:点击获取开发阶段需求规格说明书:详细描述了软件系统的功能需求、非功......
  • pytorch CV入门 - 汇总
    初次编辑:2024/2/14;最后编辑:2024/3/9参考网站-微软教程:https://learn.microsoft.com/en-us/training/modules/intro-computer-vision-pytorch更多的内容可以参考本作者其他专栏:Pytorch基础:https://blog.csdn.net/qq_33345365/category_12591348.htmlPytorchNLP基础:https......
  • Pytorch基础-汇总
    本教程翻译自微软教程:https://learn.microsoft.com/en-us/training/paths/pytorch-fundamentals/初次编辑:2024/3/1;最后编辑:2024/3/4本教程包含以下内容:介绍pytorch基础和张量操作介绍数据集介绍归一化介绍构建模型层的基本操作介绍自动微分相关知识介绍优化循环(optimiz......
  • 【Flink】Flink 使用 JobListener 监听 任务状态
    1.概述flink程序运行起来,需要获取flink的任务状态,我们有几种方式获取。使用yarn命令或者,查看任务状态使用flink指标监控查看flink任务状态使用JobListener监听任务状态下面我们来主要介绍如何使用JobListener监听任务状态。2.使用JobListener的使用很简单,我们只需......