【问题标题】:What is the real difference between Append mode and Update mode in Spark Streaming?Spark Streaming 中追加模式和更新模式的真正区别是什么?
【发布时间】:2018-11-08 13:03:16
【问题描述】:

Spark Streaming 中 Append 模式和 Update 模式的真正区别是什么?

根据文档:

附加模式(默认) - 这是默认模式,其中只有新的 自上次触发后添加到结果表的行将是 输出到接收器。这仅适用于那些查询 添加到结果表的行永远不会改变。因此,这 模式保证每行只输出一次(假设 容错接收器)。例如,仅使用 select、where、 map、flatMap、filter、join等将支持Append模式。

更新模式 - (自 Spark 2.1.1 起可用)仅 自上次触发后更新的结果表将是 输出到接收器。更多信息将在未来添加 发布。

我对追加模式的困惑:它表示自上次触发后添加到结果表的新行将输出到接收器的位置“仅”。所以,例如,假设我们有三行

r1, r2, r3 到达t1, t2, t3 t1<t2<t3

现在说在 t4 行 r2 被覆盖,如果是这样,当我们在附加模式下操作时,我们永远不会在接收器中看到它?是不是像丢了一个字一样?

我对更新模式的困惑:它说“仅”结果表中自上次触发后更新的行将输出到接收器。这是否意味着行应该已经存在并且只有在现有行被更新时才会输出到接收器?如果在我们处于此更新模式时没有现有行并且有新行出现,会发生什么?

【问题讨论】:

    标签: apache-spark spark-streaming


    【解决方案1】:

    仔细查看最新版docs追加模式的描述,我们看到上面写着

    追加模式 - 只有自上次触发后追加到结果表中的新行才会写入外部存储。这仅适用于结果表中的现有行预计不会更改的查询。

    换句话说,永远不应该有任何覆盖。在您知道可以更新的场景中,使用更新模式。


    关于更新模式的第二个问题,docs 中的完整引用是

    更新模式 - 只有自上次触发后在结果表中更新的行才会写入外部存储(自 Spark 2.1.1 起可用)。请注意,这与 Complete Mode 的不同之处在于,此模式仅输出自上次触发以来已更改的行。 如果查询不包含聚合,则相当于追加模式。

    最后一句话在这里很重要。它相当于没有聚合时的追加模式(将进行实际更新)。因此,新行将在此模式下正常添加,而不是简单地跳过。


    为了完整起见,这里是当前可用的第三种模式:

    完整模式 - 整个更新的结果表将被写入外部存储。由存储连接器决定如何处理整个表的写入。

    documentation 包含不同查询类型和支持的模式的列表以及一些有用的说明。

    【讨论】:

    • 在这种情况下spark应该默认有更新模式吧?我认为这比附加模式更安全
    • @user1870400:因为追加模式保证每行只输出一次,因此更容易使用。这提供了比更新模式更好的默认值,更新模式会额外考虑更新数据。
    猜你喜欢
    • 2022-01-23
    • 2019-09-15
    • 1970-01-01
    • 2017-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多