Google bigquery 谷歌发布/订阅数据流,避免记录ID重复

Google bigquery 谷歌发布/订阅数据流,避免记录ID重复,google-bigquery,google-cloud-platform,google-cloud-dataflow,google-cloud-pubsub,spotify-scio,Google Bigquery,Google Cloud Platform,Google Cloud Dataflow,Google Cloud Pubsub,Spotify Scio,我正在尝试构建一个流数据流作业,它从Pub/Sub读取事件并将它们写入BigQuery 根据文档,如果使用记录ID,数据流可以检测重复的消息传递(请参阅:) 但是即使使用这个记录ID,我仍然有一些重复的 (约0.0002%) 我错过什么了吗 编辑: 我使用以下snipplet发布消息: Message .builder() .data(new String(Base64.encodeBase64(json.getBytes()))) .attributes("

我正在尝试构建一个流数据流作业,它从Pub/Sub读取事件并将它们写入BigQuery

根据文档,如果使用记录ID,数据流可以检测重复的消息传递(请参阅:)

但是即使使用这个记录ID,我仍然有一些重复的 (约0.0002%)

我错过什么了吗

编辑:

我使用以下snipplet发布消息:

Message
      .builder()
      .data(new String(Base64.encodeBase64(json.getBytes())))
      .attributes("myid", id, "mytimestamp", timestamp.toString)
      .build()
然后我使用从pub/sub读取消息并将其保存到数据流:

val input = sc.withName("ReadFromSubscription")
              .pubsubSubscription(subscriptionName, "myid", "mytimestamp")
input
    .withName("FixedWindow")
    .withFixedWindows(windowSize)  // apply windowing logic
    .toWindowed  // convert to WindowedSCollection
    //
    .withName("ParseJson")
    .map { wv =>
      wv.copy(value = TableRow(
        "message_id" -> (Json.parse(wv.value) \ "id").as[String],
        "message" -> wv.value)
      )
    }
    //
    .toSCollection  // convert back to normal SCollection
    //
    .withName("SaveToBigQuery")
    .saveAsBigQuery(bigQueryTable(opts), BQ_SCHEMA, WriteDisposition.WRITE_APPEND)
窗口大小为1分钟

在注入消息几秒钟后,我在BigQuery中已经有了重复的消息

我使用此查询统计重复项:

SELECT 
   COUNT(message_id) AS TOTAL, 
   COUNT(DISTINCT message_id) AS DISTINCT_TOTAL 
FROM my_dataset.my_table

//returning 273666  273564
这是一个用来观察它们的例子:

SELECT *
FROM my_dataset.my_table
WHERE message_id IN (
  SELECT message_id
  FROM my_dataset.my_table
  GROUP BY message_id
  HAVING COUNT(*) > 1
) ORDER BY message_id

//returning for instance:
row|id                                    | processed_at           | processed_at_epoch    
1   00166a5c-9143-3b9e-92c6-aab52601b0be    2017-02-02 14:06:50 UTC 1486044410367   { ...json1... }  
2   00166a5c-9143-3b9e-92c6-aab52601b0be    2017-02-02 14:06:50 UTC 1486044410368   { ...json1... }  
3   00354cc4-4794-3878-8762-f8784187c843    2017-02-02 13:59:33 UTC 1486043973907   { ...json2... }  
4   00354cc4-4794-3878-8762-f8784187c843    2017-02-02 13:59:33 UTC 1486043973741   { ...json2... } 
5   0047284e-0e89-3d57-b04d-ebe4c673cc1a    2017-02-02 14:09:10 UTC 1486044550489   { ...json3... } 
6   0047284e-0e89-3d57-b04d-ebe4c673cc1a    2017-02-02 14:08:52 UTC 1486044532680   { ...json3... }
报告指出,可能会出现罕见的重复出现的情况:

  • “BigQuery会记住此ID至少一分钟”--如果数据流在重试前花费一分钟以上,则insert BigQuery可能允许重复输入。您可以查看管道中的日志,以确定是否存在这种情况
  • “在罕见的谷歌数据中心意外失去连接的情况下,自动重复数据消除可能无法实现。”

  • 您可能想尝试使用的说明。这还将允许您查看与每行一起使用的
    insertID
    ,以确定问题是在数据流端(为同一记录生成不同的
    insertID
    )还是在BigQuery端(无法根据行的
    insertID
    删除重复数据).

    您能否详细说明如何使用记录ID和测量重复项?从文档中注意到,“Dataflow不会对间隔超过10分钟发布到发布/订阅的具有相同记录ID值的邮件执行此重复数据消除。”这可能会导致您观察到重复数据吗?我添加了更多信息:)