Dat­ab­ricks: Feh­ler­ana­lyse und Optimierungsstrategien



Ein­lei­tung

Um eine opti­male Per­for­mance und hohe Kos­ten­ef­fi­zi­enz bei der Ver­ar­bei­tung gro­ßer Daten­men­gen zu errei­chen, set­zen viele Unter­neh­men auf Dat­ab­ricks als ska­lier­bare Ana­ly­se­platt­form. Die Kom­bi­na­tion aus Spark, Delta Lake und inte­grier­ten Opti­mie­rungs­funk­tio­nen bie­tet eine leis­tungs­starke Grund­lage für moderne Datenworkloads.

Damit diese Poten­ziale jedoch voll aus­ge­schöpft wer­den kön­nen, sind ein geziel­tes Moni­to­ring, eine lau­fende Ana­lyse von Logs und eine sys­te­ma­ti­sche Opti­mie­rung uner­läss­lich. In die­sem Bei­trag wird auf­ge­zeigt, wie ver­schie­dene Log-Typen in Dat­ab­ricks zur Feh­ler­iden­ti­fi­ka­tion und Ursa­chen­ana­lyse ein­ge­setzt wer­den kön­nen und wel­che stra­te­gi­schen sowie tech­ni­schen Mecha­nis­men zur Ver­fü­gung ste­hen, um die Per­for­mance von Workloads nach­hal­tig zu optimieren.

Metho­den zur Feh­ler­ana­lyse in Databricks

Die effek­tive Ana­lyse von Feh­lern und Per­for­mance-Pro­ble­men ist ent­schei­dend, um das volle Poten­zial von Dat­ab­ricks aus­zu­schöp­fen, ins­be­son­dere in pro­duk­ti­ven Umge­bun­gen. Je nach Art des Pro­blems ste­hen in Dat­ab­ricks ver­schie­dene Metho­den zur Ver­fü­gung, die sich ergän­zen und gezielt ein­ge­setzt wer­den soll­ten. Logs, UI, Metri­ken und APIs bil­den gemein­sam das Rück­grat einer effek­ti­ven Obser­va­bi­lity-Stra­te­gie und ermög­li­chen ein durch­gän­gi­ges End-to-End-Monitoring.

Spark UI

Die Spark UI ist das zen­trale Werk­zeug zur Ana­lyse lau­fen­der und abge­schlos­se­ner Jobs. Sie ermög­licht detail­lierte Ein­bli­cke in den Auf­bau eines Jobs, die Res­sour­cen­aus­las­tung, Aus­füh­rungs­zei­ten, Spei­cher­ver­brauch und mehr. Beson­ders hilf­reich sind dabei:

  • DAG-Visua­li­sie­rung: zeigt die Struk­tur und Abhän­gig­kei­ten zwi­schen Stages und Tasks.
  • Stage-Details: offen­ba­ren lang­same Tasks, Skew und Spei­cher- bzw. I/O‑Probleme.
  • Sto­rage-Tab: gibt Hin­weise auf Caching-Ver­hal­ten und Speicherüberläufe.
  • Exe­cu­tors-Tab: erlaubt die Ana­lyse von CPU-Aus­las­tung, Spei­cher­ver­tei­lung und Gar­bage Coll­ec­tion-Akti­vi­tät pro Executor.

Ana­lyse der Sys­tem- und Anwendungslogs

Die ver­schie­de­nen Log-Typen in Dat­ab­ricks bie­ten Ein­blick auf unter­schied­li­chen Ebe­nen: Dri­ver Logs, Exe­cu­tor Logs, Clus­ter Event Logs, Event Logs, Audit Logs, Struc­tu­red Strea­ming Logs.

Im wei­te­ren Ver­lauf die­ses Bei­trags wer­den die ver­schie­de­nen Log-Arten jeweils ein­zeln betrach­tet und hin­sicht­lich ihrer Funk­tion, Ana­ly­se­po­ten­ziale und Anwen­dungs­fälle näher beleuchtet.

Der gezielte Zugriff auf diese Logs, sei es manu­ell über die UI oder auto­ma­ti­siert per Skript, ist oft der erste Schritt zur Fehlerlokalisierung.

Moni­to­ring über Strea­ming-Metri­ken und APIs

Für kon­ti­nu­ier­li­che Pipe­lines ist Echt­zeit-Moni­to­ring essen­zi­ell. Struc­tu­red Strea­ming bie­tet APIs wie last­Pro­gress oder recent­Pro­gress, über die sich Laten­zen, Ein­ga­be­men­gen, Com­mit-Zustände und Feh­ler kon­ti­nu­ier­lich beob­ach­ten las­sen. Diese las­sen sich mit eige­nen Moni­to­ring-Jobs, Dash­boards oder exter­nen Tools verknüpfen.

Inte­gra­tion mit exter­nen Moni­to­ring- und Logging-Systemen

Viele Unter­neh­men kom­bi­nie­ren Dat­ab­ricks mit Sys­te­men wie Graf­ana, Splunk, Pro­me­theus oder Azure Moni­tor, um Logs zen­tral zu ana­ly­sie­ren, Alerts zu defi­nie­ren und Trends lang­fris­tig zu visua­li­sie­ren. Über REST-APIs, Log-Exports oder Event Streams las­sen sich Dat­ab­ricks-Metri­ken naht­los integrieren.

