让时间倒流的保存点:用让时间倒流的保存点:用ApacheFlink的保存点技术重新处理的保存点技术重新处理
数据流数据流
这篇文章是系列文章的第一篇,数据工匠团队会在这里为大家展示一些Apache Flink的核心功能。
流处理通常被大家与“动态数据”关联起来,相应的系统差不多会在数据被创造出来的那一刻就立刻对其进行处理或响应。像延
迟、吞吐量、水印和处理迟到的数据等等都是大家讨论得最多的流处理话题,通常是关注现在,而不是过去。
可在实际项目中,却有许多种场景需要你的流处理程序把以前处理过的数据再重新处理一遍。这里有些例子:
为你的程序部署一个新版本,可能是有新功能、修复了问题、或者采用了更好的机器学习模型;
使用相同的源数据流对应用程序的不同版本进行A/B测试,两边都从同一个点开始测试,这样就不会牺牲之前的状态;
评估或开展将应用程序迁移到更新版本的处理框架上,或是一个不同的集群上;
Apache Flink的保存点(Savepoint)功能可以支持上面的所有场景,并且也是让Flink与其它分布式开源流处理器不同的一个
显著区别点。
在本文中,我们会讲述如何使用保存点功能来重新处理数据,并一定程度地深入底层,讲述这个功能在Flink中是怎么实现
的。
“重新处理”到底是什么意思?
为了保证大家对重新处理数据的理解是一致的,我们先讨论一个你可能需要重新处理数据的业务例子。想像一个社交媒体公
司,她除了基本的发贴功能之外,还发布了一种付费的、或者说是推广发贴的功能。
公司的用户可以访问一个简单的、基于Flink实现的仪表板,显示他们的所有文章(不管是普通的还是付费的)被大家查看、
点击等等的次数。几个星期之后,从用户的反馈中就可以清晰地看到,这个仪表板如果能把普通的发贴数据和付费的发贴数据
区别开来,那就会更好用。
要实现这个功能,就有必要返回到付费发贴功能最初发布的那个时刻,然后从那个时刻开始,把所有数据全都重新处理一遍。
这一次要把付费贴和普通贴的展示和交互全都拆开来。如果要把从公司创立伊始产生的数据全都重新处理一遍,这就实在有点
强人所难,所以能够从付费发贴的功能发布的时候开始重新处理,同时还保留之前的计算结果,这个功能就很有必要了。
所以当我们用到“重新处理”这个词时,我们的意思就是回到一个系统以前的、一致的状态(按开发者的定义,不一定非要是流
的最早状态),然后从那个状态开始再处理一遍,可能也要在更改了你的Flink程序之后。
读者们可以看到的好消息就是:Flink为大家免费提供了上述重新处理功能,相应的功能就叫保存点。我们说"免费",意思是只
要你的程序是容错的,并且可以从错误中恢复,那你就可以在Flink中创建一个保存点并重新处理数据,花费的额外准备工作
量几乎为零。
简单说说保存点到底是什么
简而言之,一个Flink程序的保存点就是关于以下两点的全局一致的镜像:
所有数据源的位置;
所有并行操作者的状态;
“全局一致”意味着所有并行的操作者的状态都在所有输入的相同的明确定义的位置处被记录下来了。
如果在过去的某个时刻,你为某个应用程序记下了保存点,那你就可以从那个保存点的位置开始启动一个新程序。新的程序将
使用那个保存点位置保存下来的操作者的状态进行初始化,并且会从记录的保存点里各个数据源的相应位置开始,重新处理全
部数据。
因为Flink的保存点之间是相互完全独立的,所以对每个程序你都可以有多个保存点,这样你就可以根据这些不同的保存点的
信息,回到不同的位置,启动多次、甚至不同的程序(如下图所示)。这个功能对于派生你的流处理程序,或者为它们打不同
的版本,是非常有用的。
评论0
最新资源