00:00
接下来我们要介绍的是状态的一致性。之前我们其实讲到检查点的时候已经提到了,我们在进行检查点配置的时候。Check mode,它的检查点模式可以有和at least once2种选择,那所谓的和at least ones其实就是不同的状态一致性别,诶,那到底什么叫做状态一致性呢?接下来我们就来详细的做一个讲解,那这部分呢,原理理论性的东西会比较多一些,所以我们用PPT来进行一个简单的说明。首先我们说一下什么是状态一致性。在分布式系统当中,一致性是一个非常重要的概念,那在事物中,就是我们所说的transaction里边,一致性也是非常重要的一个特特性啊,我们所说的事物应该有acid啊,几种不同的特性,一致性也是其中之一。那flink当中一致性的概念到底是什么呢?啊,它其实主要是用在故障恢复的描述当中,所以它有些类似于事物里边对于一致性的描述。
01:10
到底什么是一致性呢?简单来说其实就是结果的一致性啊,对于流处理器内部来说,就是我们说的每一步计算的结果要保证是准确的,那什么样就叫计算结果保证准确呢?难道说我们这个一个计算器,它做一个加法,做一个减法的时候还会算错吗?我们说的并不是某一步操作会算错,而说的是当前的数据,我们现在是大数据处理嘛,所有的数据输入进来之后,每一个数据不应该丢掉,而且也不应该被重复计算。比如说我们之前到的这一个进行count的这样的一个例子,那前面我们已经传了三条数据,然后进行了检查点的保存。
02:03
前三条数据两个哈,一个word,那接下来呢,又处理了两条数据,一个flink一个哈,但是处理到第五个数据哈的时候,现在发生了故障。所以我们现在的目标其实就是从之前保存的状态恢复出来之后继续去处理。我要保证。前三个数据那是都只处理了一次,Hello word hello,后边的第四第五个数据呢,Flink和哈也都只处理一次,不能重复处理,也不能丢掉。所以我们会发现接下来我们的要求就是从之前的检查点把它恢复出来,那是前三个数据都已经处理完了,那第四第五个数据呢,当前我们是都已经读取完了,但是我们还应该把它做一个重放,还应该啊,重新把它做一次计算,所以我们会发现就是首先要求遇到故障之后,是应该能够恢复出之前的某一个时间点的状态。
03:08
然后恢复之后呢,进行的重新计算,得到的结果也应该是数据不丢,也不重复计算,完全正确这样一个状态,这就是我们所说的状态的一致性。那一般说来,状态的一致性,它有三种级别。最简单的,或者说最基本的是所谓的at,就是所谓的最多一次。那它的具体操作是什么呢?其实就是当一个任务任务故障发生的时候,最简单的做法,什么都不干,直接重启。那我们想到如果什么都不干,直接重启的话,那之前状态不就全丢了吗?那就相当于我们所有的数据就全部再重新处理一遍,对吧?啊,那那如果说我们当前并不能重放数据的话,那当然就是之前没有处理的数据就直接丢了嘛。
04:06
那就相当于当前所有的数据最多只被处理一次,也有可能丢掉啊,那如果说数据都允许被直接丢掉的话,相当于就是没有任何操作来保证。当前数据。处理的结果,那所以这种类型的保证也可以叫做是没有保证啊,那看起来这个很糟糕,不过如果说我们的主要诉求是快的话,如果想。尽量不影响我们当前数据处理的速度的话。那么就相当于我们可以什么都不做,直接出现故障直接恢复,然后继续去处理就可以了啊,那这样的话就相当于我们是以结果不太准确为代价,然后得到了最快的处理速度啊,在有些场景下,这也不失为一种解决方案。
05:01
那另外还有一种比较容易想到的一致性级别,那就是前面我们提到的at least至少一次,因为在实际应用当中,我们一般都会希望至少这个数据不要丢,因为数据一旦要丢掉的话,我们结果的准确性应该就大打折扣了啊。那所以我们会想到当前的数据,或许它有可能会被重复处理。但是呢,至少我要保证它不丢,这样的话就能达到至少一次的一致性级别,那怎么样能够保证它达到这个级别呢?呃,简单的想法就是,只要能够重放数据。只要是数据源那边,我们某些数据能够重放。当前我就能够保证它至少处理一次,发生故障我就重放,发生故障就重放。在有些场景下。重复的去处理数据,其实是不影响我们最终的结果正确性的啊,那。
06:04
这是什么场景呢?就是当我们每一次操作。对,这个数据来了之后要做一次操作,哎,那做完之后呢,这个结果如果同样的数据再来一次,这个结果是不变的。我们一般把这种操作就叫做具有密等性,那我们知道假如说是这个word count的话,那当然这个同一个word重复出现,那肯定我们后边这个结果是会变化的啊,它是会再加一的,那显然这个操作就没有密等性,那什么样的操作具有密等性呢?比如说我们统计UV。统计UV的时候,我们只是要看当前的用户是否出现过,诶,那即使是同一个数据我们重复处理多次的话,那最多也就是这个用户出现过就可以了嘛,所以不会影响我们最终的结果。这个时候我们使用at least这样一个状态一致性的语义是完全没有问题。
07:04
但是我们自然想到,如果是PV的话,那当然就不行了,它是不具有密等性的操作。那统计的时候我们就能。让他在at least once至少一次的这个状态一致性级别下去工作,那最后结果就会不对。那我们自然想到怎么样能够保证对于PV或者count这样的需求,我们能保证最后的结果一定是对的呢?发生故障恢复之后也一定是对的呢,哎。那就是所谓的精确一次。有时候也把它翻译成叫做恰好一次,这是最严格的状态一致性的保证,也是最难实现的状态一致性保证,那就意味着所有的数据首先不能丢啊,那不能丢的话,我们首先啊,就是能够重放数据,它至少就不会丢了嘛,啊这就先到。
08:00
At least once至少一次的级别,然后另外还得保证所有数据只处理一次,也就是说,我当前的数据来了之后。对于当前这个任务的状态的改变只会发生一次啊,那如果我们较真的话,可能会发现,如果说你只是抠字眼,要求这个数据只处理一次的话,那我们不可能做到,因为假如发生故障的话,那之前当前这个数据有可能他就已经处理了一次了。回滚之后,接下来这个数据重放,它一定还会再处理一次,我们无法严格意义上做到这个物理上的只处理一次,那我们能够保证的是什么呢?其实就是它处理的结果,在当前这个状态的改变里边,当前的数据只体现了一次,这个就叫做只处理一次。对于我们之前的,那就是。当前来了一个word,一个单词。
09:03
如果说发生了故障,故障前它处理了一次,但是呢,故障回滚了,回滚到他之前的状态了,又把它重放,又处理了一次,但是我们在最终的状态里边,它只体现出一次。啊,因为状态是在它之前的那个状态叠加的呀,啊,所以那我们从checkpoint保存的那个状态恢复出来的话,就没有包括它之前的那个技术,现在再重放再来叠加是完全没有问题的,这都是我们所说的one次精确一次处理,而且只处理一次。那我们已经知道了对于flink而言它的内部状态,如果说我们想要做到最高级别的的话,其实很容易,因为如果我们开启了检查点,开启了checkpoint,那么。本质上我们里边做了故障恢复之后,所有的状态就都可以回退到。
10:04
刚刚做完检查点之后的那一时刻,那接下来的数据只要能够重放,那么所有的数据就只会处理一遍。都不会丢,而且只会处理一遍,而这就是我们所说的flink。故障恢复机制的核心就是一致性,检查点就是checkpoint啊,那所以只要开启了checkpoint,在flink里边就可以直接保证它内部的exactly once语义的状态一致性啊,这是一种轻量级的分布式快照机制。那我们所说的这一个时间,保存快照的时间点,就是所有任务都恰好处理完同一个数据的时候,这是我们之前提到的。
我来说两句