Ver­gleich meh­re­rer Jobläufe

Feh­ler­ana­lyse bedeu­tet oft auch: ver­glei­chen, was sich zwi­schen zwei Läu­fen ver­än­dert hat. Dat­ab­ricks erlaubt den Zugriff auf ver­gan­gene Runs über die UI oder Jobs-API. Unter­schiede im Input, in der Query-Stra­te­gie oder in der Aus­füh­rungs­zeit sind oft die Ursa­che für Performanceabweichungen.

Kom­bi­na­tion von Logs und Metriken

Die bes­ten Ergeb­nisse erzielt man, wenn man Logs, UI-Metri­ken und Strea­ming-Daten kom­bi­niert. Feh­ler im Exe­cu­tor Log las­sen sich etwa mit Gar­bage-Coll­ec­tion-Aus­las­tung und Task-Dauer aus der Spark UI kor­re­lie­ren oder anhand von Audit Logs prü­fen, ob zuvor eine feh­ler­hafte Ände­rung erfolgt ist.

Logs in Databricks

Dat­ab­ricks gene­riert meh­rere Arten von Logs auf ver­schie­de­nen Ebe­nen des Clus­ters. Diese Logs sind essen­zi­ell für Feh­ler­dia­gnose, Leis­tungs­ana­lyse und Sicher­heits­über­wa­chung. Je nach Art des Pro­blems kön­nen ver­schie­dene Log-Typen zur Ana­lyse her­an­ge­zo­gen werden:

  • Dri­ver Logs: Ent­hal­ten Infor­ma­tio­nen über die Initia­li­sie­rung des Spark-Jobs und die Koor­di­na­tion mit Exe­cu­tors. Zustän­dig für: Start­pro­bleme, Spei­cher­feh­ler, Verbindungsprobleme.
  • Exe­cu­tor Logs: Logs der Worker-Pro­zesse, die die eigent­li­che Daten­ver­ar­bei­tung durch­füh­ren. Zustän­dig für: Task-Fehl­schläge, Spei­cher- und Par­ti­tio­nie­rungs­pro­bleme, Skew.
  • Event Logs: Struk­tu­rierte Pro­to­kolle aller Spark-Events (Job­st­art, Tas­kende etc.). Zustän­dig für: Ana­lyse der Per­for­mance und Res­sour­cen­nut­zung über die Zeit.
  • Clus­ter Event Logs: Sys­tem­er­eig­nisse auf Clus­ter­ebene, z. B. Start, Stop, Ska­lie­rung. Zustän­dig für: Infra­struk­tur­pro­bleme, Auto-Sca­ling-Ver­hal­ten, Konfigurationsfehler.
  • Audit Logs (nur Enter­prise): Pro­to­kol­lie­ren Benut­zer­ak­tio­nen wie Zugriffe, Ände­run­gen, Starts von Jobs. Zustän­dig für: Sicher­heit, Nach­voll­zieh­bar­keit, Compliance.
  • Struc­tu­red Strea­ming Logs: Logs von kon­ti­nu­ier­li­chen Daten­strö­men (Kafka, Delta Live Tables usw.). Zustän­dig für: Strea­ming-Latenz, Feh­ler bei Ver­ar­bei­tung in Echtzeit.

Dri­ver Logs

Dri­ver Logs gehö­ren zu den wich­tigs­ten Quel­len für die Ana­lyse von Pro­ble­men in Dat­ab­ricks. Der Dri­ver ist die zen­trale Instanz eines Spark-Jobs und über­nimmt die Pla­nung, Koor­di­na­tion sowie die Kom­mu­ni­ka­tion mit den Exe­cu­tor-Pro­zes­sen auf den Worker-Nodes. Ohne den Dri­ver läuft nichts: er erstellt den DAG (Direc­ted Acy­clic Graph), plant die Tasks und ver­teilt sie an die Exe­cu­tors. Ein typi­sches Spark-Clus­ter besteht aus einem Dri­ver-Pro­zess und meh­re­ren Exe­cu­tors, die jeweils auf ver­schie­de­nen Nodes lau­fen. Die Kom­mu­ni­ka­tion erfolgt über das Clus­ter-Netz­werk, wobei der Dri­ver alle Ergeb­nisse ein­sam­melt und aggregiert.

Architektur von Apache Spark in Databricks mit Driver- und Executor-Komponenten
Abbil­dung 1: Spark-Archi­tek­tur mit Dri­ver und Exe­cu­tors (Quelle: Dat­ab­ricks / Apa­che Spark Doku­men­ta­tion)

Ent­spre­chend ent­hal­ten die Dri­ver Logs viele kri­ti­sche Infor­ma­tio­nen über den Zustand und Ver­lauf eines Jobs.

Wo fin­det man die Dri­ver Logs?

Die Dri­ver Logs kön­nen direkt über die Dat­ab­ricks UI ein­ge­se­hen werden:

  • Navi­giere zu “Com­pute” → Clus­ter aus­wäh­len → “Dri­ver Logs”
  • Alter­na­tiv bei einem Note­book-Job: “Job Runs” → spe­zi­fi­schen Lauf öff­nen → “Dri­ver Output”
