在app引擎上运行BigQuery加载作业会陷入挂起状态

时间:2012-12-20 15:36:24

标签: google-app-engine google-bigquery

我正在尝试将数据加载到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);
}
...

2 个答案:

答案 0 :(得分:1)

我有点挖掘这个问题,问题是你在同一张桌子上做了2300个导入作业,每隔几秒就添加一个新作业。这些工作开始排队,因为新工作的到货时间比他们处理的要快。这导致更长和更长的待处理时间。看起来大量的工作可能是无意的,因为它们似乎都将同一个文件导入到同一个表中。顺便说一句,所有作业都因invalid_value错误而失败。

请注意,此模式仅发生在12/20。除了这个日期,我找不到你跑过的持续时间超过10分钟的其他工作。

答案 1 :(得分: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());
}