Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Flink程序设计之道

Flink程序设计之道

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

01 - 前言

软件架构的复杂性通常并不是由功能性需求来决定,而是取决于非功能性需求,例如高性能、高可用、易扩展、易运维、低成本等要求,功能性需求通常是易于实现的,但是为了满足非功能性需求需要去做不同的技术方案选型对比、架构设计等,比喻说为了实现高性能,要去做缓存、分库分表、预计算、异步等方案,这些方案会提高系统的复杂程度。对于Flink程序开发同样会面临这些问题,在设计、实现之初除了需要考虑如何满足功能性需求外,还需要考虑性能、容错等非功能需求。本文将结合自己的实际开发经验从以下几个方面来介绍做一个实时Flink程序设计需要关注的一些问题:

适合性

当前的业务需求是否适合使用Flink去实现。

准确性

由Flink程序提供出去的数据是否正确。

延时

在流量高峰期或者是非高峰期,Flink任务是不是丝滑般处理,保证不延时。

容错能力

是否有一套完备的故障检测、恢复的能力,保证其可用性。

可维护性

在面对版本升级、程序升级时,是否可以方便的维护升级。

02 - 合适性

在做程序设计的时候经常会有一个误区,为了技术而技术,也就是一味的去追求技术的火热,某个技术很牛逼因而在项目中去使用它,比喻分析的数据量只有几万、几千级别,使用MySql 就可以轻松的处理,但是却为了追求Hadoop而去使用Hadoop做数据处理,很明显得不偿失。对于是否适合使用Flink去实现业务需求,从两个方面去考虑:业务、技术。

业务是否需要?对于数据业务开发来说,是需要通过数据技术手段解决业务问题或者是辅助业务决策,因此对于开发人员的要求就是需要熟悉业务,需要我们去辅助判断这个实时需求对于业务的增量情况,通常影响用户实时决策,例如实时效果指标、监控指标等,这个时候我们可以去考虑使用实时技术去解决。

技术是否合适?Flink在当下流计算很火热,并不是任何计算场景都使用Flink来完成,需要充分考虑其实现的成本,有没有更好的方案进行代替。

03 - 准确性

这里的准确性代表数据质量中数据准确性,也就是Flink程序提供出去的数据是否正确,保证我们交付出去的数据得到业务的认可。在不同的业务领域内对数据的正确性要求不一样,例如做实时监控,是允许存在数据丢失情况,但是在一些金融领域或者是跟钱相关统计计算的对数据正确性要求极高,应对不同的正确性要求会做出不同的设计,接下来列举几个常见会影响数据正确性的设计。

checkpoint, Flink checkpoint 是对状态数据周期性的全局快照,保证任务失败从快照恢复仍然能够保证数据的正确性。第一个考虑就是是否需要使用checkpoint, 如果可以忍受数据丢失,那么就没有必要开启checkpoint机制;第二个考虑是使用exactly-once语义还是at-least-once语义,这二者语义都是Flink内部数据的一种保证机制 , 使用at-least-once语义在任务重启的情况下,会存在重复状态计算,导致最终的数据结果有偏差。

事件时间语义,事件时间语义的支持处理是Flink区别于其他流式计算的重要特性,可以根据数据的时间执行相应的处理,比较常见的就是事件时间窗口,同时事件时间语义可以支持数据回放。如何决定可以触发一个事件时间操作(窗口计算), 在Flink中使用Watermark来衡量数据的处理进度,决定是否触发计算,但是这是一种理论情况,在实际中只能说是相对的减少数据丢失(可以监控numLateRecordsDropped指标),使用EventTime 语义并不能百分之百保证数据没有丢失,也就是计算指标可能会存在一定的误差。那么如何规避这种误差?常见的方式就是使用离线的语义去完成实时处理方式,以窗口计算为例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT user,
    TUMBLE_START(rowtime, INTERVAL '1' DAY) as wStart,  
    SUM(amount) FROM Orders 
  GROUP BY TUMBLE(rowtime, INTERVAL '1' DAY), user

可改写为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT user,userFunction(rowtime) as wStart,SUM(amount) 
  FROM Orders
    GROUP BY userFunction(rowtime), user

端到端一致性,这个是流式计算中比较难的一个话题,其涉及数据源端、Flink计算端、输出端,这三端的保证机制:数据源可回放、Flink checkpoint机制、输出端幂等或者事务的机制,通过这些机制保证数据的准确性。

