【发布时间】:2021-03-09 15:43:01
【问题描述】:
自从 Beam 2.26.0 更新以来,我们在 Java SDK 流数据管道中遇到了错误。我们已经对该问题进行了相当长的一段时间的调查,但无法找到根本原因。降级到 2.25.0 时,管道按预期工作。
我们的管道负责提取,即从 Pub/Sub 消耗并提取到 BigQuery。具体来说,我们使用PubSubIO 源和BigQueryIO 接收器(流模式)。在运行管道时,我们遇到以下错误:
{
"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 输入接收器确实包含正确的数据。
今天早些时候,我查看了changelog 并注意到BigQueryIO 接收器收到了许多更新。我特别担心以下变化:
- BigQuery 的 DATETIME 类型现在映射到 Beam 逻辑类型 org.apache.beam.sdk.schemas.logicaltypes.SqlTypes.DATETIME
- Java BigQuery 流式插入现在默认启用超时。传递
--HTTPWriteTimeout=0以恢复旧行为
关于第一次更新,我确保在生成的TableRow 对象中禁用所有DATETIME。在这种特定情况下,错误仍然存在。
对于第二个更改,我不确定如何将 --HTTPWriteTimeout=0 标志传递给管道。如何最好地做到这一点?
关于此问题的根本原因还有其他建议吗?
提前致谢!
【问题讨论】:
-
您是否尝试过使用
2.28- 最新版本的光束? -
我做到了!最初忽略了这个问题,并认为它会在即将发布的版本中得到修复。
2.28.0中仍然存在问题。 -
这是给 Java SDK 的,对吧?我猜是根据您提出的更改,但最好在问题的开头指定。
-
确实,Java SDK。我会相应地更新帖子。
-
BigQueryOptions 在github.com/apache/beam/blob/master/sdks/java/io/… 中定义,可以像beam.apache.org/releases/javadoc/2.28.0/org/apache/beam/sdk/… 一样使用。设置这个标志有帮助吗?
标签: google-bigquery google-cloud-dataflow apache-beam