Google bigquery ApacheBeamJava2.26.0:BigQueryIO';请求中不存在行';
由于BeamGoogle 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"
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收到了大量更新。我特别担心以下变化:
--HTTPWriteTimeout=0
以恢复到旧行为TableRow
对象中禁用所有DATETIME
。在这个特定场景中,错误仍然存在
对于第二个更改,我不确定如何将--HTTPWriteTimeout=0
标志传递给管道。如何最好地实现这一点
关于这个问题的根本原因,还有其他建议吗
提前谢谢
--HTTPWriteTimeout
是一个。您可以使用与设置跑步者相同的方式进行设置(通常在命令行上)。我们终于能够解决此问题,请放心,这是一次非常艰难的旅程。我们基本上调试了整个BigQueryIO连接器,并得出以下结论:
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的一部分还是执行器的一个实现细节。