我在Google Cloud DataFlow上运行了一个Beam作业,该作业从BigQuery读取数据 . 当我运行这项工作时,工作需要几分钟才能开始从(小)表中读取数据 . 事实证明,BigQuery作业的数据流作业发送在BATCH模式下运行,而不是在交互模式下运行 . 如何将其切换为在Apache Beam中立即运行?我无法在API中找到更改优先级的方法 .
也许一个Google员工会纠正我,但不,你不能将其从 BATCH 改为 INTERACTIVE ,因为它是's not exposed by Beam'的API .
BATCH
INTERACTIVE
来自 org.apache.beam.sdk.io.gcp.bigquery.BigQueryIO.java (here):
org.apache.beam.sdk.io.gcp.bigquery.BigQueryIO.java
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 模式下运行真的是一个问题,那么一个解决方法可能是:
直接使用BigQuery API,滚动您自己的初始请求,并将优先级设置为 INTERACTIVE .
将步骤1的结果写入临时表
在Beam管道中,使用 BigQueryIO.Read.from() 读取临时表
BigQueryIO.Read.from()
1 回答
也许一个Google员工会纠正我,但不,你不能将其从
BATCH
改为INTERACTIVE
,因为它是's not exposed by Beam'的API .来自
org.apache.beam.sdk.io.gcp.bigquery.BigQueryIO.java
(here):如果查询在
BATCH
模式下运行真的是一个问题,那么一个解决方法可能是:直接使用BigQuery API,滚动您自己的初始请求,并将优先级设置为
INTERACTIVE
.将步骤1的结果写入临时表
在Beam管道中,使用
BigQueryIO.Read.from()
读取临时表