본문으로 건너뛰기
cccskills
무료GitHub에 공개

adding-new-metadata

Guides adding metadata, extra information attached to data elements, to Apache Beam's WindowedValue. Maps the changes needed across serialization, storage, processing, and runner interfaces so new fields remain available during pipeline execution.

한국어 요약은 준비 중입니다. 영어 요약을 표시하고 있습니다.

원문원문 설명 보기

Guide on how to add and propagate new metadata fields in Apache Beam's WindowedValue, extending protos, windmill persistence, and runner interfaces to avoid metadata loss.

설치 방법 보기

이럴 때 유용합니다

  • Adding trace context or drain flags to WindowedValue
  • Checking metadata preservation through Windmill storage
  • Reviewing propagation through grouping and timers
  • Exposing new metadata as DoFn parameters

포함된 파일(1)

  • SKILL.md8.7 KB

SKILL.md(원문)

설치하기 전에 에이전트에게 전달되는 지시 내용을 확인할 수 있습니다.

Adding New Metadata to WindowedValue

This skill provides a comprehensive guide on adding new metadata (e.g., CDC metadata, drain mode flags, OpenTelemetry trace context) to Apache Beam's WindowedValue and ensuring it propagates correctly through the execution engine. Failing to propagate metadata in all necessary places will result in metadata loss during pipeline execution.

1. Extending the Proto Model

When adding new metadata that must cross worker boundaries or be serialized by the Fn API, the proto definitions must be updated.

  • Key Files: model/fn-execution/src/main/proto/org/apache/beam/model/fn_execution/v1/beam_fn_api.proto
  • Action: Add the new metadata field to the appropriate message (ElementMetadata).
  • Note: Add proper documentation in proto. Type of the field can be different from the type in WindowedValue, see OpenTelemetry trace context for example.

2. WindowedValue Interface and Implementations

The WindowedValue is the core container for elements flowing through a Beam pipeline. It holds the value, timestamp, windows, pane info, and any additional metadata.

Core Interface Updates

  • Key File: sdks/java/core/src/main/java/org/apache/beam/sdk/values/WindowedValue.java
  • Action: Add getter methods for your new metadata.

Concrete Implementations

