Samouczek Apache Sqoop: Archistruktura, polecenia i przykład

⚡ Inteligentne podsumowanie

Apache Sqoop przenosi dane zbiorcze między bazami danych relacyjnymi a systemem HDFS przy użyciu architektury łączników, generując zadania MapReduce, które importują tabele do Hive lub HBase i eksportują przetworzone wyniki z powrotem do systemu źródłowego.

  • 🔘 Definicja: Sqoop przesyła dane zbiorcze między ustrukturyzowanymi magazynami i systemem HDFS za pośrednictwem warstwy łącznika opartej na wtyczkach.
  • Archistruktura: Każde zadanie kompiluje się do programu MapReduce, który obsługuje wyłącznie mapę i którego zadania równolegle pobierają oddzielne wycinki tabeli.
  • Złącza: Dołączone sterowniki MySQL, PostgreSQL, Oracle, SQL Server i DB2, a także ogólny zapasowy interfejs JDBC.
  • 🧪 polecenia: Narzędzie importujące wciąga tabelę do HDFS, Hive lub HBase; narzędzie eksportujące przesyła przetworzone pliki z powrotem do tabeli.
  • 🛠️. Tryby ładowania: Pełne ładowanie kopiuje całą tabelę, podczas gdy tryby dołączania i ostatnio modyfikowane pobierają tylko nowe wiersze.
  • ⚠️ Status projektu: Sqoop przeszedł na emeryturę w Apache Attic w lipcu 2021 r., więc Spark JDBC i NiFi oferują teraz nowe rurociągi.

Samouczek Apache Sqoop obejmujący architekturę, łączniki oraz polecenia importu i eksportu

Co to jest SQOOP w Hadoop?

Apache Sqoop (SQL-to-Hadoop) to narzędzie przeznaczone do obsługi masowego eksportu i importu danych do HDFS ze strukturalnych magazynów danych, takich jak relacyjne bazy danych, korporacyjne hurtownie danych i systemy NoSQL. Jest to narzędzie do migracji danych oparte na architekturze konektorów, która obsługuje wtyczki zapewniające łączność z nowymi systemami zewnętrznymi.

Przykładowym przypadkiem użycia Hadoop Sqoop jest przedsiębiorstwo, które co noc przeprowadza import Sqoop w celu załadowania danych dziennych z produkcyjnego transakcyjnego RDBMS do Ul hurtownia danych do dalszej analizy.

W dalszej części tego samouczka poświęconego Apache Sqoop poznamy architekturę Apache Sqoop.

Łyżka Architektura

Wszystkie istniejące systemy zarządzania bazą danych są zaprojektowane z SQL standardowo. Jednak każdy DBMS różni się w pewnym stopniu dialektem. Zatem ta różnica stwarza wyzwania, jeśli chodzi o przesyłanie danych między systemami. Złącza Sqoop to komponenty, które pomagają pokonać te wyzwania.

Przesyłanie danych pomiędzy Sqoop Hadoop a zewnętrznym systemem pamięci masowej jest możliwe dzięki złączom Sqoop.

Sqoop posiada złącza do pracy z wieloma popularnymi relacyjnymi bazami danych, m.in MySQL, PostgreSQL, Oracle, SQL Server i DB2. Każdy z tych łączników wie, jak współdziałać z powiązanym z nim systemem DBMS. Istnieje również ogólne złącze JDBC umożliwiające połączenie z dowolną obsługującą bazą danych JavaProtokół JDBC. Ponadto Sqoop zapewnia również zoptymalizowane MySQL oraz PostgreSQL łączniki korzystające z interfejsów API specyficznych dla bazy danych w celu wydajnego wykonywania transferów zbiorczych.

Poniższy diagram umieszcza klienta Sqoop między zewnętrznym magazynem danych a klastrem Hadoop, z warstwą łącznika po jednej stronie i HDFS, Hive i HBase po drugiej.

Diagram architektury Sqoop przedstawiający warstwę łącznika łączącą system RDBMS z klastrem Hadoop

Pod warstwą złącza Sqoop generuje Java klasa, która odzwierciedla jeden wiersz tabeli, a następnie przesyła tylko mapę MapaReduce zadanie. Każde zadanie mapy odczytuje własny wycinek zakresu podzielonych kolumn, więc przepustowość skaluje się wraz z liczbą mapperów, a nie z pojedynczym kursorem JDBC.

