Projektowanie obsługi błędów w potokach danych i zadaniach roboczych
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.
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.
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.
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.