BigQuery 无法插入作业。工作流失败
Posted
技术标签:
【中文标题】BigQuery 无法插入作业。工作流失败【英文标题】:BigQuery unable to insert job. Workflow failed 【发布时间】:2018-09-13 08:55:43 【问题描述】:我需要通过 Dataflow 和 Beam 将批处理作业从 GCS 运行到 BigQuery。我所有的文件都是具有相同架构的 avro。 我创建了一个数据流 Java 应用程序,它在一组较小的数据(~1gb,大约 5 个文件)上成功。 但是当我尝试在更大的数据集(>500gb,>1000 个文件)上运行它时,我收到一条错误消息
java.lang.RuntimeException: org.apache.beam.sdk.util.UserCodeException: java.lang.RuntimeException: Failed to create load job with id prefix 1b83679a4f5d48c5b45ff20b2b822728_6e48345728d4da6cb51353f0dc550c1b_00001_00000, reached max retries: 3, last failed load job: ...
在 3 次重试后,它会终止:
Workflow failed. Causes: S57....... A work item was attempted 4 times without success....
这一步是对 BigQuery 的加载。
堆栈驱动程序说处理卡在步骤 ....for 10m00s... 和
Request failed with code 409, performed 0 retries due to IOExceptions, performed 0 retries due to unsuccessful status codes.....
我查找了 409 错误代码,说明我可能有一个现有的作业、数据集或表。我已删除所有表并重新运行应用程序,但仍显示相同的错误消息。
我目前限制在 65 名工人,我让他们使用 n1-standard-4 cpus。
我相信还有其他方法可以将数据从 gcs 移动到 bq,但我需要演示数据流。
【问题讨论】:
您是否在 BigQuery 端使用目标表?你为创建和写指定了什么样的配置? 目标表已设置。如果我使用较小的批次(~1gb)运行数据流,它会加载得很好。处置是: .withCreateDisposition(BigQueryIO.Write.CreateDisposition.CREATE_IF_NEEDED) .withWriteDisposition(BigQueryIO.Write.WriteDisposition.WRITE_APPEND)); 很奇怪……你能不能先用大数据集运行作业,然后再用小数据集运行它? 我在加载大数据时也遇到了同样的错误。你能解决这个问题吗?请让我知道,我仍在寻找解决方案。谢谢! @andrew 远射,但您是否可能在表名中包含受限字符?我收到了同样模糊的错误消息,结果是在我的表名中包含连字符。 【参考方案1】:将@DeaconDesperado 的评论发布为社区 wiki,他们遇到了同样的错误,他们所做的是删除表名和错误消失了。
【讨论】:
【参考方案2】:"java.lang.RuntimeException: 无法使用前缀 beam_load_csvtobigqueryxxxxxxxxxxxxxx 创建作业,达到最大重试次数:3,最后失败的作业:null。 在 org.apache.beam.sdk.io.gcp.bigquery.BigQueryHelpers$PendingJob.runJob(BigQueryHelpers.java:198)....."
可能的原因之一可能是权限问题。确保与 BigQuery 交互的用户帐户在预定义角色“*BigQuery User”中具有“bigquery.jobs.create”权限【讨论】:
【参考方案3】:我在使用“roles/bigquery.jobUser”、“roles/bigquery.dataViewer”和“roles/bigquery.user”时遇到了同样的问题。但只有在授予“roles/bigquery.admin”时,问题才得到解决。
【讨论】:
以上是关于BigQuery 无法插入作业。工作流失败的主要内容,如果未能解决你的问题,请参考以下文章
在使用 BigQuery API 的 python 插入作业期间登录失败
BigQuery 数据传输作业因内部错误而失败(错误:80038528)
数据流作业失败并尝试在 Bigquery 上创建 temp_dataset