[基础定义] 有状态计算 & 无状态计算

classic Classic list List threaded Threaded
4 messages Options
Reply | Threaded
Open this post in threaded view
|

[基础定义] 有状态计算 & 无状态计算

i'mpossible
Hi:
    我想知道有状态计算、无状态的计算的具体定义是什么?能否给出具体的应用场景;

    Flink官网介绍Flink时,给出定义是 "用于在无边界和有边界数据流上进行有状态的计算",但是没有介绍状态的具体含义,
和有状态、无状态计算的应用场景,以及他们的差异,令人感到抽象;

    感谢社区的小伙伴解答!
Reply | Threaded
Open this post in threaded view
|

Re: [基础定义] 有状态计算 & 无状态计算

Benchao Li
Hi,

我尝试一下从一个场景来阐述一下状态的定义吧,这样容易理解一些。

比如我们要做一个窗口的聚合。那这个聚合的结果可以认为是一个中间状态,这个状态在窗口没有结束之前,
是不会输出到下游的。如果我们只是把这个状态放到内存里,那中间如果任务挂了,这个状态就丢了。

如果框架没有提供状态的能力,一般我们就会选择把这个中间结果存储到外部的kv系统(比如hbase)里,每当窗口内来了
一条数据,就更新一下这个结果,并且存储到外部的kv系统。这样子如果中间任务挂了,重启起来的时候我们还能
从外部kv系统里拿到这个状态继续计算,不会导致计算结果不准确。但是这个只是一定程度上缓解了中间结果的丢失
问题,但是仍然很难提供精准的exactly-once的计算语义,因为你没法保证读到的这条数据commit offset和把中间结果
到外部kv在一个原子操作里。

但是如果框架本身提供了状态的能力呢,我们就不需要自己再去处理这种问题了。这个中间结果可以直接存储到
Flink内置的状态里。然后依靠Flink的checkpoint机制来把状态定期保存到外部系统(比如HDFS)。这样子就可以保证
任务失败重启的时候,可以从我们的checkpoint来恢复,来保证计算结果的exactly-once的语义。



i'mpossible <[hidden email]> 于2020年4月26日周日 下午4:18写道:

> Hi:
> &nbsp; &nbsp; 我想知道有状态计算、无状态的计算的具体定义是什么?能否给出具体的应用场景;
>
> &nbsp; &nbsp; Flink官网介绍Flink时,给出定义是 "用于在无边界和有边界数据流上进行有状态的计算",但是没有介绍状态的具体含义,
> 和有状态、无状态计算的应用场景,以及他们的差异,令人感到抽象;
>
> &nbsp; &nbsp; 感谢社区的小伙伴解答!



--

Benchao Li
School of Electronics Engineering and Computer Science, Peking University
Tel:+86-15650713730
Email: [hidden email]; [hidden email]
Reply | Threaded
Open this post in threaded view
|

Re: [基础定义] 有状态计算 & 无状态计算

Leonard Xu
Hi,
状态计算,简单地理解一次计算依赖上一次的计算结果,状态理解为算子的中间结果,
比如benchao举例的window或者聚合算子就是有状态的,filter 这种算子就是无状态的。
1.10的中文文档还是非常详细的,可以参考CountWindowAverage这个例子[1]

祝好,
Leonard Xu
[1]https://ci.apache.org/projects/flink/flink-docs-stable/zh/dev/stream/state/state.html <https://ci.apache.org/projects/flink/flink-docs-stable/zh/dev/stream/state/state.html>

> 在 2020年4月26日,17:18,Benchao Li <[hidden email]> 写道:
>
> Hi,
>
> 我尝试一下从一个场景来阐述一下状态的定义吧,这样容易理解一些。
>
> 比如我们要做一个窗口的聚合。那这个聚合的结果可以认为是一个中间状态,这个状态在窗口没有结束之前,
> 是不会输出到下游的。如果我们只是把这个状态放到内存里,那中间如果任务挂了,这个状态就丢了。
>
> 如果框架没有提供状态的能力,一般我们就会选择把这个中间结果存储到外部的kv系统(比如hbase)里,每当窗口内来了
> 一条数据,就更新一下这个结果,并且存储到外部的kv系统。这样子如果中间任务挂了,重启起来的时候我们还能
> 从外部kv系统里拿到这个状态继续计算,不会导致计算结果不准确。但是这个只是一定程度上缓解了中间结果的丢失
> 问题,但是仍然很难提供精准的exactly-once的计算语义,因为你没法保证读到的这条数据commit offset和把中间结果
> 到外部kv在一个原子操作里。
>
> 但是如果框架本身提供了状态的能力呢,我们就不需要自己再去处理这种问题了。这个中间结果可以直接存储到
> Flink内置的状态里。然后依靠Flink的checkpoint机制来把状态定期保存到外部系统(比如HDFS)。这样子就可以保证
> 任务失败重启的时候,可以从我们的checkpoint来恢复,来保证计算结果的exactly-once的语义。
>
>
>
> i'mpossible <[hidden email]> 于2020年4月26日周日 下午4:18写道:
>
>> Hi:
>> &nbsp; &nbsp; 我想知道有状态计算、无状态的计算的具体定义是什么?能否给出具体的应用场景;
>>
>> &nbsp; &nbsp; Flink官网介绍Flink时,给出定义是 "用于在无边界和有边界数据流上进行有状态的计算",但是没有介绍状态的具体含义,
>> 和有状态、无状态计算的应用场景,以及他们的差异,令人感到抽象;
>>
>> &nbsp; &nbsp; 感谢社区的小伙伴解答!
>
>
>
> --
>
> Benchao Li
> School of Electronics Engineering and Computer Science, Peking University
> Tel:+86-15650713730
> Email: [hidden email]; [hidden email]