You must update all concrete implementations of WindowedValue to store and return the new metadata. If you miss one, metadata will be silently dropped.

  • ValueInGlobalWindow
  • ValueInSingleWindow
  • ValueInEmptyWindows (often used inside runners, like Dataflow's worker package)
  • Action: Update constructors, factory methods (of()), fields in these classes and coders.

OutputBuilder vs. Context Output

  • IMPORTANT: Do not add new arguments to legacy methods like context.outputWindowedValue(...) or WindowedValue.of(value, timestamp, windows, pane). This causes brittleness and breaks the API for every new metadata field.
  • Action: Modify OutputBuilder (sdks/java/core/src/main/java/org/apache/beam/sdk/values/OutputBuilder.java) to accept the new metadata (e.g., .withDrainMode(...), .withTraceContext(...)). Use the builder pattern when constructing outputs to propagate offset and record IDs smoothly.

3. Windmill Persistence (Dataflow Streaming Engine) Runner v1

For the Dataflow streaming runner, metadata must survive serialization to and from the Windmill backend.

  • Serialization (Sink):
    • File: runners/google-cloud-dataflow-java/worker/src/main/java/org/apache/beam/runners/dataflow/worker/WindmillSink.java
    • Action: Extract the metadata from the WindowedValue, and add it to already created ElementMetadata proto builder.
  • Deserialization (Reader):
    • Files: runners/google-cloud-dataflow-java/worker/src/main/java/org/apache/beam/runners/dataflow/worker/UngroupedWindmillReader.java and WindowingWindmillReader.java
    • Action: Extract the metadata from ElementMetadata proto and reconstruct the WindowedValue using the updated factory methods/builders that include the metadata. This is incremental work, as plenty of metadata is already extracted from the proto.

4. Propagation Across Core Classes

Metadata must be explicitly copied or forwarded whenever a WindowedValue is transformed, buffered, or processed.

DoFn Runners (Java Core)

You must ensure that when a DoFn processes an element and outputs a new element, the appropriate metadata from the input is propagated to the output (unless explicitly changed by the logic).

  • runners/core-java/src/main/java/org/apache/beam/runners/core/SimpleDoFnRunner.java
  • runners/core-java/src/main/java/org/apache/beam/runners/core/StatefulDoFnRunner.java
  • runners/core-java/src/main/java/org/apache/beam/runners/core/LateDataDroppingDoFnRunner.java
  • runners/core-java/src/main/java/org/apache/beam/runners/core/ProcessFnRunner.java
  • sdks/java/harness/src/main/java/org/apache/beam/fn/harness/FnApiDoFnRunner.java

Action: When these runners call outputWindowedValue(), they should extract the metadata from the input or current context and attach it using the OutputBuilder or the new WindowedValue interfaces.

Grouping and Reducing

  • runners/core-java/src/main/java/org/apache/beam/runners/core/ReduceFnRunner.java
  • runners/core-java/src/main/java/org/apache/beam/runners/core/ReduceFnContextFactory.java
  • Action: Ensure that during GroupByKey/Combine operations, if metadata needs to be preserved (e.g., CausedByDrain), it is correctly passed into the ReduceFnContextFactory and propagated when outputting the grouped results.

Splittable DoFns (SDF)

  • runners/core-java/src/main/java/org/apache/beam/runners/core/OutputAndTimeBoundedSplittableProcessElementInvoker.java
  • sdks/java/core/src/main/java/org/apache/beam/sdk/util/construction/SplittableParDoNaiveBounded.java

Timers

If metadata needs to survive timer firings (e.g., knowing an @OnTimer fired because of a system drain), it must be added to Timer data structures. This is a bit of uncharted area which was only implemented for CausedByDrain metadata that comes from backend, not from persisted metadata. In order to persist all WindowedValue metadata across timer, more work has to be done, below are some pointers:

  • runners/core-java/src/main/java/org/apache/beam/runners/core/TimerInternals.java and implementations (e.g., WindmillTimerInternals.java in Dataflow).
  • Action: Add the field to TimerData, next to CausedByDrain. Propagate it when setting the timer and expose it when the timer fires so it bubbles up.
  • Eventually, metadata from Timer lands in WindowedValue, so it can be exposed to users. Keep field names, types, and getters similar to WindowedValue as much as possible, as common interface may be introduced eventually.

5. Exposing Metadata to the User (DoFn Signatures)

User needs to access the metadata in their DoFn (e.g., @ProcessElement public void process(ProcessContext c, CausedByDrain drain) { ... }), you must update the reflection and bytecode generation logic.

  • Files:
    • sdks/java/core/src/main/java/org/apache/beam/sdk/transforms/reflect/DoFnSignatures.java
    • sdks/java/core/src/main/java/org/apache/beam/sdk/transforms/reflect/DoFnSignature.java
    • sdks/java/core/src/main/java/org/apache/beam/sdk/transforms/reflect/DoFnInvoker.java
    • sdks/java/core/src/main/java/org/apache/beam/sdk/transforms/reflect/ByteBuddyDoFnInvokerFactory.java
  • Action: Add logic to detect the new parameter type in the DoFn method signature. Generate bytecode using ByteBuddy to extract the property from the WindowedValue or context and pass it as an argument during method invocation.

Checklist for Adding New Metadata

  1. Define the metadata in beam_fn_api.proto (if applicable).
  2. Add getters to the WindowedValue interface.
  3. Update ValueInGlobalWindow, ValueInSingleWindow, ValueInEmptyWindows to store the metadata.
  4. Update OutputBuilder to accept the metadata.
  5. Update WindmillSink to serialize the metadata to the backend.
  6. Update UngroupedWindmillReader and WindowingWindmillReader to deserialize the metadata.
  7. Update WindmillKeyedWorkItem.
  8. Update SimpleDoFnRunner, StatefulDoFnRunner, and FnApiDoFnRunner to propagate the metadata from input to output.
  9. Update ReduceFnRunner and OutputAndTimeBoundedSplittableProcessElementInvoker for complex transform propagation.
  10. If required by timers, update TimerData and TimerInternals.
  11. If exposed to the user, update DoFnSignatures and ByteBuddyDoFnInvokerFactory.
  12. Update other runners (Flink, Spark) to ensure they propagate the new WindowedValue fields correctly in their specific operators/runners.

리뷰

아직 리뷰가 없습니다. 사용해 본 소감을 남겨 주세요.

댓글

로그인 없이 쓸 수 있습니다. 사용 후기, 질문, 작동하지 않은 환경 등을 편하게 남겨 주세요.

아직 댓글이 없습니다. 첫 댓글을 남겨 보세요.

보내면 바로 공개됩니다. 이메일 주소나 전화번호 같은 개인 정보는 쓰지 마세요. URL은 2개까지입니다.

0 / 1,000자

이 양식은 reCAPTCHA로 보호되며 Google 개인정보처리방침 및 서비스 약관이 적용됩니다.

같은 저장소의 스킬

Learn Apache Beam's core concepts through Java and Python examples. Understand distributed datasets, processing steps, pipeline execution, and time windows, with guidance on aggregation, late data, error handling, and sharing processing steps across languages.

한국어 요약은 준비 중입니다. 영어 요약을 표시하고 있습니다.

  • Learn how Pipeline, PCollection, and PTransform fit together
  • Understand grouping, aggregation, merging, and splitting
  • Study time windows, output timing, and late data
apache/beam8.7천2026년 10월 19일 업데이트

ci-cd

무료

Helps investigate and modify Apache Beam's automated build and test workflows in GitHub Actions. Explains workflow types, failure logs, targeted reruns, local reproduction, and the cloud credentials needed for workflows that access GCP.

한국어 요약은 준비 중입니다. 영어 요약을 표시하고 있습니다.

  • Investigating failed checks on a pull request
  • Rerunning a specific test workflow
  • Reproducing CI test commands locally
apache/beam8.7천2026년 10월 19일 업데이트

Navigate Apache Beam contributions from finding an issue to submitting a pull request, a proposed code change, and responding to reviews. Covers environment setup, tests, formatting, licensing requirements, and closer evaluation of changes to core components.

한국어 요약은 준비 중입니다. 영어 요약을 표시하고 있습니다.

  • Prepare a first Apache Beam contribution
  • Organize a pull request and its related issue
  • Check tests and formatting before submission
apache/beam8.7천2026년 10월 19일 업데이트

Build Apache Beam connectors that read and write external data. This guide covers Java implementation, schema support for structured records, access from Python and Go, Managed API integration, and testing.

한국어 요약은 준비 중입니다. 영어 요약을 표시하고 있습니다.

  • Add a connector for an external data system
  • Make a Java connector available to Python and Go
  • Integrate a connector with Beam YAML and the Managed API
apache/beam8.7천2026년 10월 19일 업데이트

Build and test Apache Beam with Gradle, the system that manages its project tasks. Find relevant configuration files, inspect library dependencies, run formatting checks, publish locally, and investigate build failures.

한국어 요약은 준비 중입니다. 영어 요약을 표시하고 있습니다.

  • Build or test a specific Apache Beam module
  • Inspect library dependencies and version conflicts
  • Run formatting and pre-commit checks
apache/beam8.7천2026년 10월 19일 업데이트

Work with Apache Beam I/O connectors, components that read and write external data. Get guidance on connector usage, unit and integration tests, troubleshooting data connections, and the basic structure of new connectors.

한국어 요약은 준비 중입니다. 영어 요약을 표시하고 있습니다.

  • Add BigQuery or Kafka reads and writes to a pipeline
  • Run unit and integration tests for connectors
  • Investigate data source or destination issues
apache/beam8.7천2026년 10월 19일 업데이트

apache의 스킬 모두 보기

이 스킬의 문제 신고