Ansicht der Driver Logs in der Databricks Benutzeroberfläche zur Analyse von Fehlern
Abbil­dung 2: Bei­spiel­an­sicht der Dri­ver Logs in Dat­ab­ricks (Quelle: learn.microsoft.com)

Zusätz­lich wer­den sie in der Regel unter dem Pfad dbfs:/cluster-logs/ gespei­chert und kön­nen per Spark oder über einen exter­nen Spei­cher­ort (z.B. S3, ADLS) wei­ter­ver­ar­bei­tet werden.

Fehlerdiagnose mit Driver Logs in Databricks Cluster-Umgebung
Abbil­dung 3: Bei­spiel­an­sicht der Dri­ver Logs in Dat­ab­ricks (Quelle: learn.microsoft.com)

Typi­sche Inhalte der Dri­ver Logs:

  • Initia­li­sie­rungs­pro­zesse und ‑feh­ler (z.B. feh­lende Konfigurationen)
  • Kom­mu­ni­ka­tion mit Exe­cu­tors (Netz­werk­ver­bin­dungs­feh­ler)
  • Spei­cher­pro­bleme wie OutOfMemoryError
  • Stack­traces bei uner­war­te­ten Abbrüchen
  • Kon­fi­gu­ra­tion von Spark-Kon­text und Umgebungsvariablen

Wann sollte man Dri­ver Logs prüfen?

  • Wenn ein Job gar nicht star­tet oder sehr früh abbricht
  • Bei ver­zö­ger­tem Start oder unge­wöhn­lich lan­ger Initialisierungszeit
  • Bei Feh­lern in der Kom­mu­ni­ka­tion mit Executor-Nodes
  • Bei Trei­ber-spe­zi­fi­schen OutOfMemoryError
  • Wenn im Job­lauf keine Tasks aus­ge­führt wer­den (z. B. durch fal­sche Konfiguration)

Best Prac­ti­ces für die Arbeit mit Dri­ver Logs:

  • Feh­ler, die bereits beim Start auf­tre­ten, soll­ten früh­zei­tig anhand der ers­ten Zei­len der Dri­ver Logs iden­ti­fi­ziert werden.
  • Schlüs­sel­wör­ter wie „Excep­tion“, „OutOf­Me­mo­ry­Er­ror“, „Con­nec­tion refu­sed“ oder „GC over­head“ kön­nen gezielt in den Logs erkannt wer­den, um auf Pro­bleme hinzuweisen.
  • Eine auto­ma­ti­sierte Archi­vie­rung der Logs, bei­spiels­weise nach S3 oder Azure Blob, sollte ein­ge­rich­tet wer­den, um his­to­ri­sche Ana­ly­sen zu ermöglichen.
  • Eine Ver­knüp­fung der Dri­ver Logs mit Metri­ken aus der Spark UI oder Dat­ab­ricks Gan­glia wird emp­foh­len, um Zusam­men­hänge zwi­schen Feh­lern und Sys­tem­aus­las­tung zu erkennen.

Exe­cu­tor Logs

Wäh­rend der Dri­ver für die Steue­rung eines Spark-Jobs ver­ant­wort­lich ist, über­neh­men die Exe­cu­tors die eigent­li­che Ver­ar­bei­tung der Daten. Jeder Exe­cu­tor ist ein Worker-Pro­zess, der auf einem Clus­ter-Node läuft und Tasks aus­führt, die ihm vom Dri­ver zuge­wie­sen wur­den. Dabei ver­wal­ten Exe­cu­tors den Cache, lesen Daten, füh­ren Trans­for­ma­tio­nen aus und schrei­ben Ergeb­nisse zurück. Exe­cu­tors füh­ren alle phy­si­schen Daten­ope­ra­tio­nen aus und lie­fern Ergeb­nisse an den Dri­ver zurück.

Die Exe­cu­tor Logs ent­hal­ten alle lauf­zeit­spe­zi­fi­schen Details zur Task-Aus­füh­rung, zum Spei­cher­ma­nage­ment und zu Fehl­ver­hal­ten auf Exe­cu­tor-Ebene und sind essen­zi­ell für die Dia­gnose von Per­for­mance- und Ressourcenproblemen.

Wo fin­det man die Exe­cu­tor Logs?

Die Exe­cu­tor Logs sind über die Dat­ab­ricks UI zugänglich:

  • “Com­pute” → Clus­ter → “Exe­cu­tor Logs”
  • Alter­na­tiv in einem Job­lauf: “Job Run Details” → Tab „Exe­cu­tors“ → Link zu Logdateien

Die Exe­cu­tor Logs wer­den außer­dem im Pfad dbfs:/cluster-logs/ gespeichert

Typi­sche Inhalte der Exe­cu­tor Logs:

  • Task-Aus­füh­rungs­zei­ten und Fortschritt
  • Spei­cher­ver­brauch und Spill Events (Schrei­ben auf Fest­platte bei unzu­rei­chen­dem RAM)
  • Hin­weise auf Daten-Skew (ungleich­mä­ßige Verteilung)
  • Stack­traces bei Feh­lern im Task (z.B. bei Join-Problemen)
  • Gar­bage Coll­ec­tion (GC)-Protokolle

