当前位置: 首页 > 知识库问答 >
问题:

更改Google Cloud Dataflow BigQuery优先级

许华清
2023-03-14

我有一个在Google Cloud DataFlow上运行的Beam作业从BigQuery读取数据。当我运行作业时,作业需要几分钟的时间才能开始从(微小)表读取数据。结果表明,数据流作业发送的是一个BigQuery作业,该作业以批处理模式运行,而不是以交互模式运行。如何切换到在Apache Beam中立即运行?我在API中找不到一个方法来更改优先级。

共有2个答案

阙阳
2023-03-14

您可以通过传递一个优先级参数来配置以“交互式”优先级运行查询。有关详细信息,请查看这个Github示例。

请注意,您可能达到了BigQuery限制和配额之一,因为当您使用batch时,如果您达到了速率限制,查询将排队并稍后重试。与交互式查询相反,如果达到这些限制,查询将立即失败。这是因为BigQuery假设交互式查询是您需要立即运行的。

姬阳曜
2023-03-14

也许Googler会纠正我,但不,您不能将其从批处理更改为交互式,因为它没有被Beam的API公开。

org.apache.beam.sdk.io.gcp.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())));
  }
}

如果查询以批处理模式运行对您来说确实是一个问题,那么一种解决方法可以是:

  1. 直接使用BigQuery API,滚动您自己的初始请求,并将优先级设置为interactive
  2. 将步骤1的结果写入临时表
  3. 在束流管道中,使用bigQueryIo.read.from()
  4. 读取临时表
 类似资料:
  • 问题内容: 我正在尝试使用来使用排序对象。 这很容易实现,但是对象类变量(比较器用来计算优先级)在初始插入后可能会更改。大多数人提出了一种简单的解决方案,即删除对象,更新值并再次将其重新插入,因为这是优先级队列的比较器投入使用的时候。 除了围绕PriorityQueue创建包装器类之外,还有其他更好的方法吗? 问题答案: 你必须删除并重新插入,因为队列的工作原理是在插入新元素时将它们放置在适当的位

  • 我在这个问题上发现了一些类似的问题,但我想再问一遍,以便得到一个更明确的答案。我正在编写一个图匹配算法,其中图上的每个节点分配给一个优先级集,取决于其邻居的匹配。细节其实并不重要,但我使用了std::priority_queue以便首先匹配最高优先级的节点。这里有一个棘手的问题:每次引入一个新的匹配,匹配节点的邻居的优先级将被更新。 我的问题自然是,如何更新新匹配的顺序?我能强制执行吗?或者是否有

  • 我现在根据我的算法更改任务优先级,我想将这些任务交给虚拟机,我如何在cloudsim中完成?

  • 问题内容: 我有一个Python程序,它执行耗时的计算。由于它使用高CPU,并且我希望系统保持响应状态,因此我希望程序将其优先级更改为低于正常值。 我发现了这一点: 在Windows中设置进程优先级- ActiveState 但我正在寻找一种跨平台的解决方案。 问题答案: 这是我用来将进程设置为低于正常优先级的解决方案: 在Windows和Linux上的Python 2.6上进行了测试。

  • 问题内容: 我需要在与另一个Java应用程序分开的JVM中调用.jar文件,它非常占用CPU,因此应以后台优先级运行,以免影响系统的其余部分。有没有跨平台的方法可以做到这一点? 问题答案: 简单的答案是,没有可移植的方法来更改Java中进程的优先级。(线程-是,进程-否。) 如果您的Java应用程序需要启动一个新的JVM来运行CPU密集型应用程序,那么很可能它不是完全可移植的。例如,通常需要提供j

  • 我正在寻找一种通过优先级和先到先服务(FCFS)调度线程的方法,如果两个线程具有相同的优先级。我在考虑使用一堆队列或类似的东西。问题是,即使我实现了自己的优先级队列,更改优先级的能力也会破坏插入到该队列的顺序。