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.
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.
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:
- Ł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.
- 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-tableskopiuje każdą tabelę w schemacie w jednym przebiegu. - Obciążenie przyrostowe:
appendtryb tracks monotonicznie rosnąca kolumna, taka jak klucz zastępczy, podczas gdylastmodifiedtryb 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ń. |

