apache/beam · error · IOException

Unable to insert job: %s, aborting after %d .

Error message

Unable to insert job: %s, aborting after %d .

What it means

BigQueryIO throws this IOException in JobInsertionRetriesWhenFailureSucceedingPermission startJob after exhausting MAX_RPC_RETRIES attempts to insert a BigQuery job via the Jobs.insert RPC. Each failed insert is logged and retried with backoff; once the backoff is exhausted, the last exception is attached and this error is thrown. It indicates the job (query/load/copy/export) could never be submitted to BigQuery.

Source

Thrown at sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/bigquery/BigQueryServicesImpl.java:402

          if (errorExtractor.itemAlreadyExists(e)) {
            LOG.info("BigQuery job {} already exists, will not retry inserting it:", jobRef, e);
            return; // SUCCEEDED
          }

          try (QuotaEventCloseable qec =
              errorExtractor.quotaExceeded(e) || errorExtractor.rateLimited(e)
                  ? new QuotaEvent.Builder()
                      .withFullResourceName(BigQueryHelpers.toJobFullResourceName(jobRef))
                      .withOperation("start_job")
                      .create()
                  : null) {
            // ignore and retry
            LOG.info("Failed to insert job {}, will retry:", jobRef, e);
          }
          lastException = e;
        }
      } while (nextBackOff(sleeper, backoff));
      throw new IOException(
          String.format(
              "Unable to insert job: %s, aborting after %d .", jobRef.getJobId(), MAX_RPC_RETRIES),
          lastException);
    }

    static void startJobStream(
        Job job,
        AbstractInputStreamContent streamContent,
        ApiErrorExtractor errorExtractor,
        Bigquery client,
        Sleeper sleeper,
        BackOff backOff)
        throws IOException, InterruptedException {
      JobReference jobReference = job.getJobReference();
      Exception exception;
      do {
        try {
          client

View on GitHub (pinned to 12126d8942)

Solutions

  1. Inspect lastException (the cause) for the actual API error reason from Jobs.insert
  2. Grant the executing service account the BigQuery Job User (bigquery.jobs.create) role in the target project
  3. Verify the project id and job configuration (table refs, write disposition) are correct
  4. Check BigQuery quotas and status page for outages or rate limits
  5. Increase retry tolerance by addressing per-attempt errors rather than MAX_RPC_RETRIES itself

Example fix

// before: service account lacks job-insert permission
// gcloud projects add-iam-policy-binding MY_PROJECT --member=serviceAccount:... --role=roles/bigquery.jobUser
// after: permission granted so Jobs.insert succeeds
Defensive patterns

Strategy: retry

Validate before calling

// Pre-check job creation permission before running the pipeline
try {
  bigquery.jobs().insert(projectId, new Job().setJobReference(testRef)
      .setConfiguration(new JobConfiguration().setDryRun(true))).execute();
} catch (GoogleJsonResponseException e) {
  if (e.getStatusCode() == 403) throw new IllegalStateException("Missing bigquery.jobs.create permission");
}

Try / catch

try {
  jobService.startJob(jobReference, queryConfiguration);
} catch (IOException e) {
  Throwable cause = e.getCause();
  if (cause instanceof GoogleJsonResponseException
      && ((GoogleJsonResponseException) cause).getStatusCode() == 403) {
    throw new SecurityException("Service account lacks BigQuery Job User role", cause);
  }
  throw e; // otherwise rely on BigQueryServices' internal backoff
}

Prevention

When it happens

Trigger: Any call that starts a BigQuery job (query job start via JobService) where Jobs.insert fails on every retry — e.g. persistent permission denied on the project, invalid project/job configuration, or a sustained BigQuery API outage.

Common situations: Service account missing bigquery.jobs.create permission; wrong project id in the job reference; malformed job configuration rejected by the API; project quota exhausted for job insertions; long-running BigQuery outage during pipeline startup.

Understand the failure class

Background: "API request failed": what wrapped HTTP errors from external APIs mean and how to find the real cause — this error's family across 29 libraries.

Related errors


AI-assisted analysis of apache/beam@12126d8942 (2026-09-13). Data as JSON: /api/errors/8186d7bd6e56bf42. Report an issue: GitHub.