Oprócz tego Sqoop oferuje różne złącza firm trzecich do magazynów danych, od korporacyjnych magazyn danych (w tym Netezza, Teradata i Oracle) do sklepów NoSQL (takich jak Couchbase). Jednak te złącza nie są dostarczane z pakietem Sqoop; należy je pobrać osobno i można je łatwo dodać do istniejącej instalacji Sqoop.

Dlaczego potrzebujemy Sqoopa?

Analityczne przetwarzanie przy użyciu Hadoop wymaga ładowania ogromnych ilości danych z różnych źródeł do klastrów Hadoop. Ten proces masowego ładowania danych do Hadoop z heterogenicznych źródeł, a następnie ich przetwarzania, wiąże się z pewnym zestawem wyzwań. Utrzymanie i zapewnienie spójności danych oraz zapewnienie efektywnego wykorzystania zasobów to niektóre czynniki, które należy wziąć pod uwagę przed wyborem właściwego podejścia do ładowania danych.

Główne problemy:

  1. Ładowanie danych za pomocą skryptów — Tradycyjne podejście polegające na używaniu skryptów do ładowania danych nie nadaje się do masowego ładowania danych do Hadoop. Takie podejście jest nieefektywne i bardzo czasochłonne.
  2. Bezpośredni dostęp do danych zewnętrznych za pomocą aplikacji Map-Reduce — Zapewnienie bezpośredniego dostępu do danych przechowywanych w systemach zewnętrznych (bez ładowania do Hadoop) w aplikacjach Map-Reduce komplikuje te aplikacje. Dlatego to podejście nie jest wykonalne.

Oprócz możliwości pracy z ogromnymi zbiorami danych, Hadoop może przetwarzać dane w wielu różnych formatach. Dlatego, aby załadować tak heterogeniczne dane do Hadoopa, opracowano różne narzędzia. Łyżka oraz Przepływ są dwa takie narzędzia do ładowania danych.

W dalszej części tego samouczka Sqoop z przykładami dowiemy się o różnicy między Sqoop, Flume i HDFS.

Sqoop vs Flume vs HDFS w Hadoop

Łyżka Przepływ HDFS
Sqoop służy do importowania danych ze źródeł danych strukturalnych, takich jak RDBMS. Flume służy do przenoszenia masowych danych przesyłanych strumieniowo do HDFS. HDFS to rozproszony system plików używany przez ekosystem Hadoop do przechowywania danych.
Sqoop ma architekturę opartą na konektorach. Konektory wiedzą, jak połączyć się z odpowiednim źródłem danych i pobrać dane. Flume ma architekturę opartą na agencie. Tutaj napisany jest kod (nazywany „agentem”), który zajmuje się pobieraniem danych. HDFS ma rozproszoną architekturę, w której dane są rozproszone po wielu węzłach danych.
HDFS to miejsce docelowe importu danych za pomocą Sqoop. Dane przepływają do HDFS przez zero lub więcej kanałów. HDFS to najlepsze miejsce do przechowywania danych.
Ładowanie danych Sqoop nie jest sterowane zdarzeniami. Ładowanie danych Flume może być spowodowane zdarzeniem. HDFS po prostu przechowuje dane dostarczone mu w jakikolwiek sposób.
Aby zaimportować dane ze źródeł danych strukturalnych, wystarczy użyć poleceń Sqoop, ponieważ jego konektory wiedzą, jak współdziałać ze źródłami danych strukturalnych i pobierać z nich dane. Aby załadować dane przesyłane strumieniowo, takie jak tweety generowane na Twitterze lub pliki dziennika serwera WWW, należy skorzystać z Flume. Agenci Flume są zbudowani do pobierania danych przesyłanych strumieniowo. HDFS ma własne wbudowane polecenia powłoki do przechowywania danych. HDFS nie może importować danych przesyłanych strumieniowo.

Główne cechy Sqoop