Wann sollte man Exe­cu­tor Logs prüfen?

  • Wenn Tasks wie­der­holt fehlschlagen
  • Bei plötz­li­chen Per­for­man­ce­ein­brü­chen in einem ansons­ten sta­bi­len Job
  • Wenn in der Spark UI lange Aus­füh­rungs­zei­ten oder Skew-War­nun­gen auftreten
  • Bei hoher GC-Zeit oder Spill-Ereig­nis­sen trotz aus­rei­chend zuge­wie­se­nem Speicher
  • Wenn ein Job sehr lange dau­ert, obwohl nur wenig Daten ver­ar­bei­tet werden

Best Prac­ti­ces für die Arbeit mit Exe­cu­tor Logs:

  • Tasks mit beson­ders lan­ger Aus­füh­rungs­zeit oder Time­outs soll­ten in den Logs iden­ti­fi­ziert wer­den, da sie oft auf Daten-Skew oder unzu­rei­chende Par­ti­tio­nie­rung hinweisen.
  • Das Ver­hal­ten bei Spei­cher­über­läu­fen („spill to disk“) sollte beob­ach­tet wer­den, da es auf Spei­cher­eng­pässe oder zu große Daten­par­ti­tio­nen hin­deu­ten kann.
  • Hohe oder häu­fige Gar­bage-Coll­ec­tion-Zei­ten (ins­be­son­dere bei G1GC) soll­ten berück­sich­tigt wer­den, da sie die Job­dauer erheb­lich beein­flus­sen können.
  • Wie­der­keh­rende Feh­ler in bestimm­ten Exe­cu­tor-Instan­zen deu­ten mög­li­cher­weise auf Infra­struk­tur­pro­bleme hin und soll­ten sys­te­ma­tisch über­prüft werden.
  • Eine Kor­re­la­tion der Exe­cu­tor Logs mit Infor­ma­tio­nen aus dem Sto­rage-Tab und den Stage-Daten der Spark UI trägt zu einer ganz­heit­li­chen Ana­lyse bei.

Event Logs

Neben den unstruk­tu­rier­ten Logs der Dri­ver- und Exe­cu­tor-Pro­zesse bie­tet Dat­ab­ricks mit den Event Logs eine struk­tu­rierte Mög­lich­keit, Spark-Jobs über ihren gesam­ten Lebens­zy­klus hin­weg zu ana­ly­sie­ren. Diese Logs ent­hal­ten alle rele­van­ten Ereig­nisse, die wäh­rend der Aus­füh­rung eines Jobs auf­tre­ten, dar­un­ter Start- und End­zeit­punkte von Jobs, Stages und Tasks sowie Metri­ken zur Res­sour­cen­nut­zung und Infor­ma­tio­nen zu Query-Plä­nen. Event Logs wer­den im JSON-For­mat gespei­chert und eig­nen sich beson­ders für eine sys­te­ma­ti­sche, wie­der­hol­bare Ana­lyse, etwa mit exter­nen Tools oder eige­nen Log-Parsers.

Wo fin­det man die Event Logs?

In Dat­ab­ricks wer­den Event Logs auto­ma­tisch für jeden Job erzeugt und kön­nen an ver­schie­de­nen Stel­len ein­ge­se­hen oder her­un­ter­ge­la­den werden:

  • Über die Spark UI eines Clus­ters: → „Spark UI“ → „Event Time­line“ / „Envi­ron­ment“ → „Down­load Event Log“
  • Spei­cher­ort im Datei­sys­tem: → dbfs:/databricks/event-logs/ (bzw. benut­zer­de­fi­niert bei Logging-Konfiguration)

Alter­na­tiv kön­nen Event Logs mit APIs oder über %sh-Zugriffe her­un­ter­ge­la­den und ana­ly­siert werden

Typi­sche Inhalte der Event Logs:

  • Zeit­punkte von Job‑, Stage- und Task-Start und ‑Ende
  • Infor­ma­tio­nen zur Query-Aus­füh­rung (Query Plans, AQE-Entscheidungen)
  • Ver­wen­dete Clus­ter-Res­sour­cen (CPU, Spei­cher, Executor-Laufzeiten)
  • Aus­füh­rungs­pläne bei Data­Frame-Ope­ra­tio­nen und SQL-Queries
  • Feh­ler- und Retry-Infor­ma­tio­nen bei fehl­ge­schla­ge­nen Tasks

Wann sollte man Event Logs prüfen?

  • Bei wie­der­keh­ren­den Per­for­mance-Pro­ble­men, die schwer ein­zu­gren­zen sind
  • Wenn man eine nach­träg­li­che Ursa­chen­ana­lyse eines bereits been­de­ten Jobs durch­füh­ren will
  • Bei Bedarf an Lang­zeit­ana­lyse von Job­ver­hal­ten, z. B. für Capa­city Planning
  • Wenn man eigene Moni­to­ring-Lösun­gen auf­bauen oder Spark-Metri­ken agg­re­gie­ren möchte
  • Bei kom­ple­xen Pipe­lines, wo viele Stages oder Jobs par­al­lel lau­fen und eine ein­fa­che UI nicht mehr ausreicht

