更改Google Cloud Dataflow BigQuery优先级

时间:2017-05-26 10:09:07

标签: google-bigquery google-cloud-dataflow apache-beam

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

2 个答案:

答案 0 :(得分: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. 在Beam管道中,使用BigQueryIO.Read.from()
  4. 读取临时表

答案 1 :(得分:0)

您可以通过传递优先级参数来配置以“交互”优先级运行查询。请查看此Github example了解详情。

请注意,当您使用批处理时,您可能会到达BigQuery limits and quotas之一,如果您达到了速率限制,查询将排队等待稍后重试。与交互式限制相反,如果达到这些限制,查询将立即失败。这是因为BigQuery假设您需要立即运行交互式查询。