关于流计算:流处理计算平台-StreamPark-200-重磅发布首个-Apache-版本终于来了

Apache StreamPark(Incubating) 社区的小伙伴们大家好:明天咱们很快乐地发表 StreamPark 2.0.0 正式公布!欢送下载应用。 这是 StreamPark 退出 Apache 孵化器以来公布的第一个版本,也是一个重大性能更新的版本。间隔上个版本公布已有半年之久,在这半年多的工夫里,咱们开发了很多十分实用的新性能,也经验了社区小伙伴们的数次催更和发版合规的数次整改。当初,它终于和大家见面了。这是一个诚意满满的、值得期待的版本。有超过 100 位 Contributor 奉献了超过 700 个 Pull Request,带来了诸多的新个性和改良修复,感激每一位贡献者的致力。 在 2.0.0 版本中,咱们实现了 Apache 我的项目的合规要求。此次发版投票前后周期逾越 3 个月,通过社区和 ASF 孵化器导师们数轮的检查和投票,在此非常感谢参加我的项目检查和投票的导师和社区小伙伴,由衷感触到 ASF 对我的项目的严苛要求,对 License(一种具备法律性质的合同或领导,目标在于标准受著作权爱护的软件的应用或分布行为)合规的高度重视。终于,在第 7 轮投票中通过了本次公布。这意味着 2.0.0 版本的 License 合规最大水平的失去保障,能够被更多企业更宽泛的应用。 本次重写了整个前端模块,UI显示更加好看和业余。前端构建和启动速度同历史版本比晋升了 5~10 倍。对 Apache Flink 做了更好的反对,反对最新的 Flink 1.16。部署 Flink 作业 on Kubernetes 达到生产可用级别,另外在实用性和易用性上做了大量改良,修复了诸多历史 Bug 和安全漏洞,倡议所有人降级应用。 尝鲜体验GitHub:https://github.com/apache/streampark下载:https://streampark.apache.org/download欢送应用、关注、star、fork,四连胜利~ 尤其是催更的诸位: 装置应用Apache StreamPark(Incubating) 提供了两个安装包,在 Scala 版本上有所不同。如下: apache-streampark_2.11-2.0.0-incubating-bin.tar.gzapache-streampark_2.12-2.0.0-incubating-bin.tar.gz2.11 和 2.12 即为 Scala 的版本,这里 Scala 版本与 Flink 的 Scala 版本要保持一致。如果 Flink 版本是 1.15 及以上,那么只能应用 Scala 2.12 版本的 StreamPark。因为 Flink 1.15+ 只反对 Scala 2.12,1.15 以下的版本则 Scala 2.11 和 2.12 都反对。 ...

February 21, 2023 · 2 min · jiezi

关于流计算:读Flink源码谈设计Exactly-Once

