我在Google Cloud DataFlow上运行了一个Beam作业,该作业从BigQuery读取数据。当我运行这项工作时,工作需要几分钟才能开始从(小)表中读取数据。事实证明,BigQuery作业的数据流作业发送在BATCH模式下运行,而不是在交互模式下运行。如何将其切换为在Apache Beam中立即运行?我无法在API中找到更改优先级的方法。
答案 0 :(得分:1)
也许Google员工会纠正我,但不是,你不能将其从BATCH
改为INTERACTIVE
,因为它不会被Beam的API公开。
来自org.apache.beam.sdk.io.gcp.bigquery.BigQueryIO.java
(here):
private void executeQuery(
String executingProject,
String jobId,
TableReference destinationTable,
JobService jobService) throws IOException, InterruptedException {
JobReference jobRef = new JobReference()
.setProjectId(executingProject)
.setJobId(jobId);
JobConfigurationQuery queryConfig = createBasicQueryConfig()
.setAllowLargeResults(true)
.setCreateDisposition("CREATE_IF_NEEDED")
.setDestinationTable(destinationTable)
.setPriority("BATCH") <-- NOT EXPOSED
.setWriteDisposition("WRITE_EMPTY");
jobService.startQueryJob(jobRef, queryConfig);
Job job = jobService.pollJob(jobRef, JOB_POLL_MAX_RETRIES);
if (parseStatus(job) != Status.SUCCEEDED) {
throw new IOException(String.format(
"Query job %s failed, status: %s.", jobId, statusToPrettyString(job.getStatus())));
}
}
如果查询以BATCH
模式运行对您来说真的有问题,那么一种解决方法可能是:
INTERACTIVE
。BigQueryIO.Read.from()
答案 1 :(得分:0)
您可以通过传递优先级参数来配置以“交互”优先级运行查询。请查看此Github example了解详情。
请注意,当您使用批处理时,您可能会到达BigQuery limits and quotas之一,如果您达到了速率限制,查询将排队等待稍后重试。与交互式限制相反,如果达到这些限制,查询将立即失败。这是因为BigQuery假设您需要立即运行交互式查询。