Powyższe porównanie wyjaśnia, gdzie Sqoop się znajduje. Poniższy zestaw funkcji decyduje, czy pasuje do konkretnego zadania przetwarzania.

  • Załadowany do pełna: Pojedyncze polecenie kopiuje całą tabelę i import-all-tables kopiuje każdą tabelę w schemacie w jednym przebiegu.
  • Obciążenie przyrostowe: append tryb tracks monotonicznie rosnąca kolumna, taka jak klucz zastępczy, podczas gdy lastmodified tryb tracks kolumna ze znacznikiem czasu, więc przesyłane są tylko nowe lub zmienione wiersze.
  • Transfer równoległy: Podział kolumny dzieli zakres kluczy pomiędzy zadania mapy, a liczba mapperów określa, ile zadań jest uruchamianych jednocześnie.
  • Importowanie zapytań w dowolnej formie: Zamiast całej tabeli można zaimportować wynik dowolnego polecenia SQL, co pozwala na zachowanie połączeń i filtrów po stronie bazy danych.
  • Bezpośredni załadunek do magazynu: Import może utworzyć i wypełnić Ul tabeli lub zapisuj bezpośrednio do tabeli HBase zamiast zatrzymywać sięping w surowych plikach HDFS.
  • Kompresja i formaty plików: Dane wyjściowe mogą być zapisane w formacie tekstu rozdzielonego, SequenceFile, Avro lub Parquet, z opcjonalną kompresją na poziomie kodeka.
  • Bezpieczeństwo: Sqoop integruje się z Kerberosem, a dane uwierzytelniające można odczytać z pliku haseł lub poprosić o ich podanie zamiast wpisywać je w wierszu poleceń.

Polecenia importu i eksportu Sqoop

Oba kierunki transferu realizowane są za pomocą jednego narzędzia wiersza poleceń. Narzędzie importu przenosi wiersze z bazy danych do Hadoopa, a narzędzie eksportu przenosi pliki z Hadoopa z powrotem do tabeli bazy danych.

Typowy import określa połączenie JDBC, tabelę źródłową, katalog docelowy, kolumnę podziału i liczbę maperów:

sqoop import \
  --connect jdbc:mysql://localhost:3306/employees \
  --username hadoop \
  --password-file /user/hadoop/.mysql.password \
  --table employees \
  --target-dir /user/hadoop/warehouse/employees \
  --split-by emp_no \
  --num-mappers 4

Eksport odwraca przepływ. Odczytuje pliki rozdzielone, które już znajdują się w katalogu HDFS i wstawia je do istniejącej tabeli, dlatego najpierw należy utworzyć tabelę docelową:

sqoop export \
  --connect jdbc:mysql://localhost:3306/employees \
  --username hadoop \
  --password-file /user/hadoop/.mysql.password \
  --table employee_summary \
  --export-dir /user/hadoop/warehouse/employee_summary \
  --input-fields-terminated-by ','

Zadanie nocne rzadko wymaga dwukrotnego pobrania całej tabeli. Import przyrostowy rejestruje najwyższą wartość, jaką już zaobserwował, i rozpoczyna od niej kolejne uruchomienie:

sqoop import \
  --connect jdbc:mysql://localhost:3306/sales \
  --table orders \
  --incremental append \
  --check-column order_id \
  --last-value 15000 \
  --target-dir /user/hadoop/warehouse/orders

Oto argumenty, które pojawiają się niemal w każdej pracy:

Argument Co kontroluje
--connect JDBC URL źródłowej lub docelowej bazy danych.
--table Tabela, z której dokonywany jest odczyt podczas importu lub do której dokonywany jest zapis podczas eksportu.
--target-dir Katalog HDFS, który otrzymuje import. Nie może już istnieć.
--export-dir Katalog HDFS, którego pliki są odczytywane przez eksport.
--split-by Kolumna, której zakres jest podzielony pomiędzy zadania mapy.
--num-mappers (-m) Liczba równoległych zadań mapowania. Domyślnie cztery.
--incremental Wybiera append or lastmodified zmiana trackról.
--hive-import Tworzy pasującą tabelę Hive i ładuje do niej zaimportowane dane.

⚠️ Uważaj: Eksport nie jest pojedynczą transakcją. Każde zadanie mapowania zatwierdza własną partię, więc awaria w połowie może pozostawić część danych w tabeli docelowej. W przypadku obciążenia typu „wszystko albo nic” należy kierować zapis przez tabelę przejściową.