Best Prac­ti­ces für die Arbeit mit Event Logs:

  • Event Logs soll­ten regel­mä­ßig expor­tiert und zen­tral gespei­chert wer­den, etwa in einem exter­nen Log­ging-Backend wie Azure Blob oder S3, um eine lang­fris­tige Archi­vie­rung zu gewährleisten.
  • Zur Visua­li­sie­rung der Logs bie­ten sich Tools wie der Spark History Ser­ver oder Dash­boards auf Basis der Dat­ab­ricks REST API und Graf­ana an.
  • Unter­schiede zwi­schen „lang­sa­men“ und „schnel­len“ Jobs kön­nen zur Erken­nung von Per­for­mance-Mus­tern genutzt werden.
  • Eine struk­tu­rierte Aus­wer­tung der Event Logs, zum Bei­spiel durch Ein­le­sen als JSON in ein Data­Frame, ermög­licht tie­fer­ge­hende Ana­ly­sen inner­halb von Databricks.
  • Die adap­tive Aus­füh­rung von Abfra­gen (AQE) kann über die Event Logs nach­voll­zo­gen wer­den, etwa in Bezug auf Skew-Erken­nung oder dyna­mi­sche Partitionierung.

Clus­ter Event Logs

Neben log­spe­zi­fi­schen Infor­ma­tio­nen zu ein­zel­nen Jobs oder Tasks bie­tet Dat­ab­ricks auch eine sys­te­ma­ti­sche Pro­to­kol­lie­rung aller Clus­ter-bezo­ge­nen Ereig­nisse. Diese soge­nann­ten Clus­ter Event Logs geben Auf­schluss über alle Ände­run­gen, Aktio­nen und Sys­tem­zu­stände, die im Zusam­men­hang mit einem Dat­ab­ricks-Clus­ter ste­hen, zum Bei­spiel Start- und Stop-Vor­gänge, Ska­lie­rungs­ak­tio­nen oder Ände­run­gen an der Konfiguration.

Sie sind beson­ders hilf­reich, wenn Pro­bleme nicht im Code, son­dern auf Infrastruktur- oder Kon­fi­gu­ra­ti­ons­ebene ver­mu­tet wer­den, also bei­spiels­weise beim Auto-Sca­ling, bei Instanz-Wech­seln oder feh­ler­haf­ten Clusterstarts.

Wo fin­det man die Clus­ter Event Logs?

Die Clus­ter Event Logs sind direkt über die Dat­ab­ricks-UI einsehbar:

  • “Com­pute” → Clus­ter aus­wäh­len → Tab „Event Log“. Dort wer­den alle Ereig­nisse chro­no­lo­gisch auf­ge­lis­tet, inklu­sive Zeit­stem­pel, Benut­zer­ak­tion, betrof­fe­nen Res­sour­cen und Systemmeldungen

Zusätz­lich kön­nen diese Events auch pro­gram­ma­tisch über die Dat­ab­ricks REST API abge­fragt und in externe Moni­to­ring-Sys­teme über­führt werden.

Typi­sche Inhalte der Clus­ter Event Logs:

  • Start- und Stop-Vor­gänge des Clusters
  • Auto-Sca­ling-Akti­vi­tä­ten (z. B. Ska­lie­rung von Nodes)
  • Feh­ler beim Star­ten von Workern
  • Ände­run­gen an der Clus­ter-Kon­fi­gu­ra­tion (Run­time-Ver­sion, Spark-Parameter)
  • Zuwei­sung oder Frei­gabe von Res­sour­cen (z. B. Spot-Instanzen)
  • Ereig­nisse im Zusam­men­hang mit Node Fail­ure Recovery

Wann sollte man Clus­ter Event Logs prüfen?

  • Wenn ein Clus­ter nicht star­tet oder hän­gen bleibt
  • Bei uner­war­te­tem Abbruch oder Neu­start des Clusters
  • Wenn Auto-Sca­ling nicht wie erwar­tet funktioniert
  • Bei wie­der­keh­ren­den Feh­lern, die schein­bar nicht aus dem Code stammen
  • Wenn Nut­zer über Per­for­mance-Unter­schiede bei iden­ti­schen Jobs auf dem glei­chen Clus­ter berichten

Best Prac­ti­ces für die Arbeit mit Clus­ter Event Logs:

  • Tre­ten Job­feh­ler ohne erkenn­bare Ursa­chen in den Dri­ver- oder Exe­cu­tor-Logs auf, sollte die Infrastruktur über die Clus­ter Events über­prüft werden.
  • Zeit­stem­pel in Clus­ter Events kön­nen mit Feh­lern im Job­lauf kor­re­liert wer­den, ins­be­son­dere im Zusam­men­hang mit Auto-Sca­ling oder Instanzwechseln.
  • Kon­fi­gu­ra­ti­ons­än­de­run­gen wer­den durch Clus­ter Events pro­to­kol­liert und kön­nen bei Regres­sio­nen zur Rück­ver­fol­gung genutzt werden.
  • Für pro­duk­tive Clus­ter emp­fiehlt sich der Export der Clus­ter Events über die REST API in zen­trale Monitoring-Systeme.
  • Häu­fige Node-Aus­fälle oder kapa­zi­täts­be­dingte Feh­ler in den Clus­ter Events deu­ten dar­auf hin, dass die ver­wen­de­ten Poli­cies oder Res­sour­cen­stra­te­gien über­ar­bei­tet wer­den sollten.