本文首发于泊浮目标语雀:https://www.yuque.com/17sing版本日期备注1.02022.2.2文章首发0.前言将Flink利用至生产已有一段时间,刚上生产的时候有幸排查过因数据歪斜引起的Checkpoint超时问题——过后简略的理解了相干机制,最近正好在读Flink源码,不如趁这个机会搞清楚。 在这里,咱们首先要搞清楚两种Exactly-Once的区别: Exactly Once:在计算引擎外部,数据不失落不反复。实质是通过Flink开启检查点进行Barrier对齐,即可做到。End to End Exactly Once:这意味着从数据读取、引擎解决到写入内部存储的整个过程中,数据都是不失落不反复的。这要求数据源可重放,写入端反对事务的复原和回滚或幂等。1. 数据歪斜为什么会引起Checkpoint超时做Checkpoint时算子会有一个barrier的对齐机制(为何肯定要对齐前面会讲到)。以下图为例解说对齐过程: 当两条边下发barrier时,barrier1比barrier2先达到了算子,那么算子会将一条边输出的元素缓存起来,直到barrier2到了做Checkpoint当前才会下发元素。 每个算子对齐barrier后,会进行异步状态存储,而后下发barrier。每个算子做完Checkpoint时,会告诉CheckpointCoordinator。当CheckpointCoordinator得悉所有算子的Checkpoint都做完时,认为本次Checkpoint实现。 而在咱们的应用程序中,有一个map算子承受了大量数据,导致barrier始终没有下发,最终整个Checkpoint超时。 2. Checkpoint的原理其具体原理能够参考Flink团队的论文:Lightweight Asynchronous Snapshots for Distributed Dataflow。简略来说,晚期流计算的容错计划都是周期性做全局状态的快照,但这有两个毛病: 阻塞计算——做快照时是同步阻塞的。会将以后算子未解决以及正在解决的record一起做进快照,因而快照会变得特地大。而Flink是基于Chandy-Lamport 算法来扩大的——该算法异步地执行快照,同时要求数据源可重放,但依然会存储上游数据。而Flink的计划提出的计划在无环图中并不会存储数据。 在Flink中(无环有向图),会周期性的插入Barrier这个标记,告知上游算子开始做快照。这个算法基于以下前提: 网络传输牢靠,能够做到FIFO。这里会对算子进行blocked和 unblocked操作,如果一个算子是blocked,它会把从上游通道接管到的所有数据缓存起来,间接收到unblocked的信号才发送。Task能够对它们的通道进行以下操作:block, unblock, send messages, broading messages。对于Source节点来说,会被形象成Nil输出通道。3. Checkpoint的实现在Flink中,做Checkpoint大抵由以下几步组成: 可行性查看JobMaster告诉Task触发检查点TaskExecutor执行检查点JobMaster确认检查点接下来,让咱们跟着源码来看一下外面的具体实现。 3.1 可行性查看参考代码:CheckpointingCoordinator#startTriggeringCheckpoint。 确保作业不是处于敞开中或未启动的状态(见CheckpointPlanCalculator#calculateCheckpointPlan)。生成新的CheckpointingID,并创立一个PendingCheckpoint——当所有Task都实现了Checkpoint,则会转换成一个CompletedCheckpoint。同时也会注册一个线程去关注是否有超时的状况,如果超时则会Abort以后的Checkpoint(见CheckpointPlanCalculator#createPendingCheckpoint)。触发MasterHook。局部内部零碎在触发检查点之前,须要做一些扩大逻辑,通过该实现MasterHook能够实现告诉机制(见CheckpointPlanCalculator#snapshotMasterState)。反复步骤1,没问题的话告诉SourceStreamTask开始触发检查点(见CheckpointPlanCalculator#triggerCheckpointRequest)。3.2 JobMaster告诉Task触发检查点在CheckpointPlanCalculator#triggerCheckpointRequest中,会通过triggerTasks办法调用到Execution#triggerCheckpoint办法。Execution对应了一个Task实例,因而JobMaster能够通过外面的Slot援用找到其TaskManagerGateway,发送近程申请触发Checkpoint。 3.3 TaskManager执行检查点TaskManager在代码中的体现为TaskExecutor。当JobMaster触发近程申请至TaskExecutor时,handle的办法为TaskExecutor#triggerCheckpoint,之后便会调用Task#triggerCheckpointBarrier来做: 做一些查看,比方Task是否是Running状态触发Checkpoint:调用CheckpointableTask#triggerCheckpointAsync执行检查点:CheckpointableTask#triggerCheckpointAsync。以StreamTask实现为例,这里会思考上游曾经Finish时如何触发上游Checkpoint的状况——通过塞入CheckpointBarrier来触发;如果工作没有完结,则调用StreamTask#triggerCheckpointAsyncInMailbox。最终都会走入SubtaskCheckpointCoordinator#checkpointState来触发Checkpoint。算子保留快照:调用OperatorChain#broadcastEvent:保留OperatorState与KeyedState。调用SubtaskCheckpointCoordinatorImpl#finishAndReportAsync,:异步的汇报以后快照已实现。3.4 JobMaster确认检查点|-- RpcCheckpointResponder \-- acknowledgeCheckpoint|-- JobMaster \-- acknowledgeCheckpoint|-- SchedulerBase \-- acknowledgeCheckpoint|-- ExecutionGraphHandler \-- acknowledgeCheckpoint|-- CheckpointCoordinator \-- receiveAcknowledgeMessage在3.1中,咱们提到过PendingCheckpoint。这外面保护了一些状来确保Task全副Ack、Master全副Ack。当确认实现后, CheckpointCoordinator将会告诉所有的Checkpoint曾经实现。 |-- CheckpointCoordinator \-- receiveAcknowledgeMessage \-- sendAcknowledgeMessages3.5 检查点复原该局部代码较为简单,有趣味的同学能够依据相干调用栈自行浏览代码。 |-- Task \-- run \-- doRun|-- StreamTask \-- invoke \-- restoreInternal \-- restoreGates|-- OperatorChain \-- initializeStateAndOpenOperators|-- StreamOperator \-- initializeState|-- StreamOperatorStateHandler \-- initializeOperatorState|-- AbstractStreamOperator \-- initializeState|-- StreamOperatorStateHandler \-- initializeOperatorState|-- CheckpointedStreamOperator \-- initializeState #调用用户代码3.6 End to End Exactly Once端到端的精准一次实现其实是比拟艰难的——思考一个Source对N个Sink的场景。故此Flink设计了相应的接口来保障端到端的精准一次,别离是: ...

February 2, 2022 · 1 min · jiezi