Apache Spark吹嘘它的运营商(节点)是“无国籍的”。这使得Spark的架构可以使用更简单的协议来处理恢复,负载平衡和处理落后者等问题。
另一方面,Apache Flink将其运营商描述为“有状态”,并声称有状态对机器学习等应用是必要的。然而,Spark程序能够在不保持“状态”的情况下传递信息并在RDD中维护应用程序数据。
这里发生了什么? Spark不是一个真正的无状态系统吗?或者Flink的断言是有状态对于机器学习和类似的应用程序是不正确的?或者这里有一些额外的细微差别?
我不觉得我真正理解“有状态”系统和“无状态”系统之间的区别,如果可以解释它们,我将不胜感激。
状态属性是指能够在当前时间点访问先前时间点的数据。
这是什么意思?假设我想对已经到达流媒体应用程序的所有单词进行单词计数。但流式传输的本质是数据流入和流出管道。为了能够访问先前的数据,在这个例子中,某种地图保存了流中前一个单词的数量,我必须访问一些累积的状态。
虽然一些Sparks RDD运算符是无状态的,例如map
,filter
等,但确实以mapWithState
的形式公开了有状态运算符。不仅如此,在新的Spark流式架构中,称为“结构化流式传输”,状态内置于管道中,并且主要是从用户中抽象出来,以便能够公开聚合运算符,例如agg
。