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
- Upgrade prism (and the Go SDK) to a version that supports the coder URN in the panic message
- Pin SDK and runner to the same Beam release
- Check the URN printed in the panic for typos or non-standard custom coders and remove them
- 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
- Pin all SDKs and the runner to the same Beam release
- Check cross-language transform docs for coder support before use
- Scan pipeline coder URNs against your prism version's supported set
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
- KV coder with more than 2 components: %s
- WindowedValue coder with more than 2 components: %s
- ShardedKey coder must have only 1 component: %s
- Runner forgot to LP this Row Coder. %v
- %v
AI-assisted analysis of apache/beam@12126d8942 (2026-09-13).
Data as JSON: /api/errors/7ffb34f21efdb559.
Report an issue: GitHub.