2

我正在尝试将数据加载到 BigQuery 中,并且加载作业无限期地保持在挂起状态(我等了大约 5 分钟)。我还需要做些什么才能将工作转移到运行状态吗?

log.log(new LogRecord(Level.INFO, "Writing to big query table"));
JobConfigurationLoad loadConf = new JobConfigurationLoad();
loadConf.setDestinationTable(new TableReference().setProjectId(PROJECT_ID)
    .setDatasetId(datasetId).setTableId(TABLE_ID));
loadConf.setWriteDisposition("WRITE_APPEND");
loadConf.setSourceUris(Arrays.asList("gs://" + bucket + "/" + "something.json"));
JobConfiguration configuration = new JobConfiguration().setLoad(loadConf);
Job loadJob = new Job().setConfiguration(configuration);
Jobs.Insert insertData = bigQuery.jobs().insert(PROJECT_ID, loadJob);
Job insertResp = insertData.execute();

JobStatus status = insertResp.getStatus();
    while (!status.getState().equals("done")) {
        System.out.println(status.getState());
        status = insertResp.getStatus();
        Thread.sleep(10000);
}
...
4

2 回答 2

1

我已经对此进行了一些研究,问题是您对同一张表执行了 2300 个导入作业,每隔几秒钟添加一个新作业。作业开始排队,因为新作业的到达速度超过了它们的处理速度。这导致了越来越长的等待时间。看起来大量作业可能是无意的,因为它们似乎都将同一个文件导入到同一个表中。顺便说一句,作业都因 invalid_value 错误而失败。

请注意,这种模式只发生在 12/20。除了这个日期之外,我找不到您运行的任何其他持续时间超过 10 分钟的工作。

于 2013-01-02T23:40:33.413 回答
1

关于没有得到最新工作结果的问题,这段代码应该可以工作(如果你添加到上面的内容:

// Insert the load job.
Job job = insertData.execute();  
JobId jobId = job.getJobId();

long startTime = System.currentTimeMillis();

while (!job.getStatus().getState().equals("DONE")) {
   // Pause execution for ten seconds before polling job status again
   Thread.sleep(10000);

   long elapsedTime = System.currentTimeMillis() - startTime;
   System.out.format("Job status (%dms) %s: %s\n", elapsedTime,
       jobId.getJobId(), job.getStatus().getState());       

   // Poll the server for job completion state.
   job = bigquery.jobs().get(projectId, jobId).execute();
}
if (job.getStatus().getErrorResult() != null) {
  // The job ended with an error.
  System.out.format("Job %s ended with error %s", job.getJobId(), 
      job.getStatus().getErrorResult().getMessage());
}
于 2013-01-04T16:05:34.650 回答