Pozyskiwanie danych za pomocą Auto Loader
Wskazówka
Aby uzyskać więcej szczegółów, zobacz kartę Tekst i obrazy .
Gdy nowe pliki danych są stale dostarczane w magazynie w chmurze, potrzebujesz wydajnego sposobu ich przetwarzania bez ręcznego śledzenia, które pliki zostały pozyskane. ** Auto Loader rozwiązuje to wyzwanie, automatycznie wykrywając i pozyskując nowe pliki, gdy tylko się pojawią, zapewniając gwarancje dokładnie jednokrotnego przetwarzania bez konieczności ręcznego zarządzania stanem lub punktami kontrolnymi.
Informacje o sposobie działania modułu ładującego automatycznego
Auto Loader to źródło strukturalnego przesyłania strumieniowego, które obserwuje lokalizację przestrzeni dyskowej w chmurze i jest używane do przetwarzania przyrostowego nowych plików. Zamiast wielokrotnie skanować całe katalogi, Auto Loader utrzymuje informację o przetworzonych już plikach, zapewniając, że każdy plik jest załadowany dokładnie raz.
Po uruchomieniu strumienia Auto Loader może on przetwarzać istniejące pliki w katalogu, a następnie stale obserwować nowe pliki. Strumień przechowuje informacje o postępie w lokalizacji punktu kontrolnego, co umożliwia wznowienie dokładnie z miejsca, w którym zostało zatrzymane, jeśli zostanie przerwane.
Moduł automatycznego ładowania wykrywa nowe pliki przy użyciu jednego z dwóch trybów:
- Tryb listy katalogów: Auto Loader okresowo wyświetla katalog wejściowy w celu odnalezienia nowych plików. Takie podejście nie wymaga dodatkowej konfiguracji poza dostępem do magazynu.
- Tryb powiadamiania o plikach: Funkcja automatycznego ładowania używa usług powiadomień w chmurze do odbierania zdarzeń po nadejściu nowych plików. Ten tryb jest bardziej wydajny w przypadku obciążeń na dużą skalę, ponieważ pozwala uniknąć powtarzających się list katalogów.
W przypadku większości obciążeń produkcyjnych Databricks zaleca tryb powiadamiania o plikach ze zdarzeniami plików włączonymi w zewnętrznej lokalizacji w Unity Catalog. W przypadku zdarzeń plików funkcja automatycznego ładowania odbiera powiadomienia bezpośrednio po odebraniu plików, co zmniejsza opóźnienia i koszty interfejsu API w chmurze.
Skonfiguruj Auto Loader do wczytywania plików
Aby załadować dane za pomocą Auto Loader, należy użyć formatu cloudFiles z spark.readStream. Poniższy przykład odczytuje pliki JSON z usługi Azure Data Lake Storage i zapisuje je w tabeli Unity Catalog.
base_path = "abfss://container@storage.dfs.core.windows.net/autoloader/orders"
schema_path = f"{base_path}/schema"
checkpoint_path = f"{base_path}/checkpoint"
(spark.readStream
.format("cloudFiles")
.option("cloudFiles.format", "json")
.option("cloudFiles.schemaLocation", schema_path)
.load("abfss://container@storage.dfs.core.windows.net/incoming/orders/")
.writeStream
.option("checkpointLocation", checkpoint_path)
.trigger(availableNow=True)
.toTable("sales.bronze.orders"))
Opcja cloudFiles.format określa format pliku źródłowego. Auto loader obsługuje pliki JSON, CSV, Parquet, Avro, ORC, XML, text i binarne.
cloudFiles.schemaLocation przechowuje wywnioskowany schemat, który umożliwia modułowi ładującemu automatyczne śledzenie zmian schematu w czasie. Chociaż lokalizacja schematu i lokalizacja punktu kontrolnego mogą być takie same, przechowywanie ich oddzielnie umożliwia zresetowanie strumienia bez utraty schematu wnioskowanego.
Ustawienie trigger(availableNow=True) przetwarza wszystkie aktualnie dostępne pliki, a następnie zatrzymuje się. Ten schemat sprawdza się dobrze w przypadku zaplanowanych zadań wsadowych. W przypadku ciągłego przetwarzania można pominąć wyzwalacz lub użyć trigger(processingTime="1 minute") do przetwarzania plików w określonych odstępach czasu.
Używanie składni SQL z funkcją read_files
Auto Loader obsługuje również składnię SQL przez funkcję zwracającą tabelę read_files. Takie podejście jest przydatne, jeśli wolisz program SQL lub podczas pracy w notesach SQL:
SELECT * FROM read_files(
'abfss://container@storage.dfs.core.windows.net/incoming/orders/',
format => 'json',
schemaHints => 'order_id INT, amount DECIMAL(10,2)'
)
W przypadku korzystania z read_files z tabel przesyłania strumieniowego w potokach usługi Lakeflow funkcje Auto Loader są automatycznie włączone. Użyj słowa kluczowego STREAM , aby włączyć przetwarzanie przyrostowe:
CREATE OR REFRESH STREAMING TABLE bronze_orders
AS SELECT * FROM STREAM read_files(
'abfss://container@storage.dfs.core.windows.net/incoming/orders/',
format => 'json'
)
W tym kontekście pipeline automatycznie zarządza punktami kontrolnymi i ewolucją schematu.
Wskazówka
Podczas pracy z Unity Catalog, przechowuj punkty kontrolne i lokalizacje schematu w zarządzanej lokalizacji przechowywania. Zapewnia to spójne zarządzanie i pozwala uniknąć problemów z uprawnieniami w zagnieżdżonych ścieżkach.
Obsługa wnioskowania i ewolucji schematu
Moduł automatycznego ładowania może automatycznie wykrywać schemat plików źródłowych, eliminując konieczność ręcznego definiowania schematów. Po włączeniu wnioskowania schematu, Auto Loader pobiera próbki plików w celu określenia nazw kolumn i typów danych.
W przypadku plików JSON i CSV moduł automatycznego ładowania domyślnie wywnioskuje wszystkie kolumny jako ciągi. Takie konserwatywne podejście zapobiega niezgodnościom typów, które mogą spowodować utratę danych. Aby włączyć automatyczne wykrywanie typów, ustaw cloudFiles.inferColumnTypes opcję:
(spark.readStream
.format("cloudFiles")
.option("cloudFiles.format", "json")
.option("cloudFiles.inferColumnTypes", "true")
.option("cloudFiles.schemaLocation", checkpoint_path)
.load(source_path))
Gdy dane źródłowe wprowadzają nowe kolumny, moduł automatycznego ładowania wykrywa zmianę i może automatycznie rozwijać schemat docelowy. Opcja cloudFiles.schemaEvolutionMode steruje tym zachowaniem:
| Mode | Zachowanie |
|---|---|
addNewColumns |
Stream nie działa. Nowe kolumny są dodawane do schematu. Po ponownym uruchomieniu strumień będzie kontynuowany przy użyciu zaktualizowanego schematu. Jest to ustawienie domyślne, gdy nie podano żadnego schematu. |
addNewColumnsWithTypeWidening |
Stream nie działa. Nowe kolumny są dodawane do schematu i obsługiwane zmiany typu danych (na przykład INT do LONG) są automatycznie rozszerzane. Nieobsługiwane zmiany typu są przechwytywane w pliku _rescued_data. Wymaga środowiska Databricks Runtime 16.4 lub nowszego. |
rescue |
Schemat nigdy nie ewoluował, a strumień nie kończy się niepowodzeniem. Wszystkie nowe kolumny są rejestrowane w kolumnie _rescued_data. |
failOnNewColumns |
Stream nie działa. Usługa Stream nie jest uruchamiana ponownie, chyba że podany schemat zostanie zaktualizowany lub plik danych o przestępstwach zostanie usunięty. |
none |
Schemat nie jest ewoluowany, nowe kolumny są ignorowane, a dane nie są ratowane, chyba że opcja jest ustawiona rescuedDataColumn . Jest to ustawienie domyślne w przypadku podania schematu. |
Uratowana kolumna danych (_rescued_data) przechwytuje wszystkie dane, które nie są zgodne z oczekiwanym schematem, w tym niezgodności typów i nieoczekiwanych kolumn. Ta funkcja zapobiega utracie danych, gdy dane źródłowe nie są zgodne z oczekiwaniami. Moduł automatycznego ładowania automatycznie dodaje tę kolumnę podczas wnioskowania schematu.
(spark.readStream
.format("cloudFiles")
.option("cloudFiles.format", "csv")
.option("cloudFiles.schemaEvolutionMode", "rescue")
.schema(expected_schema)
.load(source_path))
Aby zmienić nazwę uratowanych kolumn danych, użyj rescuedDataColumn opcji:
.option("rescuedDataColumn", "my_rescued_data")
Jeśli wiesz, że niektóre kolumny powinny mieć określone typy, użyj wskazówek schematu , aby zastąpić wywnioskowane typy:
.option("cloudFiles.schemaHints", "order_date DATE, amount DECIMAL(10,2)")
Monitorowanie i optymalizacja strumieni Auto Loader
W przypadku obciążeń produkcyjnych monitorowanie ułatwia śledzenie postępu przetwarzania danych i identyfikowanie problemów. Funkcja automatycznego ładowania udostępnia funkcję SQL do wykonywania zapytań dotyczących stanu odnalezionych plików:
SELECT * FROM cloud_files_state('/path/to/checkpoint');
To zapytanie zwraca metadane dotyczące plików odnalezionych przez moduł automatycznego ładowania, w tym ich stan przetwarzania. Te informacje umożliwiają sprawdzenie, czy pliki są pozyskiwane zgodnie z oczekiwaniami.
Auto Loader przekazuje metryki za pomocą pulpitu nawigacyjnego postępu Structured Streaming, w tym:
-
numFilesOutstanding: Pliki odnalezione, ale nie zostały jeszcze przetworzone -
numBytesOutstanding: Łączna liczba bajtów oczekujących na przetworzenie
W przypadku obciążeń o dużym wolumenie steruj szybkością przetwarzania przy użyciu cloudFiles.maxFilesPerTrigger lub cloudFiles.maxBytesPerTrigger. Te ustawienia zapobiegają sytuacji, w której jakakolwiek pojedyncza mikropartia staje się zbyt duża:
.option("cloudFiles.maxFilesPerTrigger", "1000")
.option("cloudFiles.maxBytesPerTrigger", "1g")
Ważne
Lokalizacja punktu kontrolnego przechowuje informacje o stanie krytycznym. Unikaj stosowania zasad cyklu życia przechowywania w chmurze, które mogą usuwać pliki punktów kontrolnych, ponieważ powoduje to uszkodzenie stanu strumienia i wymaga rozpoczęcia od nowa.
Aby uzyskać dostęp do metadanych na poziomie pliku w pozyskanych danych, wybierz kolumnę _metadata . Ta ukryta kolumna zawiera informacje o każdym pliku źródłowym, w tym file_path, file_name, file_sizei file_modification_time:
(spark.readStream
.format("cloudFiles")
.option("cloudFiles.format", "parquet")
.load(source_path)
.select("*", "_metadata.file_path", "_metadata.file_modification_time"))
Moduł automatycznego ładowania bezproblemowo integruje się z potokami Lakeflow, gdzie automatycznie obsługuje zarządzanie punktami kontrolnymi i schematem. W następnej jednostce dowiesz się, jak używać Auto Loader w definicjach potoków deklaratywnych dla kompleksowych procesów pozyskiwania danych.