Підручник з Apache Sqoop: ArchiТекстура, команди та приклад

⚡ Розумний підсумок

Apache Sqoop переміщує великі обсяги даних між реляційними базами даних та HDFS, використовуючи архітектуру конекторів, генеруючи завдання MapReduce, які імпортують таблиці в Hive або HBase та експортують оброблені результати назад у вихідну систему.

  • 🔘 Визначення: Sqoop передає великі обсяги даних між структурованими сховищами та HDFS через шар конектора на основі плагінів.
  • ☑️ Archiтекстура: Кожне завдання компілюється в програму MapReduce, яка працює лише з картами, а завдання якої паралельно витягують окремі фрагменти таблиці.
  • ✅ Роз'єми: Обкладинка драйверів у комплекті MySQL, PostgreSQL, Oracle, SQL Server та DB2, а також загальний резервний варіант JDBC.
  • 🧪 команди: Інструмент імпорту переносить таблицю в HDFS, Hive або HBase; інструмент експорту завантажує оброблені файли назад у таблицю.
  • 🛠️ Режими навантаження: Повне завантаження копіює всю таблицю, тоді як інкрементальні режими append та lastmodified витягують лише нові рядки.
  • ⚠️ Статус проекту: Sqoop переїхав на горище Apache у липні 2021 року, тож Spark JDBC та NiFi тепер мають нові конвеєри.

Підручник Apache Sqoop, що охоплює архітектуру, конектори та команди імпорту й експорту

Що таке SQOOP у Hadoop?

Апач Скуп (SQL-to-Hadoop) – це інструмент, призначений для підтримки масового експорту та імпорту даних у HDFS зі структурованих сховищ даних, таких як реляційні бази даних, корпоративні сховища даних та NoSQL-системи. Це інструмент міграції даних, заснований на архітектурі конекторів, яка підтримує плагіни для забезпечення підключення до нових зовнішніх систем.

Прикладом використання Hadoop Sqoop є підприємство, яке виконує нічний імпорт Sqoop для завантаження даних за день із робочої транзакційної RDBMS у Вулик сховище даних для подальшого аналізу.

Далі в цьому посібнику з Apache Sqoop ми дізнаємося про архітектуру Apache Sqoop.

Скуп Archiтектура

Все існуюче Системи управління базами даних розроблені з SQL стандарт на увазі. Проте кожна СУБД певною мірою відрізняється щодо діалекту. Таким чином, ця різниця створює проблеми, коли мова йде про передачу даних між системами. Конектори Sqoop — це компоненти, які допомагають подолати ці проблеми.

Передача даних між Sqoop Hadoop і зовнішньою системою зберігання даних стала можливою за допомогою конекторів Sqoop.

Sqoop має конектори для роботи з низкою популярних реляційних баз даних, у тому числі MySQL, PostgreSQL, Oracle, SQL Server і DB2. Кожен із цих конекторів знає, як взаємодіяти з пов’язаною з ним СУБД. Існує також загальний конектор JDBC для підключення до будь-якої бази даних, яка підтримує Javaпротокол JDBC. Крім того, Sqoop також забезпечує оптимізований MySQL та PostgreSQL конектори, які використовують специфічні для бази даних API для ефективного виконання масових передач.

На діаграмі нижче клієнт Sqoop розміщено між зовнішнім сховищем даних та кластером Hadoop, з рівнем конектора з одного боку та HDFS, Hive та HBase з іншого.

Діаграма архітектури Sqoop, що показує рівень з'єднувача, що з'єднує RDBMS з кластером Hadoop

Під шаром з'єднувача Sqoop генерує Java клас, який відображає один рядок таблиці, а потім надсилає лише карту MapReduce завдання. Кожне завдання зіставлення зчитує власний фрагмент діапазону розділених стовпців, тому пропускна здатність масштабується залежно від кількості мапперів, а не від одного курсора JDBC.

На додаток до цього, Sqoop має різні сторонні конектори для сховищ даних, починаючи від корпоративних сховища даних (включаючи Netezza, Teradata та Oracle) до магазинів NoSQL (таких як Couchbase). Однак ці роз’єми не постачаються з пакетом Sqoop; їх потрібно завантажити окремо, і їх можна легко додати до наявної інсталяції Sqoop.

Навіщо нам Sqoop?

Аналітична обробка за допомогою Hadoop вимагає завантаження величезних обсягів даних із різних джерел у кластери Hadoop. Цей процес масового завантаження даних у Hadoop із різнорідних джерел і подальшої їх обробки супроводжується певним набором проблем. Підтримка та забезпечення узгодженості даних і забезпечення ефективного використання ресурсів – це деякі фактори, які слід враховувати перед вибором правильного підходу до завантаження даних.

