apache/beam · error · Exception

Encountered exceptions in finalize_write: %s

Error message

Encountered exceptions in finalize_write: %s

What it means

finalize_windowed_write executes shard renames in a thread pool; all worker exceptions are collected and, if any occurred, re-raised as a single generic Exception listing them. It signals that one or more temp-shard renames failed during finalization of windowed output.

Source

Thrown at sdks/python/apache_beam/io/filebasedsink.py:431

              exceptions.append(exception)
            else:
              _LOGGER.debug('Rename successful: %s -> %s', src, dst)
          return exceptions

      if w is None or isinstance(w, window.GlobalWindow):
        # bounded input was handled by finalize_write legacy method
        # the implementation here should be called by finalize_write
        # Use a thread pool for renaming operations.
        exception_batches = util.run_using_threadpool(
            _rename_batch,
            list(zip(source_file_batch, destination_file_batch)),
            num_threads)

        all_exceptions = [
            e for exception_batch in exception_batches for e in exception_batch
        ]
        if all_exceptions:
          raise Exception(
              'Encountered exceptions in finalize_write: %s' % all_exceptions)

        yield from dst_files
      else:
        # unbounded input
        batch = list([src_files, dst_files])
        exception_batches = _rename_batch(batch)

        all_exceptions = [
            e for exception_batch in exception_batches for e in exception_batch
        ]
        if all_exceptions:
          raise Exception(
              'Encountered exceptions in finalize_write: %s' % all_exceptions)

        yield from dst_files

      _LOGGER.info(

View on GitHub (pinned to 12126d8942)

Solutions

  1. Inspect the nested all_exceptions list in the message for the root cause of each failed rename
  2. Rerun the pipeline; transient storage errors during rename typically succeed on retry
  3. Verify the writer account has permission to move/delete objects in the output bucket
  4. Ensure no other job is writing to the same file_path_prefix concurrently
Defensive patterns

Strategy: retry

Validate before calling

# pre-check rename permissions
FileSystems.match(['gs://bucket/output/*'])

Try / catch

try:
    result = pipeline.run()
    result.wait_until_finish()
except Exception as e:
    if 'Encountered exceptions in finalize_write' in str(e):
        log.error('rename failures: %s', e)  # then retry pipeline

Prevention

When it happens

Trigger: Any _rename_batch failure in the multi-threaded rename path: missing temp files, permission errors, transient GCS 5xx responses, or rename collisions when dst already exists and src differs.

Common situations: GCS throttling/outages during finalize; concurrent pipelines renaming the same output; bucket permissions that allow create but not delete of temp files.

Related errors


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