apache/beam · error

No proto encoding for PaneInfoCoder, always part of Windowed

Error message

No proto encoding for PaneInfoCoder, always part of WindowedValue codec

What it means

_maybe_use_transform_service raises ValueError when Beam is asked to launch a local expansion/transform service but neither a `java` nor a `docker` executable can be found on the system (after checking JAVA_HOME and PATH). Beam has no way to start the required JVM-based service, so pipeline expansion cannot proceed locally.

Source

Thrown at sdks/typescript/src/apache_beam/coders/required_coders.ts:642

    switch (encodingNibble) {
      case PaneInfoEncoding.NO_INDEX:
        // the header byte contains all the info
        return;
      case PaneInfoEncoding.ONE_INDEX:
        writer.int32(value.index);
        return;
      case PaneInfoEncoding.TWO_INDICES:
        writer.int32(value.index);
        writer.int32(value.onTimeIndex);
        return;
      default:
        throw new Error("Unknown PaneInfo encoding: " + encodingNibble);
    }
  }

  toProto(pipelineContext: ProtoContext): runnerApi.Coder {
    throw new Error(
      "No proto encoding for PaneInfoCoder, always part of WindowedValue codec",
    );
  }
}

requireForSerialization(`${packageName}/coders/required_coders`, exports);

View on GitHub (pinned to 12126d8942)

Solutions

  1. Install a JDK/JRE and ensure `java` is on PATH (or set JAVA_HOME).
  2. Install Docker and ensure `docker` is on PATH so Beam can use a containerized expansion service.
  3. Point expansion_service at an already-running remote expansion service so no local Java/Docker is needed.

Example fix

// before
# pipeline needs expansion service, host has no java/docker
// after
# sudo apt-get install -y default-jre  (or) use ExternalTransform(..., expansion_service='host:port')
Defensive patterns

Strategy: fallback

Validate before calling

import shutil, os
java = shutil.which('java') or (os.path.join(os.environ.get('JAVA_HOME',''), 'bin/java') if os.path.exists(os.path.join(os.environ.get('JAVA_HOME',''), 'bin/java')) else None)
docker = shutil.which('docker')
assert java or docker, 'install Java or Docker before running local expansion'

Type guard

def can_launch_expansion_service() -> bool:
    import shutil, os
    return bool(shutil.which('java') or shutil.which('docker') or (os.environ.get('JAVA_HOME') and os.path.exists(os.path.join(os.environ['JAVA_HOME'], 'bin/java'))))

Try / catch

try:
    p | ManagedRead(source='kafka')
except ValueError as e:
    if 'neither Java nor Docker' in str(e):
        rerun_with_remote_expansion_service()

Prevention

When it happens

Trigger: Running a pipeline with external/managed transforms that requires a local expansion service (no expansion_service address given) on a machine without Java or Docker installed or not on PATH.

Common situations: Minimal Docker/CI images without a JRE; Windows/macOS dev machines where Java is installed but not on PATH; using slim apache-beam install on a system without docker.

Understand the failure class

Background: "not installed", "pip install", "required for": how missing-dependency errors surface across open-source libraries — this error's family across 34 libraries.

Related errors


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