Audit Logs

In pro­duk­ti­ven und unter­neh­mens­kri­ti­schen Umge­bun­gen ist es wich­tig, nicht nur tech­ni­sche Feh­ler zu ana­ly­sie­ren, son­dern auch nach­voll­zie­hen zu kön­nen, wer was wann im Sys­tem getan hat. Genau dafür sind die Audit Logs in Dat­ab­ricks kon­zi­piert. Sie ermög­li­chen eine voll­stän­dige Pro­to­kol­lie­rung aller sicher­heits­re­le­van­ten Aktio­nen und Benut­zer­ak­ti­vi­tä­ten inner­halb der Workspace-Umgebung. 

Diese Logs sind beson­ders wich­tig für Sicher­heits­au­dits, Com­pli­ance-Vor­ga­ben (z. B. GDPR, ISO 27001) und bei der Unter­su­chung ver­däch­ti­ger Aktivitäten.

Wich­tig: Audit Logs sind nur für Pre­mium- und Enter­prise-Pläne ver­füg­bar und müs­sen aktiv kon­fi­gu­riert und expor­tiert werden.

Wo fin­det man die Audit Logs?

Audit Logs wer­den nicht direkt in der UI ange­zeigt, son­dern regel­mä­ßig an einen kon­fi­gu­rier­ten exter­nen Spei­cher­ort gesen­det (z.B. Ama­zon Simple Sto­rage Ser­vice (Ama­zon S3), Micro­soft Azure Data Lake Sto­rage oder Google Cloud Sto­rage). Die Kon­fi­gu­ra­tion erfolgt über die Account­ebene in der Account Console:

  • Navi­giere zu Account Con­sole → Audit Logs
  • Wähle den gewünsch­ten Cloud-Spei­cher­ort für die Pro­to­kol­lie­rung aus
  • Die Logs wer­den im JSON-For­mat gespeichert

Typi­sche Inhalte der Audit Logs:

  • Benut­zer­an­mel­dun­gen (Login / Logout)
  • Start, Ände­rung und Löschung von Clus­tern, Jobs oder Notebooks
  • Zugriffe auf Daten­quel­len (z.B. SQL Ware­house, Delta Tables)
  • Ände­run­gen an Berech­ti­gun­gen und Rollen
  • Aktio­nen via REST API oder UI
  • Workspace-Ein­stel­lun­gen und Policy-Änderungen

Jeder Log-Ein­trag ent­hält: Zeit­stem­pel, Benut­zer-ID und IP-Adresse, Akti­ons­typ (z.B. create, delete, access), Res­sour­cen­typ (Clus­ter, Job, Note­book etc.), Sta­tus (SUCCESS, FAILURE).

Wann sollte man Audit Logs prüfen?

  • Bei Sicher­heits­vor­fäl­len oder Ver­dacht auf unau­to­ri­sierte Zugriffe
  • Im Rah­men von Com­pli­ance-Prü­fun­gen oder inter­nen Audits
  • Wenn es zu unge­woll­ten Ände­run­gen an Clus­tern, Daten oder Jobs kam
  • Zur Erstel­lung von Nut­zungs­be­rich­ten oder Ana­lyse von Nutzerverhalten
  • Bei der Feh­ler­su­che, wenn Jobs nicht wie erwar­tet gestar­tet wur­den (z.B. durch Policy-Einschränkungen)

Best Prac­ti­ces für die Arbeit mit Audit Logs:

  • Audit Logs soll­ten zen­tral gespei­chert und ver­sio­niert wer­den, idea­ler­weise in einem Data Lake mit akti­vier­tem Life­cy­cle Management.
  • Die Inte­gra­tion mit SIEM-Sys­te­men wie Splunk, Azure Sen­ti­nel oder Data­dog ermög­licht eine auto­ma­ti­sierte Ana­lyse und Alar­mie­rung sicher­heits­re­le­van­ter Ereignisse.
  • Geplante Aus­wer­tun­gen der Audit Logs soll­ten ein­ge­rich­tet wer­den, um unge­wöhn­li­che Akti­vi­tä­ten, fehl­ge­schla­gene Log­ins oder Ver­stöße gegen Sicher­heits­richt­li­nien regel­mä­ßig zu prüfen.
  • Eine detail­lierte Suche in den Audit Logs ist mög­lich, indem die Daten als Data­Frame gela­den und direkt per SQL oder PySpark ana­ly­siert werden.
  • Die Kon­trolle der Rol­len und Zugriffs­rechte auf Basis der Audit Logs kann sicher­stel­len, dass Nut­zer nur berech­tigte Res­sour­cen verwenden.

Struc­tu­red Strea­ming Logs

