apache/beam · critical

unknown coder urn key: %v

Error message

unknown coder urn key: %v

What it means

prism's pullDecoderNoAlloc switches on the coder URN and panics for any URN it doesn't recognize. This means the SDK sent a coder type prism has no decoding implementation for — usually a newer coder URN unknown to this prism build.

Source

Thrown at sdks/go/pkg/beam/runners/prism/internal/coders.go:384

		return func(r io.Reader) {
			ed(r)
			wd(r)
		}
	case urns.CoderShardedKey:
		ccids := c.GetComponentCoderIds()
		if len(ccids) != 1 {
			panic(fmt.Sprintf("ShardedKey coder must have only 1 component: %s", prototext.Format(c)))
		}
		kd := pullDecoderNoAlloc(coders[ccids[0]], coders)
		return func(r io.Reader) {
			l, _ := coder.DecodeVarInt(r)
			ioutilx.ReadN(r, int(l))
			kd(r)
		}
	case urns.CoderRow:
		panic(fmt.Sprintf("Runner forgot to LP this Row Coder. %v", prototext.Format(c)))
	default:
		panic(fmt.Sprintf("unknown coder urn key: %v", urn))
	}
}

// debugCoder is developer code to get the structure of a proto coder visible when
// debugging coder errors in prism. It may sometimes be unused, so we do this to avoid
// linting errors.
var _ = debugCoder

func debugCoder(cid string, coders map[string]*pipepb.Coder) string {
	var b strings.Builder
	b.WriteString(cid)
	b.WriteRune('\n')
	c := coders[cid]
	if len(c.ComponentCoderIds) > 0 {
		b.WriteRune('\t')
		b.WriteString(strings.Join(c.ComponentCoderIds, ", "))
		b.WriteRune('\n')
		for _, ccid := range c.GetComponentCoderIds() {

View on GitHub (pinned to 12126d8942)

Solutions

  1. Upgrade prism (and the Go SDK) to a version that supports the coder URN in the panic message
  2. Pin SDK and runner to the same Beam release
  3. Check the URN printed in the panic for typos or non-standard custom coders and remove them
  4. Report unsupported URN to the Beam project if it should be supported

Example fix

// before: custom coder urn injected into pipeline
coderUrn := "beam:coders:my_custom:v1"
// after: use standard supported coders or upgrade prism to a version that handles the URN
Defensive patterns

Strategy: validation

Validate before calling

supported := map[string]bool{"beam:coders:kv:v1": true, "beam:coders:windowed_value:v1": true, "beam:coders:sharded_key:v1": true, /* ... */}
if !supported[coder.GetUrn()] { return fmt.Errorf("unsupported coder urn for prism: %s", coder.GetUrn()) }

Try / catch

defer func() { if r := recover(); r != nil { log.Errorf("unknown coder urn panicked: %v", r) } }()

Prevention

When it happens

Trigger: The default branch of the coder URN switch is reached: the proto coder's URN is not one of the handled urns (KV, WindowedValue, ShardedKey, etc.), e.g. an SDK version introduced a coder type this prism doesn't know.

Common situations: Version skew: pipeline submitted by a newer SDK than the prism runner; custom/forked coders registered with non-standard URNs; cross-language pipelines where one SDK emits coder types Go prism lacks.

Understand the failure class

Background: UnsupportedOperationException and "is not supported" errors: when a library deliberately refuses a call — this error's family across 30 libraries.

Related errors


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