2017-05-26 90 views
0

我在Google Cloud DataFlow上运行Beam作业,该作业从BigQuery中读取数据。当我运行这项工作时,需要几分钟的时间才能开始从(小)表中读取数据。事实证明,BigQuery作业的数据流作业发送在BATCH模式下运行,而不是在交互模式下运行。我该如何切换到在Apache Beam中立即运行?我无法在API中找到更改优先级的方法。更改Google Cloud Dataflow BigQuery Priority

回答

1

也许一个Google员工会纠正我,但是不能,您不能将此从BATCH更改为INTERACTIVE,因为它没有被Beam的API公开。

org.apache.beam.sdk.io.gcp.bigquery.BigQueryIO.javahere):

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模式下运行你的问题,然后一个解决办法可能是:

  1. 直接使用的BigQuery API ,滚动您自己的初始请求,并将优先级设置为INTERACTIVE
  2. 写步骤1的结果到一个临时表
  3. 在你的梁管道,读取使用临时表BigQueryIO.Read.from()
+0

呀不幸的是,因为我需要我的ETL作业在启动一个解决办法是行不通的日程安排的时间不会在未来的某个时间点。谢谢你的想法。 – Jimmy

+0

我不关注。为什么这不适合你? –

+0

我原以为通过将BigQueryIO移动到第2步,我们仍然需要等待该作业开始。 – Jimmy

相关问题