除了上面提到的几点还与一些比较常见的技术实现相关,比喻使用BloomFilter、Hyperloglog 本身存在一定误差的数据结构等。

04 - 延时

延时大小代表了当前任务处理数据的进度,一般会通过监控消费Kafka的Lag或者是在数据源处数据时间与当前系统时间差值来判断任务是否延时,同时延时代表了Flink程序的处理数据的能力。如果程序的处理能力跟不上数据流量,最终的表现就是任务延时,得到的数据指标是滞后的,影响业务及时决策。因此我们在开发过程中需要考虑到可能会影响任务性能瓶颈的卡点,同时需要通过提前压测的方式,检测任务是否出现延时情况。简单列举几点常见影响性能的问题。

数据倾斜,大量的数据被分配给同一个task处理,也就是流量分配不均匀,常常出现在大商家流量统计或者是热门话题流量统计中,数据倾斜导致的直接问题就是出现"木桶效应",该task成为整个任务处理的性能瓶颈,最终触发反压,降低了消费速率。常出现在group by 、join 一些操作中,其优化手段与离线优化大体相同,预聚合、两阶段计算等方式。

大状态,flink 任务保留了大量的状态数据,例如全局group by 操作、regular-join 操作,这种保留数据时间比较长的计算,如果选用FsStateBackend那么可能会造成严重的gc问题,拖慢整个任务, 对于大状态一般会选用RocksDBStateBackend,使用rocksdb存储状态数据,即便如此可能会带来比较大的io消耗,最终导致io延时比较高,这时可以考虑:使用SSD作为存储、MiniBatch机制减少对状态的访问、或者是regular-join转变为interval-join等优化手段。

外部IO交互,常常发生维度扩充或者是结果数据输出需要与外部存储交互,这在个过程中出现与外部交互延时比较高通常是因为使用的姿势不正确或者是使用存储不合理,可以使用异步IO、LRU缓存机制、批量输出机制、使用写优化类型的存储等方式优化。

05 - 容错能力

在分布式系统中,可能会因为程序处理异常、网络故障、机器故障等原因导致系统失败,因此在设计之初会充分考虑其容错能力,也就是可用性。Flink本身设计了一套先进的容错能力,从故障检测到恢复,保证在各种不可预知的问题下可以自动恢复并且数据恢复到正确的状态。

故障检测分为两个方面:一、守护进程检测, JobManager、ResourceManager 、TaskManager 之间会通过心跳检测相互判断对方是否存活;二、task异常上报,某个task处理异常,TaskManager会将异常信息上报给JobManager。通过这两方面的检测最终触发恢复策略,任务恢复会依赖持久化的一致性状态数据,也就是会依赖checkpoint机制,保证失败重启可以从最近一次成功的checkpoint状态数据中恢复。

除了Flink程序本身容错机制的保证,在实际的开发中还需要考虑以下几点:

  • 缓存数据是否加入状态

通常为了减轻输出压力使用批量方式输出,那么批量缓存数据也需要加入到一致性状态中,保证失败恢复数据不会丢失

  • 双链路

双链通常应对保障等级比较高的任务,做计算、存储双链路保障机制,类似于同城双机房或者异地多活策略。

  • 平台层面支持

计算平台支持检测任务状态、自动拉起任务并从最近一次checkpoint中恢复。

06 - 可维护性

可维护性是指当面对Flink版本升级、修改程序bug、功能扩展等情况能够很方便的对程序做出修改。列举几种常见的处理手段:

  • 模块化处理,比较常见一点就是数仓里面分层、数据抽象化,将通用的部分提取出来单独处理
  • 尽量选择易懂的编程方式,对于分析类型程序来说,通俗易懂的就是sql, 使用sql化的方式完成程序开发
  • 编程质量保证,从表、字段、注释等制定开发规范
  • 当使用DataStream API时,给每一个算子设置一个唯一的uid, 当任务拓扑图发生改变时仍然能恢复对应的状态数据;当使用自定义状态时, 需要考虑并行度改变状态的伸缩变化以及使用的状态数据结构是否可支持变更与版本兼容性。

07 - 总结