Status projektu Sqoop i nowoczesne alternatywy

Jeden szczegół wersji ma znaczenie zanim którekolwiek z powyższych poleceń trafi do harmonogramu.

Deweloperzy Sqoop zagłosowali za zakończeniem projektu w czerwcu 2021 r., a przeniesienie do Poddasze Apaczów ukończone w lipcu 2021 r. Strona internetowa, listy mailingowe, repozytorium git, problem tracker i pliki do pobrania pozostają dostępne, ale tylko do odczytu, a kolejne wydania nie są planowane. Ostatnią wersją produkcyjną jest Sqoop 1.4.7 z 2017 roku; osobna linia Sqoop 2 (1.99.x) nigdy nie osiągnęła parzystości funkcji i nigdy nie została uznana za gotową do produkcji.

Istniejące zadania Sqoop nadal działają, a komercyjne dystrybucje Hadoop nadal dostarczają i wspierają to narzędzie na swoich platformach. Nowe zadania związane z ingestią są jednak zazwyczaj budowane na jednym z poniższych:

alternatywa Najlepsze dopasowanie
Spark ze źródłem danych JDBC Tabela wsadowa extracts, które już siedzą w środku Spark potok z partycjonowanymi odczytami zamiast maperów.
Apache NiFi Oparte na przepływie, wizualnie konfigurowalne routingi pomiędzy wieloma heterogenicznymi systemami.
Kafka Connect z łącznikiem CDC Ciągłe przechwytywanie danych o zmianach zamiast nocnego okna wsadowego.
Zarządzane platformy ETL, takie jak Taland Wstępnie skonfigurowane łączniki, harmonogramowanie i pochodzenie bez konieczności ręcznego pisania zadań.

FAQ

Sqoop 1 to jedyny klient wiersza poleceń, z którego korzysta każdy samouczek. Sqoop 2 dodał serwer, API REST i interfejs użytkownika, ale nigdy nie osiągnął parzystości funkcji i nie został oznaczony jako gotowy do produkcji, więc linia poleceń 1.4.x pozostała standardowa.

Modele profilują tabele źródłowe, aby wnioskować o typach, kluczach i kolumnach podziału, sugerować granice partycji na podstawie rozkładu wierszy i sygnalizować dryft schematu przed przerwaniem obciążenia. Proponują również przyrostowe kolumny kontrolne, wykrywając monotoniczne lub czasowe zachowania w danych próbki.

Copilot szybko tworzy szkielet argumentów, ale miesza składnię Sqoop 1 i Sqoop 2 oraz tworzy flagi, których żadna wersja nie akceptuje. Przed zaplanowaniem zadania należy sprawdzić każdy argument pod kątem podręcznika użytkownika Sqoop dla zainstalowanej wersji.

Sqoop nie może samodzielnie wybrać kolumny podziału i import kończy się niepowodzeniem. Należy jawnie wskazać odpowiednią kolumnę liczbową lub datową jako kolumnę podziału albo wymusić pojedyncze zadanie mapowania, które serializuje transfer.

Hasło wpisane w wierszu poleceń jest widoczne dla każdego, kto wyświetla listę procesów. Zapisz je w pliku HDFS, który jest dostępny tylko dla właściciela zadania, i wskaż na niego argument pliku haseł lub użyj interaktywnego monitu.

Tekst rozdzielony jest domyślny. Obsługiwane są również SequenceFile, Avro i Parquet, każdy wybierany za pomocą własnego argumentu. Kolumnowy Parquet sprawdza się w późniejszych zapytaniach analitycznych, natomiast tekst rozdzielony pozostaje najprostszy do inspekcji i eksportu.

Cztery to wartość domyślna i rozsądny początek. Więcej mapperów oznacza więcej jednoczesnych połączeń z bazą danych, więc praktyczny limit to to, co toleruje serwer źródłowy, a nie to, co może zaplanować klaster Hadoop.

A Java środowisko wykonawcze, skonfigurowane Hadoop klienta, który może połączyć się z klastrem, oraz plik JAR sterownika JDBC dla docelowej bazy danych umieszczony w katalogu biblioteki Sqoop. Brak plików JAR sterownika to najczęstszy błąd pierwszego uruchomienia.

Podsumuj ten post następująco: