Projektowanie obsługi błędów w potokach danych i zadaniach roboczych

Ukończone

Wskazówka

Aby uzyskać więcej szczegółów, zobacz kartę Tekst i obrazy .

Gdy potoki danych kończą się niepowodzeniem, konsekwencje wykraczają poza natychmiastowe błędy zadań. Nieprawidłowe rekordy mogą uszkodzić analizę podrzędną, niezauważone błędy mogą gromadzić dług techniczny, a bez odpowiedniego zgłaszania alertów zespoły mogą wykrywać problemy godzin lub dni po ich wystąpieniu. Projektowanie niezawodnej obsługi błędów przekształca procesy w potokach z kruchych w odporne systemy, które chronią jakość danych i umożliwiają szybkie odzyskiwanie.

W tej lekcji dowiesz się, jak zaprojektować strategie obsługi błędów dla potoków danych, notesów i zadań w usłudze Azure Databricks.

Omówienie obowiązków związanych z obsługą błędów

Obsługa błędów w usłudze Azure Databricks działa na wielu poziomach, z których każda dotyczy różnych scenariuszy awarii. Platforma automatycznie obsługuje problemy na poziomie infrastruktury , takie jak błędy węzłów klastra. Twoim zadaniem jako inżynier danych jest skoncentrowanie się na błędach na poziomie danych i błędach logiki aplikacji.

Diagram wyjaśniający obowiązki związane z obsługą błędów.

Rozważ typowy potok ETL przetwarzający transakcje klientów. Błędy mogą wystąpić, gdy:

  • Dane źródłowe zawierają nieprawidłowe formaty lub brakujące wymagane pola
  • Logika przekształcania napotyka nieoczekiwane wartości
  • Przekroczono limit czasu połączeń usług zewnętrznych
  • Zasoby obliczeniowe stają się niedostępne

Każdy scenariusz wymaga innej odpowiedzi. Niektóre błędy uzasadniają natychmiastowe zakończenie potoku, podczas gdy inne powinny rejestrować problem i kontynuować przetwarzanie prawidłowych rekordów.

Definiowanie oczekiwań dotyczących jakości danych w potokach deklaratywnych

Lakeflow pipelines zapewniają wbudowane ograniczenia dotyczące jakości danych nazywane oczekiwaniami. Te ograniczenia weryfikują rekordy w miarę jak dane przepływają przez twój potok, dając ci kontrolę nad tym, jak obsługiwać nieprawidłowe dane.

Zrzut ekranu przedstawiający edytor deklaratywnego potoku z wyróżnionymi oczekiwaniami.

W przypadku niepowodzenia walidacji rekordu trzy akcje określają, co się stanie:

Akcja Zachowanie Przypadek użycia
ostrzegaj Nieprawidłowe rekordy zapisane w obiekcie docelowym; zarejestrowane metryki Monitorowanie trendów jakości danych
Upuść Nieprawidłowe rekordy wykluczone z celu Zapobieganie propagacji nieprawidłowych danych
Fail Potok jest natychmiast zatrzymywany Krytyczne ograniczenia, które nigdy nie muszą być naruszone

Wskazówka

Po niespełnieniu oczekiwania zatrzymany zostanie tylko ten określony przepływ. Inne przepływy równoległe w tym samym potoku kontynuują przetwarzanie. Ta izolacja zapobiega zatrzymaniu całej platformy danych przez pojedynczy problem z jakością danych.

Konfigurowanie obsługi błędów na poziomie zadania

Lakeflow Jobs udostępnia kilka mechanizmów do obsługi niepowodzeń zadań i zapewnienia niezawodności potoku. Te ustawienia współpracują ze sobą w celu utworzenia odpornych przepływów pracy.

Zrzut ekranu przedstawiający sposób konfigurowania obsługi błędów na poziomie zadania.

Ustawianie zasad ponawiania prób

Przejściowe błędy, takie jak przekroczenia limitu czasu sieci, tymczasowe ograniczenia zasobów lub krótkie przerwy w działaniu usługi, często są rozwiązywane samodzielnie. Skonfiguruj zasady ponawiania prób , aby automatycznie podejmować nieudane zadania:

  • Liczba ponownych prób: liczba prób przed oznaczeniem zadania jako nieudanego (zazwyczaj ponowna próba to 1–3)
  • Interwał ponawiania prób: czas między próbami, co pozwala systemom na odzyskanie

W przypadku zadań ciągłych platforma automatycznie stosuje wycofywanie wykładnicze. Każde kolejne niepowodzenie zwiększa czas oczekiwania przed następną próbą ponownego wykonania, uniemożliwiając szybkie, powtarzające się awarie, które mogłyby przytłoczyć zasoby.

Konfigurowanie limitów czasu

Zadanie, które zawiesza się na czas nieokreślony, zużywa zasoby i blokuje przetwarzanie podrzędne. Ustaw progi limitu czasu, aby zakończyć zadania nieodpowiadające.

  • Oczekiwany czas trwania: wyzwala powiadomienie ostrzegawcze, jeśli zostanie przekroczone
  • Maksymalny czas trwania: przerywa zadanie, jeśli zostanie przekroczone

W przypadku zadań przesyłania strumieniowego można również skonfigurować progi metryk listy prac przesyłania strumieniowego w obszarze Progi metryk w panelu konfiguracji zadania. Gdy zaległości przekroczą zdefiniowany próg, wyzwala to zdarzenie powiadomienia — zapewniając wczesne ostrzeżenie o opóźnieniu przetwarzania, zanim narastające opóźnienie przekształci się w większe. Ta funkcja jest obecnie dostępna w publicznej wersji zapoznawczej.

