Inhaltsverzeichnis19 Abschnitte
- TL;DR
- Was Lineage wirklich ist
- Warum Lineage wichtig ist
- Incident-Response
- Impact-Analyse
- Regulatorisch
- Data-Quality-Debugging
- OpenLineage als Standard
- Tools verglichen
- Marquez
- Unity Catalog (Databricks)
- dbt Lineage
- Vergleich
- Implementierung in der Praxis
- Schritt 1: Backend wählen
- Schritt 2: Pipelines instrumentieren
- Schritt 3: Lineage programmatisch abfragen
- Häufige Fallen
- FAQ
Ein KPI-Dashboard zeigt -18 % Umsatz im letzten Quartal. Finance ist alarmiert. Du musst wissen: Ist das echt oder ist eine Pipeline kaputt? Ohne Data Lineage trace-st du manuell SQL durch vier Transformations-Layer, drei Quellsysteme und ein dbt-Projekt mit 200 Models. Mit Lineage: zwei Klicks, kaputten Upstream-Join gefunden.
TL;DR
- Lineage beantwortet drei Fragen: Woher kommt es? Was wurde transformiert? Wer konsumiert es?
- Table-Level ist relativ einfach, Column-Level ist die echte Herausforderung.
- OpenLineage ist der entstehende Standard, Marquez die Open-Source-Referenz.
- Unity Catalog gibt dir Lineage automatisch — wenn du auf Databricks bist.
- DSGVO Auskunftsrechte sind ohne Lineage ein manueller Albtraum.
Was Lineage wirklich ist
Lineage beantwortet drei Fragen:
- Ursprung: Woher kommen die Daten? Welches Quellsystem, welche Tabelle, welches Feld?
- Transformation: Was ist passiert? Welche Pipelines, Queries, Models haben das angefasst?
- Impact: Wer konsumiert? Welche Dashboards, Models, Downstream-Pipelines hängen dran?
| Granularität | Beschreibung | Beispiel |
|---|---|---|
| Table-Lineage | Welche Tabellen feeden welche | orders_raw → orders_cleaned → fact_orders |
| Column-Lineage | Welche Quell-Spalten in welche Output-Spalten | orders.gross_amount → fact_orders.revenue |
Column-Level ist deutlich härter — Table-Level machen die meisten Tools gut, Column-Level inkonsistent.
Warum Lineage wichtig ist
Incident-Response
Metric bricht? Lineage traced upstream zur Wurzel. Ohne: grep durch SQL-Files und Slack.
Impact-Analyse
Bevor du eine deprecated Spalte droppst, musst du wissen, wer dran hängt.
Regulatorisch
DSGVO, CCPA, HIPAA, SOX haben alle Varianten von "beweise, dass du weißt, wo personenbezogene Daten leben und fließen". Lineage ist Audit-Evidence.
Data-Quality-Debugging
Schlechte Qualität entsteht drei Layer upstream. Lineage traced zur Quelle.
OpenLineage als Standard
OpenLineage ist offener Standard (CNCF) für Lineage-Events. Statt dass jedes Tool eigene Lineage-API spricht, definiert OpenLineage ein gemeinsames JSON-Schema.
{
"eventType": "COMPLETE",
"eventTime": "2024-03-15T14:30:00Z",
"job": { "namespace": "my_airflow", "name": "orders_pipeline.transform_orders" },
"inputs": [{
"namespace": "postgres://prod-db",
"name": "public.orders_raw",
"facets": { "schema": { "fields": [
{"name": "order_id", "type": "VARCHAR"},
{"name": "amount", "type": "NUMERIC"}
]}}
}],
"outputs": [{
"namespace": "s3://datalake",
"name": "orders/cleaned",
"facets": { "schema": { "fields": [
{"name": "order_id", "type": "VARCHAR"},
{"name": "net_amount", "type": "DOUBLE"}
]}}
}]
}
OpenLineage-Events werden von Integrations emittiert — Bibliotheken, die in deine Tools (Airflow, Spark, dbt, Flink) einhaken und automatisch Events feuern.
from openlineage.client import OpenLineageClient
from openlineage.client.run import RunEvent, RunState, Run, Job
from openlineage.client.facet import SchemaDatasetFacet, SchemaField
from openlineage.client.dataset import Dataset
import datetime, uuid
client = OpenLineageClient.from_environment()
run_id = str(uuid.uuid4())
event = RunEvent(
eventType=RunState.COMPLETE,
eventTime=datetime.datetime.utcnow().isoformat() + "Z",
run=Run(runId=run_id),
job=Job(namespace="custom_pipeline", name="enrich_customers"),
inputs=[Dataset(namespace="postgres://prod", name="public.customers",
facets={"schema": SchemaDatasetFacet(fields=[
SchemaField("customer_id", "VARCHAR"),
SchemaField("email", "VARCHAR"),
])})],
outputs=[Dataset(namespace="s3://datalake", name="customers/enriched",
facets={"schema": SchemaDatasetFacet(fields=[
SchemaField("customer_id", "VARCHAR"),
SchemaField("email", "VARCHAR"),
SchemaField("geo_country", "VARCHAR"),
])})],
producer="custom_pipeline/v1.0"
)
client.emit(event)
Tools verglichen
Marquez
Open-Source-Referenz für OpenLineage-Consuming. Metadata-Server mit UI, der den Lineage-Graph visualisiert.
- Open Source, self-hosted, OpenLineage nativ, REST-API
- UI funktional, nicht poliert. Keine Enterprise-Features (RBAC, SSO) out-of-the-box.
Unity Catalog (Databricks)
System Tables fangen automatisch Lineage für Databricks-Workloads. Jede Query gegen UC-managed Tables wird getrackt — keine Instrumentierung nötig.
SELECT source_table_full_name, target_table_full_name, created_by, event_time
FROM system.access.table_lineage
WHERE target_table_full_name = 'main.analytics.fact_orders'
ORDER BY event_time DESC LIMIT 20;
- Zero-Instrumentation, Column-Level (neuere Releases), integriert mit Access-Control
- Databricks-only, kostet, Vendor-Lockin
dbt Lineage
DAG aus ref() und source() Calls. dbt docs generate baut den Graph.
Vergleich
| Tool | Scope | Column-Lineage | Self-Hosted | Kosten |
|---|---|---|---|---|
| Marquez | OpenLineage-emitting Pipelines | Teilweise | Pflicht | Frei |
| Unity Catalog | Databricks Workloads | Ja | SaaS | Databricks-Pricing |
| dbt Lineage | dbt Models only | Nein | Optional | Frei (OSS dbt) |
| Apache Atlas | Hadoop-Ökosystem | Teilweise | Pflicht | Frei |
| DataHub | Breit | Teilweise | Optional | Frei / Enterprise |
| Atlan / Alation | Enterprise-Catalog | Ja | SaaS | Paid |
Implementierung in der Praxis
Schritt 1: Backend wählen
- Databricks-Nutzer:innen: UC aktivieren — Lineage frei für Spark/SQL.
- Multi-Plattform-Teams: OpenLineage + Marquez (oder DataHub als reifere Alternative).
- dbt-heavy: Start mit dbt docs, OpenLineage für Cross-System dazu.
Schritt 2: Pipelines instrumentieren
# Airflow — openlineage-airflow Provider
# OPENLINEAGE_URL=http://marquez:5000
# OPENLINEAGE_NAMESPACE=production_airflow
# PySpark
spark = SparkSession.builder \
.appName("my_pipeline") \
.config("spark.extraListeners", "io.openlineage.spark.agent.OpenLineageSparkListener") \
.config("spark.openlineage.transport.type", "http") \
.config("spark.openlineage.transport.url", "http://marquez:5000") \
.config("spark.openlineage.namespace", "production") \
.getOrCreate()
Schritt 3: Lineage programmatisch abfragen
import requests
def get_upstream_datasets(namespace: str, dataset_name: str):
url = f"http://marquez:5000/api/v1/lineage?nodeId=dataset:{namespace}:{dataset_name}"
response = requests.get(url)
response.raise_for_status()
graph = response.json()
return [
edge["origin"]["id"]
for edge in graph.get("graph", [])
if edge["type"] == "EDGE" and edge["destination"]["id"] == f"dataset:{namespace}:{dataset_name}"
]
upstream = get_upstream_datasets("s3://datalake", "fact_orders")
Häufige Fallen
- Lineage als Afterthought. Am günstigsten beim Bau, am teuersten retrofittet. 200-Model-dbt-Projekt nachträglich = Wochen.
- Table ohne Column. Du brauchst Column für DSGVO Data-Subject-Requests und Quality-Debugging.
- Lineage nur als ETL-Problem. BI-Tools (Tableau, Looker), Notebooks, ML-Pipelines auch. Ein kaputtes Dashboard ohne Lineage zur Quelle ist genauso blind wie eine kaputte Pipeline.
- Keine Ad-hoc-Query-Lineage. Die meisten tracken Scheduled-Pipelines, ignorieren Analyst:innen-Queries. UC und DataHub fangen auch Ad-hoc SQL ein.
FAQ
Wo fange ich an, wenn ich noch nichts habe? dbt docs (kostet nichts) für die Transformations-Schicht. Wenn auf Databricks: UC. Sonst: Marquez + OpenLineage.
Wie DSGVO-konform speichern? Lineage-Metadaten enthalten meist keine personenbezogenen Inhalte, nur Strukturinformationen. Trotzdem im EU-Hosting (eu-central-1) ablegen.
Lohnt sich Column-Lineage für ein 10-Personen-Team? Selten am Anfang. Table-Lineage gibt dir 80 % der Incident-Response-Beschleunigung.
Wie performant ist Marquez? Funktioniert für Millionen Events. Bei >10 Mio. wirst du Postgres-Tuning brauchen.
Stand: 14. Mai 2026.
Geschrieben von
Harbinger Team
Cloud-, Data- und AI-Engineer in DACH. Schreibt seit 2018 über infrastrukturkritische Tech-Entscheidungen — keine Marketing- Folien, sondern echte Trade-offs aus Production-Workloads.
Hat dir das geholfen?
Jede Woche ein neuer Artikel über DACH-Cloud, Data und AI — direkt in dein Postfach. Kein Spam, kein Marketing-Sprech.
Kein Spam. 1-Klick-Abmeldung. Datenschutz bei Loops.so.