Reply | Threaded
Open this post in threaded view
|

回复: [基础定义] 有状态计算 & 无状态计算

i'mpossible
&nbsp; &nbsp;明白了,感谢 @Benchao Li @Leonard Xu 的解答,谢谢!




------------------&nbsp;原始邮件&nbsp;------------------
发件人:&nbsp;"Leonard Xu"<[hidden email]&gt;;
发送时间:&nbsp;2020年4月26日(星期天) 晚上6:03
收件人:&nbsp;"user-zh"<[hidden email]&gt;;

主题:&nbsp;Re: [基础定义] 有状态计算 &amp; 无状态计算



Hi,
状态计算,简单地理解一次计算依赖上一次的计算结果,状态理解为算子的中间结果,
比如benchao举例的window或者聚合算子就是有状态的,filter 这种算子就是无状态的。
1.10的中文文档还是非常详细的,可以参考CountWindowAverage这个例子[1]

祝好,
Leonard Xu
[1]https://ci.apache.org/projects/flink/flink-docs-stable/zh/dev/stream/state/state.html <https://ci.apache.org/projects/flink/flink-docs-stable/zh/dev/stream/state/state.html&gt;

&gt; 在 2020年4月26日,17:18,Benchao Li <[hidden email]&gt; 写道:
&gt;
&gt; Hi,
&gt;
&gt; 我尝试一下从一个场景来阐述一下状态的定义吧,这样容易理解一些。
&gt;
&gt; 比如我们要做一个窗口的聚合。那这个聚合的结果可以认为是一个中间状态,这个状态在窗口没有结束之前,
&gt; 是不会输出到下游的。如果我们只是把这个状态放到内存里,那中间如果任务挂了,这个状态就丢了。
&gt;
&gt; 如果框架没有提供状态的能力,一般我们就会选择把这个中间结果存储到外部的kv系统(比如hbase)里,每当窗口内来了
&gt; 一条数据,就更新一下这个结果,并且存储到外部的kv系统。这样子如果中间任务挂了,重启起来的时候我们还能
&gt; 从外部kv系统里拿到这个状态继续计算,不会导致计算结果不准确。但是这个只是一定程度上缓解了中间结果的丢失
&gt; 问题,但是仍然很难提供精准的exactly-once的计算语义,因为你没法保证读到的这条数据commit offset和把中间结果
&gt; 到外部kv在一个原子操作里。
&gt;
&gt; 但是如果框架本身提供了状态的能力呢,我们就不需要自己再去处理这种问题了。这个中间结果可以直接存储到
&gt; Flink内置的状态里。然后依靠Flink的checkpoint机制来把状态定期保存到外部系统(比如HDFS)。这样子就可以保证
&gt; 任务失败重启的时候,可以从我们的checkpoint来恢复,来保证计算结果的exactly-once的语义。
&gt;
&gt;
&gt;
&gt; i'mpossible <[hidden email]&gt; 于2020年4月26日周日 下午4:18写道:
&gt;
&gt;&gt; Hi:
&gt;&gt; &amp;nbsp; &amp;nbsp; 我想知道有状态计算、无状态的计算的具体定义是什么?能否给出具体的应用场景;
&gt;&gt;
&gt;&gt; &amp;nbsp; &amp;nbsp; Flink官网介绍Flink时,给出定义是 "用于在无边界和有边界数据流上进行有状态的计算",但是没有介绍状态的具体含义,
&gt;&gt; 和有状态、无状态计算的应用场景,以及他们的差异,令人感到抽象;
&gt;&gt;
&gt;&gt; &amp;nbsp; &amp;nbsp; 感谢社区的小伙伴解答!
&gt;
&gt;
&gt;
&gt; --
&gt;
&gt; Benchao Li
&gt; School of Electronics Engineering and Computer Science, Peking University
&gt; Tel:+86-15650713730
&gt; Email: [hidden email]; [hidden email]