Dodawanie powiadomień

Proaktywne alerty umożliwiają szybkie reagowanie na błędy. Skonfiguruj powiadomienia , aby skontaktować się z zespołem za pośrednictwem:

  • Adresy e-mail
  • Kanały usługi Slack
  • Microsoft Teams
  • PagerDuty
  • Niestandardowe webhooki

Powiadomienia o rozpoczęciu zadania, powodzeniu, niepowodzeniu lub przekroczeniu progów czasu trwania można wyzwalać.

Ważne

Powiadomienia na poziomie zadania są uruchamiane przy każdej próbie ponawiania próby. Aby uniknąć zmęczenia powiadomień, wybierz pozycję Wycisz powiadomienia do ostatniej próby podczas konfigurowania powiadomień o zadaniu.

Projektowanie przepływów zadań warunkowych

Poza prostymi ponownymi próbami można zaprojektować zadania reagujące inteligentnie na błędy przy użyciu zależności zadań warunkowych:

  • Wszystko powiodło się: kontynuuj tylko wtedy, gdy każde zadanie nadrzędne zakończy się pomyślnie
  • Przynajmniej jeden błąd: Uruchomienie zadań obsługi błędów lub czyszczenia
  • Wszystko gotowe: Wykonaj niezależnie od statusu procesu nadrzędnego (przydatne w przypadku operacji czyszczenia)

Takie podejście umożliwia wzorce, takie jak uruchamianie zadania powiadomień w przypadku niepowodzenia przetwarzania lub wykonywanie logiki oczyszczania przed ponowną próbą.

Implementowanie obsługi błędów w notatnikach

Podczas kompilowania potoków za pomocą notesów implementujesz obsługę błędów bezpośrednio w kodzie. Obsługa wyjątków języka Python zapewnia szczegółową kontrolę nad odpowiedziami na błędy.

Przechwytywanie i obsługa wyjątków

Opakuj operacje, które mogą zakończyć się niepowodzeniem, w bloki try-except:

from pyspark.errors import PySparkException

try:
    df = spark.read.table("source_data")
    transformed = df.filter("amount > 0")
    transformed.write.mode("append").saveAsTable("target_data")
except PySparkException as e:
    if e.getErrorClass() == "TABLE_OR_VIEW_NOT_FOUND":
        # Handle missing source table
        print(f"Source table not found: {e.getMessageParameters()['relationName']}")
    else:
        raise  # Re-raise unexpected errors

W tym przykładzie przechwytuje PySparkExceptionklasę bazową błędów PySpark. Metoda getErrorClass() zwraca ustandaryzowany kod błędu, taki jak TABLE_OR_VIEW_NOT_FOUND, co umożliwia różne obsługę określonych błędów. Metoda getMessageParameters() udostępnia kontekst błędu, taki jak nazwa brakującej tabeli. Błędy, które nie są jawnie obsługiwane, zostają ponownie zgłaszane, aby uniknąć dyskretnego ignorowania nieoczekiwanych problemów.

Implementowanie logiki ponawiania prób

W przypadku operacji podatnych na błędy przejściowe zaimplementuj ponowienie próby przy użyciu wycofywania wykładniczego:

import time

def run_with_retry(operation, max_retries=3, base_delay=10):
    for attempt in range(max_retries + 1):
        try:
            return operation()
        except Exception as e:
            if attempt == max_retries:
                raise
            delay = base_delay * (2 ** attempt)
            print(f"Attempt {attempt + 1} failed, retrying in {delay}s: {e}")
            time.sleep(delay)

Sygnalizować powodzenie lub niepowodzenie zadań

Gdy notatnik jest uruchamiany jako zadanie, użyj dbutils.notebook.exit(), aby przekazać wyniki:

try:
    # Processing logic
    records_processed = process_data()
    dbutils.notebook.exit(f"SUCCESS: Processed {records_processed} records")
except Exception as e:
    dbutils.notebook.exit(f"FAILED: {str(e)}")

Zadania podrzędne mogą następnie używać tych wartości w logice warunkowej lub do raportowania.

Stosowanie najlepszych rozwiązań dotyczących obsługi błędów

Efektywna obsługa błędów równoważy dokładność z praktycznością. Weź pod uwagę następujące wytyczne:

Szybkie działanie w przypadku błędów krytycznych: gdy w grę wchodzi integralność danych, zatrzymaj przetwarzanie natychmiast. Kontynuowanie uszkodzonych danych powoduje większe problemy podrzędne.

Zrozumiały kontekst dziennika: dołącz wystarczającą ilość informacji, aby zdiagnozować problemy bez ujawniania poufnych danych. Rejestruj znaczniki czasu, liczby rekordów i klasyfikacje błędów.

Planowanie odzyskiwania: Projektuj potoki w taki sposób, aby umożliwiały naprawę nieudanych przebiegów. Używaj operacji idempotentnych tam, gdzie to możliwe, i organizuj zadania tak, aby tylko te, które zakończyły się niepowodzeniem, wymagały ponownego uruchomienia.

Monitorowanie trendów: śledzenie metryk jakości danych w czasie. Stopniowy wzrost porzuconych rekordów może wskazywać na zmiany systemu nadrzędnego, które wymagają uwagi.

Scenariusze niepowodzeń testów: sprawdź, czy obsługa błędów działa zgodnie z oczekiwaniami, celowo wprowadzając błędy podczas programowania.