Für Anwen­dungs­fälle mit kon­ti­nu­ier­li­cher Daten­ver­ar­bei­tung, etwa Log-Ana­ly­sen, IoT-Streams oder Strea­ming-Inges­tion, stellt Dat­ab­ricks mit Struc­tu­red Strea­ming eine ska­lier­bare und feh­ler­to­le­rante Strea­ming-Engine auf Basis von Apa­che Spark bereit. Ergänzt wird dies durch die Low-Code-Infrastruktur von Delta Live Tables, die es ermög­licht, Strea­ming-Pipe­lines dekla­ra­tiv zu defi­nie­ren und auto­ma­tisch zu verwalten.

Damit Strea­ming-Jobs auch bei wach­sen­den Daten­vo­lu­men sta­bil und per­for­mant lau­fen, ist eine kon­ti­nu­ier­li­che Über­wa­chung von Logs, Sys­tem­me­tri­ken und Query-Sta­tus essen­zi­ell. Struc­tu­red Strea­ming Logs lie­fern detail­lierte Infor­ma­tio­nen zum Zustand, zur Ver­ar­bei­tungs­rate und zu mög­li­chen Feh­lern, sowohl in klas­si­schen Note­books als auch in pro­duk­ti­ven Pipe­lines mit Delta Live Tables.

Wo fin­det man die Struc­tu­red Strea­ming Logs?

Strea­ming-bezo­gene Logs sind über meh­rere Wege verfügbar:

  • In der Note­book-UI, wenn ein Strea­ming-Job direkt im Note­book aus­ge­führt wird (Aus­gabe erscheint unter dem Cell Output)
  • Über das Query Pro­gress API
  • In den Dri­ver Logs, ins­be­son­dere bei Feh­ler­mel­dun­gen und Checkpointing-Problemen
  • Optio­nal in einem defi­nier­ten Check­point-Ver­zeich­nis (meist in DBFS)

Typi­sche Inhalte der Struc­tu­red Strea­ming Logs:

  • Start­zeit, Batch-ID und Lauf­zeit jeder Mikro-Batch-Verarbeitung
  • Input- und Out­put-Raten pro Trigger
  • Feh­ler beim Lesen oder Schrei­ben von Streams (z.B. Kafka, Delta, Auto Loader)
  • Sta­tus von Water­mar­king, State Store, Trig­ger und Commit-Operationen
  • Hin­weise auf latenz­be­dingte Ver­zö­ge­run­gen oder ver­lo­rene Events

Wann sollte man Struc­tu­red Strea­ming Logs prüfen?

  • Wenn Trig­ger-Zei­ten deut­lich anstei­gen oder Latenz zunimmt
  • Bei Feh­lern beim Lesen oder Schrei­ben von Daten­quel­len (z.B. Kafka, Auto Loa­der, Delta)
  • Wenn ein­zelne Mikro-Bat­ches nicht abge­schlos­sen wer­den oder hän­gen bleiben
  • Bei Sta­teful Ope­ra­ti­ons, wenn z.B. Water­mar­king nicht kor­rekt funktioniert
  • Wenn Strea­ming-Queries uner­war­tet stop­pen oder nicht auto­ma­tisch neu starten

Best Prac­ti­ces für die Arbeit mit Struc­tu­red Strea­ming Logs:

  • Das Moni­to­ring struk­tu­rier­ter Strea­ming-Queries kann durch Set­zen des Para­me­ters spark.sql.streaming.metricsEnabled=true voll­stän­dig akti­viert werden.
  • Für Debug­ging und Ein­blick in Abfra­ge­pläne bie­ten sich Metho­den wie streamingQuery.awaitTermination() oder .explain() an.
  • Check­points soll­ten dau­er­haft gespei­chert wer­den, etwa unter dbfs:/checkpoints/my-stream/, um eine Wie­der­her­stel­lung im Feh­ler­fall zu ermöglichen.
  • Die Ana­lyse von Durch­satz, Batch-Dauer und Feh­lern kann direkt über den Tab „Strea­ming“ in der Spark UI erfolgen.
  • Regel­mä­ßige Aus­wer­tun­gen von last­Pro­gress ermög­li­chen die auto­ma­ti­sche Benach­rich­ti­gung bei lang­sa­men oder feh­ler­haf­ten Batches.
  • Bei län­ger lau­fen­den Strea­ming-Jobs soll­ten die Rota­tion und die externe Spei­che­rung der Dri­ver Logs berück­sich­tigt wer­den, bei­spiels­weise in Ama­zon Simple Sto­rage Ser­vice (Ama­zon S3) oder Micro­soft Azure Data Lake Sto­rage (ADLS).

Per­for­mance-Opti­mie­rung in Databricks

Um die Effi­zi­enz gro­ßer Daten­ver­ar­bei­tungs­pro­zesse in Dat­ab­ricks sicher­zu­stel­len, ist eine kon­ti­nu­ier­li­che Per­for­mance-Opti­mie­rung ent­schei­dend, ins­be­son­dere bei wach­sen­dem Daten­vo­lu­men und kom­ple­xe­ren Workloads. Dat­ab­ricks bie­tet hier­für eine Kom­bi­na­tion aus auto­ma­ti­schen Opti­mie­rungs­me­cha­nis­men und manu­el­len Ein­griffs­mög­lich­kei­ten, die gezielt auf Sto­rage, Query-Ver­hal­ten und Res­sour­cen­ma­nage­ment wirken.

