【问题标题】:Maintaining a global state within Apache Beam在 Apache Beam 中维护全局状态
【发布时间】:2018-11-10 20:04:24
【问题描述】:

我们有一个 PubSub 主题,其中包含进入 BigQuery 的事件(尽管特定数据库在此几乎无关紧要)。事件可能带有新的未知属性,最终应该作为单独的 BigQuery 列结束。

所以,基本上我有两个问题:

  1. 在 Pipeline 中维护全局状态的正确方法是什么(在我的例子中是一组遇到的属性)?
  2. 一旦遇到新属性并直到执行ALTER TABLE,缓冲/保持事件流的好策略是什么

现在我尝试使用以下内容(我正在使用 Spotify scio):

rows
  .withFixedWindows(Duration.millis(duration))
  .withWindow[IntervalWindow]
  .swap
  .groupByKey
  .map { case (window, rowsIterable) =>
    val newRows = findNewProperties(rowsIterable)
    mutateTableWith(newRows)
    rowsIterable
  }
  .flatMap(id)
  .saveAsBigQuery()

但这非常低效,因为我们至少需要将整个rowsIterable 加载到内存中,甚至遍历它。

【问题讨论】:

    标签: google-bigquery google-cloud-dataflow apache-beam google-cloud-pubsub spotify-scio


    【解决方案1】:

    我们正在构建同一个项目,并且我们正在关注this approach,其中包含一个包含架构的令人耳目一新的侧面输入(从 BQ 开始每隔一段时间刷新一次)。所以基本上:

    1. 在侧面输入从 BQ 加载架构
    2. 使用流模式将数据流式传输到 BQ,这样您就可以对无法插入的行执行其他操作(即:当它们具有新的未知属性时)
    3. 将那些失败的那些保存在其他地方(数据存储?)以便以后处理它们(例如在另一个作业中)
    4. 该恢复作业将发出架构更改,最终将由主管道刷新侧输入加载(步骤 1)。

    我有一个使用令人耳目一新的侧面输入方法的工作示例here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-14
      • 1970-01-01
      • 2010-10-02
      相关资源
      最近更新 更多