Google bigquery ApacheBeamJava2.26.0:BigQueryIO';请求中不存在行';

Google bigquery ApacheBeamJava2.26.0:BigQueryIO';请求中不存在行';,google-bigquery,google-cloud-dataflow,apache-beam,Google Bigquery,Google Cloud Dataflow,Apache Beam,由于Beam2.26.0更新,我们在Java SDK流数据管道中遇到了错误。我们已经调查这一问题一段时间了,但无法找到根本原因。降级至2.25.0时,管道按预期工作 我们的管道负责摄取,即从发布/订阅中摄取并摄取到BigQuery中。具体来说,我们使用PubSubIO源和BigQueryIOsink(流模式)。在运行管道时,我们遇到以下错误: { "code" : 400, "errors" : [ { "domain"

由于Beam
2.26.0
更新,我们在Java SDK流数据管道中遇到了错误。我们已经调查这一问题一段时间了,但无法找到根本原因。降级至
2.25.0
时,管道按预期工作

我们的管道负责摄取,即从发布/订阅中摄取并摄取到BigQuery中。具体来说,我们使用
PubSubIO
源和
BigQueryIO
sink(流模式)。在运行管道时,我们遇到以下错误:

{
  "code" : 400,
  "errors" : [ {
    "domain" : "global",
    "message" : "No rows present in the request.",
    "reason" : "invalid"
  } ],
  "message" : "No rows present in the request.",
  "status" : "INVALID_ARGUMENT"
}
我们最初的猜测是,管道的逻辑不知何故被窃听,导致
BigQueryIO
接收器失败。经过调查,我们得出结论,为水槽提供的
PCollection
确实包含正确的数据

今天早些时候,我在查看时注意到,
BigQueryIO
sink收到了大量更新。我特别担心以下变化:

  • BigQuery的DATETIME类型现在映射到Beam逻辑类型org.apache.Beam.sdk.schemas.logicaltypes.SqlTypes.DATETIME
  • Java BigQuery流式插入现在默认启用超时。传递
    --HTTPWriteTimeout=0
    以恢复到旧行为
  • 关于第一次更新,我确保在生成的
    TableRow
    对象中禁用所有
    DATETIME
    。在这个特定场景中,错误仍然存在

    对于第二个更改,我不确定如何将
    --HTTPWriteTimeout=0
    标志传递给管道。如何最好地实现这一点

    关于这个问题的根本原因,还有其他建议吗


    提前谢谢

    --HTTPWriteTimeout
    是一个。您可以使用与设置跑步者相同的方式进行设置(通常在命令行上)。

    我们终于能够解决此问题,请放心,这是一次非常艰难的旅程。我们基本上调试了整个BigQueryIO连接器,并得出以下结论:

  • 转发到BigQuery的
    TableRow
    对象用于包含枚举值。由于这些数据不可序列化,一个空的有效负载被转发到BigQuery。在我看来,这个错误应该更加明确(为什么会突然改变?)

    • 通过将
      @value
      注释添加到每个枚举条目(
      com.google.api.client.util.value
      )解决了该问题
  • 同一
    TableRow
    对象还包含类型为
    byte[]
    的值。该值被注入具有
    bytes
    类型的BigQuery列中。虽然这在以前没有显式计算base64的情况下工作,但现在却产生了错误

    • 通过自己计算base64解决了这个问题(下面还将讨论此设置)

  • 你试过使用最新版本的beam吗?我试过了!最初忽略了这个问题,并假设它将在即将发布的版本中修复。问题仍然存在于
    2.28.0
    。这是针对Java SDK的,对吗?根据您所调用的更改,我猜是这样的,但最好在问题的开始处指定。我会相应地更新帖子。BigQueryOptions在中定义,可以像这样使用。设置此标志有帮助吗?是否对Beam进行了更改,使其更易于调试,或者可能是完全不需要的解决方法?嗨,Robert,感谢您的回复。使调试变得特别困难的是,我们没有得到一个关于
    TableRow
    不可序列化的错误。我觉得这个错误应该抛出一个用户可见的异常。我不确定这是Beam的一部分还是执行器的一个实现细节。