Основні проблеми:

  1. Завантаження даних за допомогою скриптів — Традиційний підхід використання скриптів для завантаження даних не підходить для масового завантаження даних у Hadoop; цей підхід є неефективним та дуже трудомістким.
  2. Прямий доступ до зовнішніх даних через застосунок Map-Reduce — Надання прямого доступу до даних, що зберігаються на зовнішніх системах (без завантаження в Hadoop), для програм, що використовують метод зменшення мап, ускладнює ці програми. Тому цей підхід не є здійсненним.

Окрім можливості роботи з величезними обсягами даних, Hadoop може працювати з даними в кількох різних формах. Тому для завантаження таких різнорідних даних у Hadoop були розроблені різні інструменти. Скуп та Потік є два таких інструменти завантаження даних.

Далі в цьому підручнику Sqoop із прикладами ми дізнаємося про різницю між Sqoop, Flume і HDFS.

Sqoop проти Flume проти HDFS у Hadoop

Скуп Потік HDFS
Sqoop використовується для імпорту даних зі структурованих джерел даних, таких як RDBMS. Flue використовується для переміщення масових потокових даних у HDFS. HDFS — це розподілена файлова система, яка використовується екосистемою Hadoop для зберігання даних.
Sqoop має архітектуру на основі конектора. Конектори знають, як підключитися до відповідного джерела даних і отримати дані. Flume має агентну архітектуру. Тут написаний код (який називається «агентом»), який піклується про отримання даних. HDFS має розподілену архітектуру, де дані розподіляються між кількома вузлами даних.
HDFS – це місце призначення для імпорту даних за допомогою Sqoop. Дані надходять до HDFS через нуль або більше каналів. HDFS є ідеальним місцем для зберігання даних.
Завантаження даних Sqoop не керується подіями. Завантаження даних Flume може керуватися подією. HDFS просто зберігає дані, надані їй будь-якими засобами.
Щоб імпортувати дані з джерел структурованих даних, потрібно використовувати лише команди Sqoop, оскільки його конектори знають, як взаємодіяти з джерелами структурованих даних і отримувати дані з них. Для завантаження потокових даних, таких як твіти, створені в Twitter, або файли журналів веб-сервера, слід використовувати Flume. Агенти Flume створені для отримання потокових даних. HDFS має власні вбудовані команди оболонки для зберігання даних. HDFS не може імпортувати потокові дані.

Основні характеристики Sqoop

Наведене вище порівняння пояснює, до якого місця належить Sqoop. Наведений нижче набір функцій визначає, чи підходить він для конкретного завдання з обробки даних.

  • Повне завантаження: Одна команда копіює всю таблицю, і import-all-tables копіює кожну таблицю в схемі за один прохід.
  • Збільшувальне навантаження: append режим tracks монотонно зростаючий стовпець, такий як сурогатний ключ, тоді як lastmodified режим tracks стовпець з міткою часу, тому передаються лише нові або змінені рядки.
  • Паралельне перенесення: Розділений стовпець розділяє діапазон ключів між завданнями мапування, а кількість маперів встановлює, скільки з них виконуються одночасно.
  • Імпорт запитів у довільній формі: Результат довільного SQL-запиту можна імпортувати замість цілої таблиці, що зберігає об'єднання та фільтри на стороні бази даних.
  • Пряме завантаження на склад: Імпорт може створити та заповнити Вулик таблицю або записувати безпосередньо в таблицю HBase, а не зупинятиping у необроблених файлах HDFS.
  • Стиснення та формати файлів: Вивід може бути записаний у вигляді тексту з роздільниками, SequenceFile, Avro або Parquet, з додатковим стисненням на рівні кодека.
  • Безпека: Sqoop інтегрується з Kerberos, а облікові дані можна зчитувати з файлу паролів або запитувати на їх введення замість того, щоб вводити їх у командному рядку.

Команди імпорту та експорту Sqoop

Обидва напрямки передачі виконуються через одну утиліту командного рядка. Інструмент імпорту переміщує рядки з бази даних до Hadoop, а інструмент експорту переміщує файли з Hadoop назад у таблицю бази даних.

Типовий імпорт вказує на JDBC-з'єднання, вихідну таблицю, каталог призначення, розділений стовпець та кількість маперів:

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

Експорт виконує зворотний потік. Він зчитує файли з роздільниками, які вже знаходяться в каталозі HDFS, і вставляє їх у існуючу таблицю, тому цільову таблицю потрібно створити спочатку:

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 ','

Щоденне завдання рідко потребує двічі всієї таблиці. Інкрементальний імпорт записує найвище значення, яке вже було отримано, і починає звідти під час наступного запуску:

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

