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