apache/beam · error

not found. Register DoFns and functions with the the…

Error message

%v not found. Register DoFns and functions with the the beam/register package.

What it means

The failResolver's Sym2Addr is the fallback symbol resolver used when a function/DoFn was never registered: it always fails for any symbol name. Beam Go serializes graph nodes as symbol names, and at deserialization time the receiving process must map names back to addresses — unregistered functions cannot be resolved.

Solutions

  1. Register every DoFn/function used in the pipeline with the beam/register package (register.DoFn2x0, register.Function, etc.) before submission.
  2. Put registrations in package init() of a file that is actually imported by the worker binary/entrypoint.
  3. Avoid anonymous/unexported DoFn types for remote execution, or register them explicitly.
  4. Check the name in the error against your registration calls — a mismatch (typo, different package path) means the registration didn't apply.

Example fix

// before
beam.ParDo(s, &myFn{}, input) // unregistered
// after
func init() { register.DoFn2x0[*string, func(string)](&myFn{}) }
beam.ParDo(s, &myFn{}, input)
Defensive patterns

Strategy: validation

Validate before calling

// ensure all functions are registered before job submission
for _, fn := range pipelineFunctions {
    if !register.IsRegistered(fn) {
        return fmt.Errorf("function %T must be registered via beam/register", fn)
    }
}

Prevention

When it happens

Trigger: Submitting a pipeline whose DoFns or helper functions were not passed to beam/register (register.Function / register.DoFn / register.Receiver / register.Emitter), commonly because the functions were constructed via reflection/literal types that were never registered, or registration happened in a package/entrypoint not linked into the worker binary.

Common situations: Using anonymous or locally-defined DoFns without registration in cross-language or remote-execution setups, registration calls placed in an init of a file not imported by the worker, upgrades where reflection-based resolution no longer covers the function, running a pipeline across processes so symbol names cannot be resolved in-process.

Related errors


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

Appendix: source

Thrown at sdks/go/pkg/beam/core/runtime/symbols.go:128

	defer mu.Unlock()

	if val, exists := cache[name]; exists {
		return val, nil
	}

	ptr, err := Resolver.Sym2Addr(name)
	if err != nil {
		return 0, err
	}
	val := reflectx.LoadFunction(ptr, t)
	cache[name] = val
	return val, nil
}

type failResolver bool

func (p failResolver) Sym2Addr(name string) (uintptr, error) {
	return 0, errors.Errorf("%v not found. Register DoFns and functions with the the beam/register package.", name)
}

View on GitHub (pinned to 12126d8942)