本文主要从架构的视角去窥探如何比较全面考虑、设计一个Flink程序,包括适用性、数据质量、性能(延时)、容错能力、可维护性上的思考。

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

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

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
基于Flink的高可靠实时ETL系统
GIAC(GLOBAL INTERNET ARCHITECTURE CONFERENCE)是长期关注互联网技术与架构的高可用架构技术社区和msup推出的,面向架构师、技术负责人及高端技术从业人员的年度技术架构大会,是中国地区规模最大的技术会议之一。 今年的第六届GIAC大会上,在大数据架构专题,腾讯数据平台部实时计算负责人施晓罡发表了《基于Flink的高可靠实时ETL系统》的主题演讲。以下为嘉宾演讲实录: 施晓罡毕业于北京大学,获得博士学位,是Apache Flink项目Committer。在SIG
腾讯技术工程官方号
2020/09/01
1.5K0
Apache-Flink深度解析-概述
Apache Flink 的命脉 "命脉" 即生命与血脉,常喻极为重要的事物。系列的首篇,首篇的首段不聊Apache Flink的历史,不聊Apache Flink的架构,不聊Apache Flink的功能特性,我们用一句话聊聊什么是 Apache Flink 的命脉?我的答案是:Apache Flink 是以"批是流的特例"的认知进行系统设计的。
王知无-import_bigdata
2019/03/12
1.4K2
为什么要学 Flink,Flink 香在哪?
知道大数据的同学也应该知道 Flink 吧,最近在中国的热度比较高,在社区的推动下,Flink 技术栈在越来越多的公司开始得到应用。
数据社
2020/11/06
2K0
为什么要学 Flink,Flink 香在哪?
五万字 | Flink知识体系保姆级总结
一、Flink简介 二、Flink 部署及启动 三、Flink 运行架构 四、Flink 算子大全 五、流处理中的 Time 与 Window 六、Flink 状态管理 七、Flink 容错 八、Flink SQL 九、Flink CEP 十、Flink CDC 十一、基于 Flink 构建全场景实时数仓 十二、Flink 大厂面试题
五分钟学大数据
2021/09/22
4.6K0
《大数据时代“快刀”:Flink实时数据处理框架优势全解析》
在数字化浪潮中,数据呈爆发式增长,实时数据处理的重要性愈发凸显。从金融交易的实时风险监控,到电商平台的用户行为分析,各行业都急需能快速处理海量数据的工具。Flink作为一款开源的分布式流处理框架,在这一领域崭露头角,备受瞩目。
程序员阿伟
2025/02/02
1630
深入理解 Flink 容错机制
场景描述:作为分布式系统,尤其是对延迟敏感的实时计算引擎,Apache Flink 需要有强大的容错机制,以确保在出现机器故障或网络分区等不可预知的问题时可以快速自动恢复并依旧能产生准确的计算结果。
大数据真好玩
2019/10/15
2.2K0
Oceanus:基于Apache Flink的一站式实时计算平台
Flink Forward是由Apache官方授权,用于介绍Flink社区的最新动态、发展计划以及Flink相关的生产实践经验的会议。2018年12月20日,Flink Forward首次来到中国举办。腾讯TEG数据平台部参加了会议并在会上介绍了腾讯内部基于Flink打造的一站式实时计算平台Oceanus。 一、背景介绍 TEG实时计算团队作为腾讯内部最大的实时数据服务部门,为业务部门提供高效、稳定和易用的实时数据服务。其每秒接入的数据峰值达到了2.1亿条,每天接入的数据量达到了17万亿条,每天的数据增长
腾讯大数据
2019/01/30
2.1K1
Oceanus:基于Apache Flink的一站式实时计算平台
学习Flink,看这篇就够了
批处理在大数据世界有着悠久的历史。早期的大数据处理基本上是批处理的天下。批处理主要操作大容量的静态数据集,并在计算过程完成之后返回结果。所以批处理面对的数据集通常具有以下特征:
saintyyu
2021/11/22
3.2K1
学习Flink,看这篇就够了
Flink面试题持续更新【2023-07-21】
Flink和传统的Spark Streaming是两种流处理框架,它们在设计理念、功能特性和处理模型上存在一些区别。
火之高兴
2024/07/25
1090
Flink 状态管理和容错机制介绍
计算任务的结果不仅仅依赖于输入,还依赖于它的当前状态,其实大多数的计算都是有状态的计算。比如wordcount,给一些word,其计算它的count,这是一个很常见的业务场景。count做为输出,在计算的过程中要不断的把输入累加到count上去,那么count就是一个state。
smartsi
2019/08/07
7990
Flink 状态管理和容错机制介绍
Flink on TiDB —— 便捷可靠的实时数据业务支撑
本文由网易互娱计费数据中心实时业务负责人林佳老师分享,主要介绍网易数据中心在处理实时业务时为什么选择 Flink 和 TiDB,以及两者的结合应用情况。
PingCAP
2021/07/08
1.1K0
ApacheFlink深度解析-FaultTolerance
本系列文章来自云栖社区,对Flink的解析兼具广度和深度,适合对Flink有一定研究的同学学习。
王知无-import_bigdata
2019/03/19
7530
ApacheFlink深度解析-FaultTolerance
Flink端到端一致性
流式计算中,端到端表示从外部读取数据、中间处理、数据输出外部三个处理环节。在理想状态即7*24任务不出错或者异常情况下,也就是每一步处理都正常,那么就能保证最终处理输出的数据正确,但是在实际的情况中,可能会出现网络、磁盘、脏数据、OOM等各种异常导致程序失败,也就是端到端任何一个处理环节都有可能失败,为了保证最终数据的正确性,需要提供一种机制保障在面对任何情况的情况下,任务仍然恢复到正确的状态,也就是本篇要说的端到端的一致性。
Flink实战剖析
2022/04/18
1.2K0
Flink端到端一致性
Apache Flink 零基础入门(一):基础概念解析
Apache Flink 是一个分布式大数据处理引擎,可对有限数据流和无限数据流进行有状态或无状态的计算,能够部署在各种集群环境,对各种规模大小的数据进行快速计算。
Java帮帮
2019/11/14
1.1K0
Flink Exactly-Once 投递实现浅析
随着近来越来越多的业务迁移到 Flink 上,对 Flink 作业的准确性要求也随之进一步提高,其中最为关键的是如何在不同业务场景下保证 exactly-once 的投递语义。虽然不少实时系统(e.g. 实时计算/消息队列)都宣称支持 exactly-once,exactly-once 投递似乎是一个已被解决的问题,但是其实它们更多是针对内部模块之间的信息投递,比如 Kafka 生产(producer 到 Kafka broker)和消费(broker 到 consumer)的 exactly-once。而 Flink 作为实时计算引擎,在实际场景业务会涉及到很多不同组件,由于组件特性和定位的不同,Flink 并不是对所有组件都支持 exactly-once(见[1]),而且不同组件实现 exactly-once 的方法也有所差异,有些实现或许会带来副作用或者用法上的局限性,因此深入了解 Flink exactly-once 的实现机制对于设计稳定可靠的架构有十分重要的意义。
王知无-import_bigdata
2019/08/13
1.5K0
Flink及Storm、Spark主流流框架比较,到底谁会更胜一筹?
那么有spark和storm这样成熟的计算框架存在,为什么flink还能占有一席之地呢?今天我们就从流处理的角度将flink和这两个框架进行一些分析和比较。 随着大数据时代的来临,大数据产品层出不穷。
加米谷大数据
2020/05/18
4.2K0
Flink 极简教程: 架构及原理 Apache Flink® — Stateful Computations over Data Streams
Apache Flink 是一个分布式流计算引擎,用于在无边界和有边界数据流上进行有状态的计算。
一个会写诗的程序员
2022/01/04
3.4K0
Flink 极简教程: 架构及原理 Apache Flink® — Stateful Computations over Data Streams
Spark Streaming VS Flink
本文从编程模型、任务调度、时间机制、Kafka 动态分区的感知、容错及处理语义、背压等几个方面对比 Spark Stream 与 Flink,希望对有实时处理需求业务的企业端用户在框架选型有所启发。本文篇幅较长,建议先收藏~
美图数据技术团队
2018/08/22
1.8K0
Spark Streaming VS Flink
2024年最新Flink教程,从基础到就业,大家一起学习--基础篇
Apache Flink是一个框架和分布式处理引擎,用于对无界和有界数据流进行有状态计算。
小白的大数据之旅
2024/11/20
2360
2024年最新Flink教程,从基础到就业,大家一起学习--基础篇
Flink在美团的应用与实践听课笔记
原始视频视频资源已经在优酷公开:2018.8.11 Flink China Meetup·北京站-Flink在美团的应用与实践
Java架构师必看
2020/04/22
5130
相关推荐
基于Flink的高可靠实时ETL系统
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验