Auto­ma­ti­sche Opti­mie­rung durch Databricks

  • Auto-Opti­mize: Auto­ma­ti­siert das Kom­pak­tie­ren (Com­pac­tion) und Sor­tie­ren von Delta-Tabel­len nach dem Write. Dadurch wird das Lesen beschleu­nigt und das Datei­sys­tem effi­zi­en­ter genutzt. Ideal bei häu­fi­gen Insert-/Up­date-Ope­ra­tio­nen.
  • Pho­ton Engine: Eine spe­zi­ell ent­wi­ckelte, vek­tor­ba­sierte Query-Engine für SQL und Delta Lake, die signi­fi­kante Per­for­man­ce­ge­winne bei ana­ly­ti­schen Abfra­gen lie­fert, beson­ders bei CPU-inten­si­ven Workloads. Pho­ton läuft auf moder­nen Instan­zen, zum Bei­spiel mit Intel Ice Lake oder AMD EPYC.
  • Adap­tive Query Exe­cu­tion (AQE): Spark passt Query-Pläne zur Lauf­zeit auto­ma­tisch an, sobald tat­säch­li­che Daten­sta­tis­ti­ken bekannt wer­den (z.B. bei Skew, Join-Stra­te­gien oder dyna­mi­scher Repar­ti­tio­nie­rung). AQE ist beson­ders effek­tiv bei unvor­her­seh­ba­ren Datenverteilungen.
  • Auto-Merge und ZORDER: Dat­ab­ricks kann Delta-Tabel­len auto­ma­tisch zusam­men­füh­ren (OPTIMIZE + ZORDER BY), was das Abfra­ge­ver­hal­ten auf Par­ti­ti­ons­ebene erheb­lich verbessert.

Manu­elle Optimierungsstrategien

Für noch fei­nere Kon­trolle oder bei kom­ple­xen Work­flows ist manu­elle Opti­mie­rung oft not­wen­dig, beson­ders bei gro­ßen Data­sets, kom­ple­xen Joins oder hete­ro­ge­nen Datenquellen.

  • Par­ti­tio­nie­rung und Repar­ti­tio­nie­rung: Eine sinn­volle Par­ti­tio­nie­rung redu­ziert den I/O‑Aufwand und ver­bes­sert die Par­al­le­li­tät. Dabei sollte dar­auf geach­tet wer­den, eine Über- oder Unter­par­ti­tio­nie­rung zu ver­mei­den. Die Anzahl der Par­ti­tio­nen lässt sich bei Bedarf über den Para­me­ter spark.sql.shuffle.partitions gezielt anpassen.
  • Caching und Per­sis­tenz: Häu­fig genutzte Zwi­schen­er­geb­nisse soll­ten mit .cache() oder .persist(StorageLevel.MEMORY_AND_DISK) gespei­chert wer­den, um wie­der­hol­tes Berech­nen zu ver­mei­den (dies ist nur bei aus­rei­chen­dem Spei­cher sinnvoll).
  • Broad­cast Joins: Für kleine Lookup-Tabel­len (z. B. Refe­renz­da­ten) sind Broad­cast Joins effi­zi­en­ter als Shuf­fles. Auto­ma­tisch akti­vier­bar über spark.sql.autoBroadcastJoinThreshold.
  • Skew-Hand­ling: Wenn einige Par­ti­tio­nen wesent­lich grö­ßer sind als andere (z.B. bei stark kon­zen­trier­ten Schlüs­seln), kann die Ver­ar­bei­tung mas­siv ver­lang­samt wer­den. Lösun­gen sind: 
    • Sal­ting (künst­li­ches Ver­tei­len von Hot Keys)
    • Adap­tive Joins durch AQE
    • Fil­ter-Push­downs und expli­zite Repartitionierung
  • Mate­ria­li­sie­rung von Zwi­schen­schrit­ten: Bei sehr kom­ple­xen Pipe­lines (z.B. mit meh­re­ren Joins oder UDFs) kann das Zwi­schen­spei­chern von Teil­ergeb­nis­sen (.write.mode(„overwrite“).save(…)) in Delta oder Par­quet die Sta­bi­li­tät und Wie­der­ver­wend­bar­keit verbessern.

Fazit

Ein effek­ti­ves Moni­to­ring und eine struk­tu­rierte Log-Ana­lyse sind uner­läss­lich, um die Per­for­mance und Sta­bi­li­tät von Dat­ab­ricks-Workloads sicher­zu­stel­len. Durch die Kom­bi­na­tion von Spark UI, Logs, Event-Daten und exter­nen Moni­to­ring-Tools las­sen sich Feh­ler­quel­len schnell iden­ti­fi­zie­ren und behe­ben. Beson­ders in pro­duk­ti­ven Umge­bun­gen lohnt sich der gezielte Ein­satz von Fea­tures wie Adap­tive Query Exe­cu­tion, Auto-Opti­mize oder Broad­cast Joins, um das volle Poten­zial der Platt­form aus­zu­schöp­fen. Nur wer Logs kon­se­quent nutzt und kon­ti­nu­ier­lich opti­miert, kann Ska­lier­bar­keit, Effi­zi­enz und Sicher­heit lang­fris­tig gewährleisten.

Quel­len: