apachespark吹嘘它的操作符(节点)是“无状态的”。这使得spark的体系结构可以使用更简单的协议进行恢复、负载平衡和处理散乱程序。
另一方面,apacheflink将其操作符描述为“有状态的”,并声称有状态对于机器学习等应用程序是必要的。然而,spark程序能够在rdd中传递信息和维护应用程序数据,而无需维护“状态”。
这里发生了什么?spark不是一个真正的无状态系统吗?或者,flink关于有状态性对于机器学习和类似的应用程序至关重要的Assert是错误的吗?或者这里还有其他细微差别吗?
我不觉得我真的在摸索“有状态的”和“无状态的”系统之间的区别,如果能解释一下,我将不胜感激。
1条答案
按热度按时间jslywgbw1#
state的属性是指能够访问当前时间点上一个时间点的数据。
这是什么意思?假设我想对流媒体应用程序中的所有单词进行字数统计。但流的本质是数据在管道中进出。为了能够访问以前的数据,在这个示例中,某种类型的Map保存了流中以前的字数,我必须访问一些累积的状态。
而有些sparks rdd操作符是无状态的,例如
map
,filter
等等,它确实以mapWithState
. 不仅如此,在新的spark流体系结构(称为“结构化流”)中,状态被构建到管道中,并且主要从用户那里抽象出来,以便能够公开聚合操作符,例如agg
.