Ці аргументи зустрічаються майже в кожній роботі:

аргументація Що воно контролює
--connect JDBC URL вихідної або цільової бази даних.
--table Таблиця, з якої зчитується під час імпорту або записується під час експорту.
--target-dir Каталог HDFS, який отримує імпорт. Він ще не повинен існувати.
--export-dir Каталог HDFS, файли якого зчитуються експортом.
--split-by Стовпець, діапазон якого розділено між завданнями карти.
--num-mappers (-m) Кількість паралельних завдань з картами. Значення за замовчуванням — чотири.
--incremental Вибирає append or lastmodified зміна tracкороль.
--hive-import Створює відповідну таблицю Hive та завантажує в неї імпортовані дані.

⚠️ Увага: Експорт не є окремою транзакцією. Кожне завдання зіставлення записів створює власний пакет, тому збій на півдорозі може залишити частину даних у цільовій таблиці. Маршрутизуйте запис через проміжну таблицю, коли завантаження має бути за принципом «все або нічого».

Стан проекту Sqoop та сучасні альтернативи

Одна деталь версії має значення, перш ніж будь-яка з наведених вище команд потрапить до планувальника.

Розробники Sqoop проголосували за завершення проекту у червні 2021 року, а перехід до Апачі Аттік завершено у липні 2021 року. Вебсайт, списки розсилки, репозиторій git, випуск tracker та завантаження залишаються доступними, але лише для читання, і подальші релізи не плануються. Останній реліз для виробництва — Sqoop 1.4.7 у 2017 році; окрема лінійка Sqoop 2 (1.99.x) так і не досягла паритету функцій і ніколи не була оголошена готовою до виробництва.

Існуючі завдання Sqoop все ще виконуються, а комерційні дистрибутиви Hadoop продовжують постачати та підтримувати інструмент на власних платформах. Однак нова робота з прийому даних зазвичай будується на одній із цих платформ:

Alternative Найкраще підходить
Spark з джерелом даних JDBC Таблиця пакетів extracts, які вже знаходяться всередині Spark конвеєр, з розділеним читанням замість мапперів.
Apache NiFi Візуально налаштована маршрутизація на основі потоку між багатьма гетерогенними системами.
Kafka Connect з роз'ємом CDC Безперервний збір даних про зміни замість щонічного пакетного вікна.
Керовані ETL-платформи, такі як Таленд Попередньо створені з'єднувачі, планування та походження без рукописних завдань.

Поширені запитання

Sqoop 1 — це єдиний клієнт командного рядка, який використовується в кожному навчальному посібнику. Sqoop 2 додав сервер, REST API та веб-інтерфейс, але він так і не досяг паритету функцій і ніколи не був позначений як готовий до виробництва, тому рядок 1.4.x залишився стандартним.

Моделює профілювання вихідних таблиць для визначення типів, ключів та розділених стовпців, пропонує межі розділів на основі розподілу рядків та позначає дрейф схеми перед перериванням завантаження. Вони також пропонують інкрементальні перевірки стовпців, виявляючи монотонну поведінку або поведінку з часовими мітками у вибірках даних.

Copilot швидко створює скелет аргументів, але він змішує синтаксис Sqoop 1 та Sqoop 2 та винаходить прапорці, які не приймає жоден реліз. Перевірте кожен аргумент у посібнику користувача Sqoop для встановленої версії, перш ніж планувати завдання.

Sqoop не може самостійно вибрати розділений стовпець, і імпорт не вдається. Або явно назвіть відповідний числовий або стовпець дати як розділений стовпець, або примусово виконайте одне завдання карти, яке серіалізує передачу.

Пароль, введений у командному рядку, видимий для всіх, хто перераховує процеси. Збережіть його у файлі HDFS, який може читати лише власник завдання, та вкажіть на нього аргумент password-file або скористайтеся інтерактивним запитом.

Розділений текст використовується за замовчуванням. Також підтримуються SequenceFile, Avro та Parquet, кожен з яких вибирається за допомогою власного аргументу. Стовпцевий Parquet підходить для пізніших аналітичних запитів, тоді як розділений текст залишається найпростішим для перевірки та експорту.

Чотири – це значення за замовчуванням, і це розумний початок. Більше маперів означає більше одночасних підключень до бази даних, тому практична межа залежить від того, що допускає вихідний сервер, а не від того, що може запланувати кластер Hadoop.

A Java середовище виконання, налаштоване Hadoop клієнт, який може зв'язатися з кластером, та JAR-файл драйвера JDBC для цільової бази даних, розміщений у каталозі бібліотеки Sqoop. Відсутність JAR-файлів драйвера є найпоширенішою помилкою першого запуску.

Підсумуйте цей пост за допомогою: