Spark Streaming中的追加模式和更新模式之间的真正区别是什么?
根据文件:
追加模式(默认) - 这是默认模式,其中只有新模式 自上次触发后将添加到结果表的行 输出到水槽。仅支持那些查询 添加到结果表的行永远不会更改。因此,这 模式保证每行只输出一次(假设 容错接收器)。例如,只有select的查询,在哪里, map,flatMap,filter,join等将支持Append模式。
和
更新模式 - (自Spark 2.1.1起可用)仅限于中的行 自上次触发后更新的结果表将是 输出到水槽。将来要添加的更多信息 版本。
我对附加模式的困惑:它说"只有" 添加到结果表的新行,因为最后一次触发将被输出到水槽。所以,例如,假设我们有三行
r1, r2, r3
到达t1, t2, t3
t1<t2<t3
现在说在t4时行r2被覆盖了,如果是这样的话,我们在追加模式下操作时,我们永远不会在接收器中看到它?是不是失去写作?
我对更新模式的困惑:它表示&#34;仅#34; 结果表中自上次触发后更新的行将输出到水槽。这是否意味着行应该已经存在,并且只有在更新现有行时它才会输出到接收器?如果在我们处于此更新模式时没有现有行并且有新行进入会发生什么?
答案 0 :(得分:3)
仔细查看docs最新版本中附加模式的说明,我们看到它说
追加模式 - 自上次触发后,只有结果表中附加的新行才会写入外部存储器。这仅适用于预计结果表中现有行不会更改的查询。
换句话说,永远不应该有任何覆盖。在您知道可以进行更新的Senario中,使用更新模式。
关于更新模式的第二个问题,在docs中,完整报价为
更新模式 - 只有自上次触发后在结果表中更新的行才会写入外部存储(自Spark 2.1.1起可用)。请注意,这与完整模式的不同之处在于此模式仅输出自上次触发后已更改的行。 如果查询不包含聚合,则它将等同于附加模式。
最后一句在这里很重要。当没有聚合(将进行实际更新)时,它等同于附加模式。因此,在此模式下,新行将正常添加,而不是简单地跳过。
为完整起见,这是目前可用的第三种模式:
完整模式 - 整个更新的结果表将写入外部存储器。由存储连接器决定如何处理整个表的写入。
documentation包含不同查询类型和支持的模式的列表以及一些有用的注释。