1.flink����Դ��
2.Flink常见面试问题(原理)
3.10-flink TaskManager å Slots
4.Flink深入浅出:JDBC Connector源码分析
5.Flink是并并行什么意思?
6.Flink入门-定义、架构和原理
flink����Դ��
Apache Flink是行源一个处理框架,专为实时和离线数据流的并并行复杂状态计算设计,旨在提供低延迟、行源高吞吐量、并并行准确性和容错性的行源uery源码价格处理能力。
批处理作为其特殊类型,并并行Flink旨在通过并行处理和分布式架构来优化性能。行源
快速上手Flink,并并行可选择在Standalone模式部署,行源通过slot(资源分配的并并行基本单位)来分配资源,或者在生产环境中利用YARN(容器化资源管理)和Hadoop。行源session-cluster模式适用于小规模短时作业,并并行而per-job-cluster模式则适合大型长期作业,行源甚至在Kubernetes上运行,并并行以简化运维。
Flink的运行架构包括客户端提交任务,通过HDFS和YARN进行资源管理。任务首先由JobManager调度至TaskManager,TaskManager之间通过流式通信。客户端负责数据流的准备和提交,而JobManager和TaskManager作为独立的JVM进程运行。
Flink的流处理API基于数据流的链式结构,包括数据源、转换和sink。算子的并行度决定了子任务的数量。对于数据处理,Flink支持多种数据源,如Kafka、Redis、Elasticsearch和自定义JDBC sink。窗口功能将无限流分割为有限流,游侠股市 源码便于分析。
EventTime和Watermark机制在处理乱序数据时至关重要,通过设置Watermark的延迟,Flink确保数据的准确处理和迟到数据的处理。ProcessFunction API允许开发者访问时间戳、Watermark,以及创建自定义事件驱动应用和业务逻辑。
Flink的核心容错机制是一致性检查点,通过保存任务处理状态实现故障恢复。除了检查点,用户还可以利用保存点进行备份、更新或迁移应用。状态一致性保证了流处理结果的准确性,而端到端的数据保证则确保了整个处理过程的可靠性。
Flink常见面试问题(原理)
Flink面试中常见的问题概述
Flink任务提交流程涉及以下几个步骤:当部署在YARN上时,首先由Client将Flink的Jar包和配置上传到HDFS,接着向YARN的ResourceManager提交任务。
ResourceManager分配Container资源后,会通知NodeManager启动ApplicationMaster。ApplicationMaster负责启动JobManager,加载和配置后,它会申请资源启动TaskManager。
TaskManager在NodeManager的指导下启动,向JobManager发送心跳并等待任务分配。
Flink的执行图包括四个阶段:StreamGraph、JobGraph、ExecutionGraph和物理执行图。StreamGraph表示代码的拓扑结构,JobGraph是经过优化的并行版本,而ExecutionGraph是根据并行度进行规划的核心结构,最后的python软件源码物理执行图将任务分配给实际的TaskSlot运行。 关于slot和任务的关系,一个任务所需的slot数量取决于并行度最大的算子,而并行度和slot数量是两个不同的概念:并行度是动态配置的,而slot数量是TaskManager的静态配置。 Flink通过任务链(Operator Chains)技术优化算子间的连接,减少序列化/反序列化等开销,提高性能。 Flink的SQL部分依赖Apache Calcite进行校验、解析和优化,SQL解析过程涉及复杂步骤。 在数据抽象和交换方面,Flink通过MemorySegment和相关的数据转换类来管理内存,避免JVM的性能瓶颈。-flink TaskManager å Slots
æèé®é¢:
1.æä¹æ ·å®ç°å¹¶è¡è®¡ç®ï¼
çï¼è®¾ç½®å¹¶è¡åº¦ãå¤çº¿ç¨ï¼ä¸åä»»å¡æ¾å°ä¸å线ç¨ä¸ã
2.并è¡çä»»å¡ï¼éè¦å ç¨å¤å°slotï¼
3.ä¸ä¸ªæµå¤çç¨åºï¼å°åºå å«å¤å°ä¸ªä»»å¡ï¼
ä¸ãTaskManageråSlotçå ³ç³»ä»ç»
processï¼è¿ç¨
Treadsï¼çº¿ç¨
äºã并è¡åº¦ï¼parallelismï¼
æ¯ä¸ä¸ªçº¿ç¨å ç¨ä¸ä¸ªslotï¼ä¸å¾ä¸ä¸ä»»å¡å并为ä¸å¾äºæ示ï¼ä»»å¡é¾ï¼åç»è®²è§£ï¼ï¼å¾ä¸ç®å并è¡åº¦æ大çï¼ç®ååé¢çä¸æ¬å·æ°å代表并è¡åº¦ï¼ä¸º2ï¼æ以æ´ä¸ªflinkç¨åºç并è¡åº¦ä¸º2ï¼æ以åªéè¦2个slotå°±å¯ä»¥è·èµ·æ¥ã
One-to-oneï¼
stream(æ¯å¦å¨sourceåmap operatorä¹é´)ç»´æ¤çååºä»¥åå ç´ ç顺åºãé£æå³çflatmap ç®åçåä»»å¡çå°çå ç´ ç个æ°ä»¥å顺åºè·source ç®åçåä»»å¡ç产çå ç´ ç个æ°ã顺åºç¸åï¼mapãfliterãflatMapçç®åé½æ¯one-to-oneç对åºå ³ç³»ã类似äºsparkä¸ççªä¾èµ
Redistributingï¼
stream(map()è·keyBy/windowä¹é´æè keyBy/windowè·sinkä¹é´)çååºä¼åçæ¹åãæ¯ä¸ä¸ªç®åçåä»»å¡ä¾æ®æéæ©çtransformationåéæ°æ®å°ä¸åçç®æ ä»»å¡ãä¾å¦ï¼keyBy()åºäºhashCodeéååºãbroadcastårebalanceä¼éæºéæ°ååºï¼è¿äºç®åé½ä¼å¼èµ·redistributeè¿ç¨ï¼èredistributeè¿ç¨å°±ç±»ä¼¼äºSparkä¸çshuffleè¿ç¨ã类似äºsparkä¸ç宽ä¾èµ
å¾ä¸ï¼A4 代表 Aä»»å¡æ4个ï¼C2表示Cä»»å¡2个ï¼ä»¥æ¤ç±»æ¨
taskmanager.numberOfTaskSlots:3 æ¯ä¸ªtaskmanager设置äºå¹¶è¡åº¦ä¸º3
设ä¸å ±æ3个TaskManagerï¼æ¯ä¸ä¸ªTaskManagerä¸çåé 3个TaskSlotï¼ä¹å°±æ¯æ¯ä¸ªTaskManagerå¯ä»¥æ¥æ¶3个taskï¼ä¸å ±9个TaskSlotï¼å¦ææ们设置parallelism.default=1ï¼å³è¿è¡ç¨åºé»è®¤ç并è¡åº¦ä¸º1ï¼9个TaskSlotåªç¨äº1个ï¼æ8个空é²ï¼å æ¤ï¼è®¾ç½®åéç并è¡åº¦æè½æé«æçã
ä¸ãæè
å设å½åå¯ç¨çslotåªæ1个ï¼ä»»å¡æ4个ï¼slotä¸å¤ç¨çæ¶åï¼åä¼ä¸ç´çå¾ åé èµæºï¼ç´å°è¶ æ¶æ¥éã
slotæ¨è设置为å½åæºå¨çæ ¸å¿æ°ï¼å设cpuæ ¸å¿æ°ä¸º4æ ¸ï¼å设置4ã
slotå ç¨æ°éä¸å¹¶è¡åº¦æ大çç®åä¸è´ã
Flink深入浅出:JDBC Connector源码分析
大数据开发中,数据分析与报表制作是日常工作中最常遇到的任务。通常,我们通过读取Hive数据来进行计算,并将结果保存到数据库中,然后通过前端读取数据库来进行报表展示。然而,使用FlinkSQL可以简化这一过程,通过一个SQL语句即可完成整个ETL流程。
在Flink中,读取Hive数据并将数据写入数据库是常见的需求。本文将重点讲解数据如何写入数据库的过程,包括刷写数据库的机制和原理。
以下是本文将讲解的几个部分,以解答在使用过程中可能产生的疑问:
1. 表的定义
2. 定义的表如何找到具体的实现类(如何自定义第三方sink)
3. 写入数据的机制原理
(本篇基于1..0源码整理而成)
1. 表的定义
Flink官网提供了SQL中定义表的示例,以下以oracle为例:
定义好这样的表后,就可以使用insert into student执行插入操作了。接下来,stl string 源码我们将探讨其中的技术细节。
2. 如何找到实现类
实际上,这一过程涉及到之前分享过的SPI(服务提供者接口),即DriverManager去寻找Driver的过程。在Flink SQL执行时,会通过translate方法将SQL语句转换为对应的Operation,例如insert into xxx中的xxx会转换为CatalogSinkModifyOperation。这个操作会获取表的信息,从而得到Table对象。如果这个Table对象是CatalogTable,则会进入TableFactoryService.find()方法找到对应的实现类。
寻找实现类的过程就是SPI的过程。即通过查找路径下所有TableFactory.class的实现类,加载到内存中。这个SPI的定义位于resources下面的META-INFO下,定义接口以及实现类。
加载到内存后,首先判断是否是TableFactory的实现类,然后检查必要的参数是否满足(如果不满足会抛出异常,很多人在第一次使用Flink SQL注册表时,都会遇到NoMatchingTableFactoryException异常,其实都是因为配置的属性不全或者Jar报不满足找不到对应的TableFactory实现类造成的)。
找到对应的实现类后,调用对应的createTableSink方法就能创建具体的实现类了。
3. 工厂模式+创建者模式,创建TableSink
JDBCTableSourceSinkFactory是JDBC表的具体实现工厂,它实现了stream的sinkfactory。在1..0版本中,它不能在batch模式下使用,但在1.版本中据说会支持。这个类使用了经典的智能导诊 源码工厂模式,其中createStreamTableSink负责创建真正的Table,基于创建者模式构建JDBCUpsertTableSink。
创建出TableSink之后,就可以使用Flink API,基于DataStream创建一个Sink,并配置对应的并行度。
4. 消费数据写入数据库
在消费数据的过程中,底层基于PreparedStatement进行批量提交。需要注意的是提交的时机和机制。
控制刷写触发的最大数量 'connector.write.flush.max-rows' = ''
控制定时刷写的时间 'connector.write.flush.interval' = '2s'
这两个条件先到先触发,这两个参数都是可以通过with()属性配置的。
JDBCUpsertFunction很简单,主要的工作是包装对应的Format,执行它的open和invoke方法。其中open负责开启连接,invoke方法负责消费每条数据提交。
接下来,我们来看看关键的format.open()方法:
接下来就是消费数据,执行提交了
AppendWriter很简单,只是对PreparedStatement的封装而已
5. 总结
通过研究代码,我们应该了解了以下关键问题:
1. JDBC Sink执行的机制,比如依赖哪些包?(flink-jdbc.jar,这个包提供了JDBCTableSinkFactory的实现)
2. 如何找到对应的实现?基于SPI服务发现,扫描接口实现类,通过属性过滤,最终确定对应的实现类。
3. 底层如何提交记录?目前只支持append模式,底层基于PreparedStatement的addbatch+executeBatch批量提交
4. 数据写入数据库的时机和机制?一方面定时任务定时刷新,另一方面数量超过限制也会触发刷新。
更多Flink内容参考:
Flink是什么意思?
Flink,全称为Apache Flink,是一个开源的流处理框架,由Apache软件基金会开发,特别强调高吞吐量、低延迟和容错处理。核心是基于Java和Scala的分布式流数据引擎,它采用数据并行和流水线方式执行流数据程序,同时支持批处理和迭代算法。Flink的特点在于其容错能力,即使在机器故障时也能保证exactly-once的语义,即数据处理的精确性。
Flink的数据流引擎支持事件时间处理和状态管理,其应用程序能够处理无限数据集,程序可以使用Java、Scala、Python和SQL等多种编程语言编写。它并不内置数据存储系统,而是与Amazon Kinesis、Apache Kafka、HDFS等外部存储系统无缝集成,提供了数据源和接收器的连接。
Flink编程模型基于流和转换,将数据流视为可能无限的记录流,通过一系列操作如过滤、聚合和窗口函数进行处理。它有两种核心API,包括数据流API处理无界和有界数据,以及数据集API处理有界数据集。Flink还提供表API和SQL语言,让关系流和批处理变得更加直观和易用。
Flink的分布式执行模型将程序映射成数据流图,允许分支和合并数据流,内置的连接器支持多种数据源和接收器,如Kafka和HDFS。Flink程序能够作为分布式系统在集群中运行,也能独立部署或借助YARN、Mesos等资源管理框架。
Flink的容错机制以分布式检查点为核心,自动保存应用状态和数据流位置,确保故障恢复时的一致性。此外,还提供了手动触发的保存点机制,允许在不影响状态的情况下更新程序或集群。对于有状态的流处理,如5秒窗口内的字数计数,Flink的数据流API提供了相应的函数支持。
总的来说,Apache Flink是一个强大且灵活的流处理框架,适用于多种场景,包括实时和批量数据处理,以及状态管理和容错处理。
Flink入门-定义、架构和原理
Flink是一个开源的大数据框架,主要用于在无界和有界流数据上执行有状态计算。其适用于实时性要求高的应用,如预警、实时数量统计、数据库交互、跟踪和基于数据流的机器学习场景。
流数据处理的原理涉及延迟、吞吐量和数据流模型。事件时间表示数据产生时的原设备时间戳,处理时间则表示流处理程序处理数据时的时间戳。数据流图描述了流数据在不同算子之间流转的过程,数据分配策略包括转发、基于Key、随机和广播策略。
流处理操作包含流数据源、转换和输出。窗口操作接收并缓冲数据后触发计算,分为滚动、滑动和会话窗口。滚动窗口按固定大小拆分数据,滑动窗口有交叉,会话窗口根据时间间隔划分窗口。
在流处理应用中,Flink能够实现低延迟和高吞吐能力的平衡,通过分布式并行计算。其数据流模型提供基于事件时间、水位线和延迟处理的机制,实现窗口聚合计算,以确保计算的正确性、高吞吐和延迟之间的平衡。
Flinkä¹å·¥ä½åç
Flinkä½ä¸ºæ°çstream计ç®å¼æï¼è¿ä¸¤å¹´ç¤¾åºçæ´»è·åº¦å¾é«ã对äºFlink æ¢å¯ä»¥å¤çstream dataä¹å¯ä»¥å¤çbatch data,åæ¶å¯ä»¥å ¼é¡¾Spark以åSparkstreamingçåè½ï¼ä¸Sparkä¸åçæ¯ï¼Flinkæ¬è´¨ä¸åªæstreamçæ¦å¿µï¼batch被认为æ¯special streamãFlink主è¦æ以ä¸å 个è§è²éè¦å¤§å®¶äºè§£ï¼å¯¹äºFlinkçå¼åæ¯å¾æ帮å©çãä¹ä¾¿äºèªå·±åæç¿»é ã
JobClient:
è´è´£æ¥æ¶ç¨åºï¼è§£æåä¼åç¨åºçæ§è¡è®¡åï¼ç¶åæ交æ§è¡è®¡åå°JobManagerãè¿éæ§è¡çç¨åºä¼åæ¯å°ç¸é»çOperatorèåï¼å½¢æOperatorChainï¼Operatorçèåå¯ä»¥åå°taskçæ°éï¼æé«TaskManagerçèµæºå©ç¨çã
JobManagers:
è´è´£ç³è¯·èµæºï¼åè°ä»¥åæ§å¶æ´ä¸ªjobçæ§è¡è¿ç¨ï¼å ·ä½å æ¬ï¼è°åº¦ä»»å¡ãå¤çcheckpointã容éçç
TaskManager:
TaskManagerè¿è¡å¨ä¸åèç¹ä¸çJVMè¿ç¨(process)ï¼è´è´£æ¥æ¶å¹¶æ§è¡JobManageråéçtask,并ä¸ä¸JobManageréä¿¡ï¼åé¦ä»»å¡ç¶æä¿¡æ¯ï¼å¦æ说JobManageræ¯masterçè¯ï¼é£ä¹TaskManagerå°±æ¯workerç¨äºæ§è¡ä»»å¡ãæ¯ä¸ªTaskManageråæ¯ä¸ä¸ªå®¹å¨
ï¼å å«ä¸ä¸ªæè å¤ä¸ªSlotã
Slot:
Slotæ¯TaskManagerèµæºç²åº¦çååï¼æ¯ä¸ªSloté½æèªå·±ç¬ç«çå åãææSlotå¹³ååé TaskManagerçå åï¼å¼å¾æ³¨æçæ¯ï¼Slotä» ååå åï¼ä¸æ¶åcpuçååãæ¯ä¸ªSlotå¯ä»¥è¿è¡å¤ä¸ªtaskãSlotç个æ°å°±ä»£è¡¨äºä¸ä¸ªç¨åºçæé«å¹¶è¡åº¦ã
Task:
Taskæ¯å¨operatorsçsubtaskè¿è¡é¾åä¹åå½¢æçï¼å ·ä½Flink jobä¸æå¤å°taskåoperatorç并è¡åº¦åé¾åççç¥æå ³ï¼ä¸ºäºæ¹ä¾¿å¤§å®¶ç解ï¼å¯ä»¥åèå¾5ä¸æ示çç解ã
SubTaskï¼
å 为Flinkæ¯åå¸å¼é¨ç½²çï¼ç¨åºä¸çæ¯ä¸ªç®åï¼å¨å®é æ§è¡ä¸è¢«åé为ä¸ä¸ªæè å¤ä¸ªsubtaskï¼è¿ç®ç¬¦åä»»å¡(subtask)çæ°éæ¯è¯¥ç¹å®è¿ç®ç¬¦ç并è¡åº¦ãæ°æ®æµå¨ç®åä¹é´æµå¨ï¼å°±å¯¹åºå°SubTaskä¹é´çæ°æ®ä¼ è¾ãFlinkå 许åä¸ä¸ªjobä¸æ¥èªä¸åtaskçsubtaskå¯ä»¥å ±äº«åä¸ä¸ªslotãæ¯ä¸ªslotå¯ä»¥æ§è¡ä¸ä¸ªå¹¶è¡çpipelineãå¯ä»¥å°pipelineçä½æ¯å¤ä¸ªsubtaskçç»æçã
Flinkç¨åºæ¬è´¨ä¸æ¯å¹¶è¡ååå¸å¼çãå¨ç¨åºæ§è¡æé´ï¼ä¸ä¸ªæµä¼çæä¸ä¸ªæè å¤ä¸ªstream partitionï¼å¹¶ä¸ä¸ä¸ªoperatorä¼çæä¸ä¸ªæè å¤ä¸ªoperator subtaskãoperatorç subtask å½¼æ¤ä¹é´æ¯ç¬ç«çï¼åå«å¨ä¸åç线ç¨éå»æ§è¡å¹¶ä¸å¯è½åå¸å¨ä¸åçæºå¨ä¸æè containersä¸ã
operatorçsubtasksçæ°éçäºè¯¥æä½ç®åç并è¡åº¦çæ°éãæµç并è¡åº¦ææ»æ¯åå³äºäº§çå®çæä½ç®åç并è¡åº¦å³å®çãåä¸ä¸ªflinkç¨åºä¸çä¸åçoperatorså¯è½æä¸åç并è¡åº¦ã
æ°æ®æµå¨ä¸¤ä¸ªoperatorsä¹é´è¿è¡ä¼ éçæ¹å¼æ两ç§ï¼one-to-one æ¨¡å¼ å redistributing 模å¼
â :one-to-one 模å¼ï¼ä¸¤ä¸ªoperatorç¨æ¤æ¨¡å¼ä¼ éçæ¶åï¼ä¼ä¿ææ°æ®çååºæ°åæ°æ®çæåº,æ¯å¦ï¼å¨ä¸å¾ä¸Sourceåmap() operatorsä¹é´çæ°æ®ä¼ éæ¹å¼ï¼
â¡:Redistributing 模å¼ï¼è¿ç§æ¨¡å¼ä¼æ¹åæ°æ®çååºæ°ï¼æ¯ä¸ªä¸ä¸ªoperator subtaskä¼æ ¹æ®éæ©transformationææ°æ®åéå°ä¸åçç®æ subtasks,æ¯å¦keyBy()ä¼éè¿hashcodeéæ°ååº,broadcast()årebalance()æ¹æ³ä¼éæºéæ°ååºï¼æ¯å¦ï¼å¨ä¸å¾ä¸map()åkeyBy/window ï¼keyBy/windowåSinkä¹é´çæ°æ®ä¼ éæ¹å¼ï¼
对äºåå¸å¼è®¡ç®ï¼Flinkå°operator çsubtasksé¾åå¨ä¸èµ·å½¢ætasksãæ¯ä¸ªtaskå¨ä¸ä¸ªçº¿ç¨ä¸è¢«æ§è¡ãå°operatorsé¾åå¨ä¸èµ·å½¢ætasksæ¯æ¯è¾å¥½çä¸ä¸ªä¼å:ä»åå°äºçº¿ç¨å线ç¨ä¹é´çåæ¢åç¼å²çå¼éï¼å¢å äºååééä½äºå»¶è¿ã对äºoperatorçé¾åè¡ä¸ºï¼å¯ä»¥æ ¹æ®ä¸ªäººæ¥å»è°æ´ã详æ åè å®ç½
ä¸å¾ä¸operatorsç»è¿é¾åä¹åï¼ä» ä» éè¦5个并è¡ç线ç¨ã
â æ¯ä¸ä¸ªworker(TaskManager) é½æ¯ä¸ä¸ªJVMè¿ç¨ï¼ä»å¯è½ä¼å¨ç¬ç«ç线ç¨ä¸æ§è¡ä¸ä¸ªæè å¤ä¸ªsubtaskã为äºæ§å¶workerè½å¤æ¥æ¶å¤ä¸ªtaskãworkeréè¿task slotæ¥è¿è¡æ§å¶(ä¸ä¸ªworkerè³å°æä¸ä¸ªtask slot)ã
â¡æ¯ä¸ªtask slot表示TaskManageræ¥æèµæºçä¸ä¸ªåºå®å¤§å°çåéãåå¦ä¸ä¸ªTaskManageræä¸ä¸ªslot,é£ä¹å®ä¼å°å ¶ç®¡ççå ååæä¸ä»½ç»å个slotãslotçèµæºåæå³çä¸ä¸ªjobçsubtaskå°ä¸éè¦è·æ¥èªå ¶å®jobçsubtaskç«äºè¢«ç®¡ççå åã
â¢éè¿è°æ´task slotsçæ°éï¼ç¨æ·å¯ä»¥å®ä¹subtaskså®ä»¬ä¹é´å¦ä½äºç¸é离ãå¦æä¸ä¸ªTaskManagerä¸ä¸ªslot,é£å°æå³çæ¯ä¸ªtask groupç¬ç«çè¿è¡å¨JVMä¸ãèä¸ä¸ªTaskManagerå¤ä¸ªslotæå³çæ´å¤çsubtaskå¯ä»¥å ±äº«ä¸ä¸ªJVMãèå¨åä¸ä¸ªJVMè¿ç¨ä¸çtaskå°å ±äº«TCPè¿æ¥åå¿è·³æ¶æ¯ãå®ä»¬ä¹å¯è½å ±äº«æ°æ®éåæ°æ®ç»æï¼è¿æ ·å¯ä»¥åå°æ¯ä¸ªtaskçè´è½½ã
é»è®¤ï¼å¦æsubtaskæ¯æ¥èªç¸åçjob,ä½ä¸æ¯ç¸åçtask,Flinkå 许subtaskå ±äº«slotãè¿æ ·å°±ä¼åºç°ä¸ä¸ªslotå¯è½å®¹çº³ä¸ä¸ªjobä¸çæ´ä¸ªpipelineãå 许slotå ±äº«æ以ä¸ä¸¤ä¸ªå¥½å¤ï¼
â Flinké群éè¦çtask slotsçæ°éåä½ä¸ä¸çæé«å¹¶è¡åº¦çä¸è´ãä¸éè¦è®¡ç®ä¸ä¸ªç¨åºæ»å ±å å«å¤å°ä¸ªtaskã
â¡æ´å¥½çå©ç¨èµæºãå¦æ没æslotå ±äº«ï¼éå¯éåsource/map()åä»»å¡å°é»å¡ä¸èµæºå¯éåçªå£åä»»å¡ä¸æ ·å¤çèµæºï¼å¨slotå ±äº«çè¯ï¼å°æ们å¾6ç示ä¾ä¸çåºæ¬å¹¶è¡åº¦ä»2æé«å°6ï¼å¯ä»¥å åå©ç¨slotèµæºï¼åæ¶ç¡®ä¿ç¹éçsubtaskså¨Taskmanagerä¸å ¬å¹³åé ã
Flink的并行度(Parallelism)
Flink程序在执行时,展现并行和分布式特性。流包含一个或多个分区,每个算子可包含一个或多个子任务,这些子任务在不同线程、物理机或容器中独立执行。特定算子子任务数量即为该算子并行度。通常,程序并行度为所有算子中最大值,不同算子可能具有不同并行度。
数据在算子间传输形式有两种:one-to-one模式和redistributing模式。one-to-one模式下,流(如source与map算子间)保持分区和元素顺序,map、filter、flatMap等算子间为顺序对应关系,类似于Spark窄依赖。redistributing模式下,分区会改变,根据选择的transform操作,数据被发送至不同目标任务,如keyBy()基于hashCode重分区,broadcast和rebalance随机重新分区,引发redistribute过程,类似于Spark中的shuffle过程,为宽依赖。
若未设置并行度,系统默认使用flink-conf.yaml配置,值为1。亦可自行设定并行度,代码如下。
flink 并è¡åº¦
Flink ä½ä¸ºä¸å¥åå¸å¼æ§è¡æ¡æ¶ï¼è®¡ç®èµæºå¯ä»¥ä¸æçæ©å±ã
ä¸åçä»»å¡ç±»åï¼å¯ä»¥æ§å¶éè¦ç计ç®èµæºãå¨flinkæ´ä¸ªruntimeç模åä¸
并è¡åº¦æ¯ä¸ä¸ªå¾éè¦çæ¦å¿µï¼éè¿è®¾ç½®å¹¶è¡åº¦å¯ä»¥ä¸ºè®¤ä¸ºåé åçç计ç®èµæºï¼
åå°èµæºçåçé ç½®ã
æ´ä¸ªflinkçæ¶æç®åçè¯´æ¯ ä¸å¿æ§å¶ï¼jobManagerï¼+ å¤ç¹åå¸æ§è¡ï¼taskManagerï¼
å¼¹æ§çèµæºåé 主è¦æ¥èªäºtaskManagerçææ管çåé ç½®ã
å¨å¯å¨flink ä¹åï¼å¨æ ¸å¿çé ç½®æ件éé¢ï¼éè¦æå®ä¸¤ä¸ªåæ°ã
taskmanager.numberOfTaskSlots å parallelism.defaultã
é¦å éè¦æç½slotçæ¦å¿µãå¯¹äº taskManagerï¼ä»å ¶å®æ¯ä¸ä¸ª JVM ç¨åºã
è¿ä¸ªJVM å¯ä»¥åæ¶æ§è¡å¤ä¸ªtaskï¼æ¯ä¸ªtask éè¦ä½¿ç¨æ¬æºç硬件èµæºã
slot çå±äº jvm 管çç ä¸äºåèµæºå¡æ§½ã æ¯ä¸ªslot åªè½æ§è¡ä¸ä¸ªtaskã
æ¯ä¸ªslotåé æåºå®çå åèµæºï¼ä½æ¯ä¸åcpuçé离ã JVM管çä¸ä¸ª slotçpoolï¼
ç¨æ¥æ§è¡ç¸åºçtaskãtaskmanager.numberOfTaskSlots = ï¼åç论ä¸å¯ä»¥åæ¶æ§è¡ä¸ªåä»»å¡ã
é£ä¹å¯¹äº1个5èç¹ï¼numberOfTaskSlots= 6çé群æ¥è¯´ï¼é£ä¹å°±æ个slotå¯ä»¥ä½¿ç¨ã
对äºå ·ä½çä¸ä¸ªjobæ¥è¯´ï¼ä»ä¼è´ªå©ªç使ç¨ææç slotåï¼
使ç¨å¤å°slot æ¯ç±parallelism.default å³å®çãå¦ææ¯ 5ï¼ é£ä¹å¯¹äºä¸ä¸ªjob ä»æå¤åæ¶ä½¿ç¨5个slotã
è¿ä¸ªé 置对äºå¤jobå¹³å°çé群æ¯å¾æå¿ è¦çã
é£ä¹ç»å®ä¸ä¸ªstream api ç¼åçflink ç¨åºï¼è¢«å解çtaskæ¯å¦åmap å°slot ä¸æ§è¡çå¢ï¼
flink æå 个ç»å ¸çgraphï¼ stream-api对åºçstream_graph-> job_graph->execution_graph->ç©çæ§è¡å¾ã
execution_graph åºæ¬å°±å³å®äºå¦ä½åå¸æ§è¡ã
æ们ç¥éä¸ä¸ª stream-api, 主è¦æ source, operate, sink è¿å é¨åãé£ä¹æ们å¯ä»¥ä»sourceå¼å§ç 并è¡çæ§å¶ã
source æ并è¡sourceå é并è¡ãæ们主è¦ç并è¡ï¼æ³ç±»ä¼¼ä¸kafka è¿ç§çææ¶è´¹è 模å¼çæ°æ®æºï¼è½å¤ 并è¡æ¶è´¹sourceæ¯é常éè¦çã
æ以å¯ä»¥çå°kafkaï¼FlinkKafkaConsumerBase<T> extends RichParallelSourceFunction<T>ï¼å¯ä»¥å åå©ç¨å¹¶è¡åº¦ï¼å¤§å¤§æé«ååéã
对åºå°å ·ä½çç©çæ§è¡ä¸ï¼å°±æ¯å¤ä¸ª source task ä»»å¡æ§è¡ï¼ä»ä»¬å±äºä¸ä¸ªkafka groupåæ¶æ¶è´¹ ä¸åçpartitionã
对äºparallelSourceï¼é»è®¤ä½¿ç¨cpu æ ¸å¿å并è¡åº¦ãæ们å¯ä»¥éè¿apiè¿è¡è®¾ç½®ã
æ¥ä¸æ¥æ¯ operateï¼æ¯ä¸ªoperateé½å¯ä»¥è®¾ç½®parallelï¼å¦æ没æ设置å°ä¼ä½¿ç¨å ¶ä»å±æ¬¡ç设置ï¼æ¯å¦envï¼flink.confä¸çé ç½®ï¼parallelism.defaultã
æ¯å¦ source. map1().map2().grouby(key).sink()
è¿æ ·ä¸ä¸ªç¨åºï¼é»è®¤ï¼sourceå map1ï¼map2æåæ ·çparallelï¼ä¸æ¸¸çoutput å¯ä»¥ç´æ¥one-one forwarding.
å¨flink ç ä¼åä¸ï¼çè³å¯ä»¥æè¿äº one-one çoperate åæä¸ä¸ªï¼é¿å 转åï¼çº¿ç¨åæ¢ï¼ç½ç»éä¿¡å¼éã
对äºgroupby è¿æ ·çç®åï¼åå±äºå¦å¤çä¸ç±»ãä¸æ¸¸çoutput éè¦ partion å°ä¸æ¸¸çä¸åçèç¹ï¼èä¸è½åä½ä¸ä¸ªchainã
ç±äºoperateå¯ä»¥è®¾ç½®ç¬èªçparallelï¼å¦æä¸ä¸æ¸¸ä¸ä¸è´ãä¸æ¸¸çoutputå¿ ç¶éè¦æç§partionçç¥æ¥ rebalnceæ°æ®ãkafkaæå¾å¤çç¥æ¥å¤çè¿ä¸ªç»èã
对äºpartionæ¾å¨ä¸é¨çç« èæ¥è¯´æã
对äºsinkï¼åå¯ä»¥ç解ä½ä¸ä¸ªç¹å®çoperateï¼ç®åç没ä»ä¹ç¹æ®å¤çé»è¾ã
Flink原理
Flink架构由JobManager、TaskManager、Client三部分构成。JobManager负责调度、协调checkpoint、故障恢复及状态收集,TaskManager执行计算任务并管理节点服务,而Client用于提交Flink程序,通过建立连接向JobManager提交任务。
Flink在Yarn环境下的执行流程为:Flink程序通过Client提交至JobManager,JobManager分发至TaskManager执行计算任务。JobManager负责任务调度,管理资源分配,而TaskManager执行计算任务并汇报节点状态。
Flink的Streaming Dataflow包含数据流模型与多种Operator传递模式,如One to One模式与Redistributing模式。优化操作形成Operator Chain,此链在TaskManager独立线程中执行。
每个TaskManager是一个JVM进程,包含多个TaskSlot,为并发处理任务提供资源。TaskSlot共享机制在多个任务间动态分配资源,提高资源使用效率。
Flink的执行流程图由四层构成:StreamGraph、JobGraph、ExecutionGraph、物理执行图。StreamGraph为原始图,JobGraph为优化后的结构,ExecutionGraph为并行化规划,物理执行图则将并行计划落实至具体任务执行。