apache/beam · error · NotImplementedError

interactive support will come later!

Error message

interactive support will come later!

What it means

DaskRunner.run_pipeline detects an interactive notebook environment; running a pipeline from a notebook cells via DaskRunner is not implemented (tracked as a TODO), so the runner refuses rather than behaving incorrectly.

Solutions

  1. Run the pipeline from a regular Python script/REPL instead of a notebook.
  2. Clear/override notebook detection context if your environment is falsely detected as a notebook.
  3. Use a different runner (DirectRunner) inside notebooks and DaskRunner only in scripts.

Example fix

// before (in notebook)
p = beam.Pipeline(runner='DaskRunner')
// after (move to script.py)
# script.py executed with python script.py
p = beam.Pipeline(runner='DaskRunner')
Defensive patterns

Strategy: validation

Validate before calling

from apache_beam.runners.dask.dask_runner import is_in_notebook
if is_in_notebook():
    raise RuntimeError('DaskRunner cannot run in notebooks; use a script.')

Try / catch

try:
    with beam.Pipeline(runner='DaskRunner', options=opts) as p:
        ...
except NotImplementedError as e:
    logging.error('Notebook unsupported for DaskRunner: %s', e)

Prevention

When it happens

Trigger: Calling `beam.Pipeline(runner='DaskRunner')` (or DaskRunner().run_pipeline) from inside a Jupyter/IPython notebook session where `is_in_notebook()` returns True.

Common situations: Developers prototyping Beam pipelines in Jupyter with --runner=DaskRunner; they hit this immediately since notebook detection is automatic.

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/006a687132e5829d. Report an issue: GitHub.

Appendix: source

Thrown at sdks/python/apache_beam/runners/dask/dask_runner.py:230

                    si._view_options(),
                    DaskBagWindowedIterator(si_asbag, si._window_mapping_fn)))

          op_kws["side_inputs"] = bag_side_inputs

        self.bags[transform_node] = op.apply(**op_kws)

    return DaskBagVisitor()

  @staticmethod
  def is_fnapi_compatible():
    return False

  def run_pipeline(self, pipeline, options):
    import dask

    # TODO(alxmrs): Create interactive notebook support.
    if is_in_notebook():
      raise NotImplementedError('interactive support will come later!')

    try:
      import dask.distributed as ddist
    except ImportError:
      raise ImportError(
          'DaskRunner is not available. Please install apache_beam[dask].')

    dask_options = options.view_as(DaskOptions).get_all_options(
        drop_default=True, current_only=True)
    bag_kwargs = DaskOptions._extract_bag_kwargs(dask_options)
    client = ddist.Client(**dask_options)

    pipeline.replace_all(dask_overrides())

    dask_visitor = self.to_dask_bag_visitor(bag_kwargs)
    pipeline.visit(dask_visitor)
    # The dictionary in this visitor keeps a mapping of every Beam
    # PTransform to the equivalent Bag operation. This is highly

View on GitHub (pinned to 12126d8942)