Начало работы с Sqoop
В этом руководстве описано, как использовать Sqoop для передачи данных между базами данных и HDFS.
Установка Sqoop
Чтобы установить Sqoop в существующий кластер через ADCM:
-
Добавьте сервис Sqoop в кластер, как показано в статье Добавление сервисов.
-
Распределите компоненты Sqoop по хостам кластера, выполнив действия, описанные в статье Добавление компонентов.
-
При необходимости отредактируйте конфигурацию Sqoop по умолчанию, согласно инструкции в статье Настройка сервисов.
-
Установите сервис.
Соединение с базой данных
Sqoop использует JDBC для подключения к базе данных. В этом примере создается подключение к базе данных Arenadata PostgreSQL 14, поэтому для корректной работы необходимо загрузить драйвер JDBC PostgreSQL соответствующей версии.
-
Сделайте каталог с JDBC-драйверами Sqoop доступным для чтения и записи:
$ chmod -R 777 /var/lib/sqoop
-
Загрузите драйвер:
$ curl -L 'https://jdbc.postgresql.org/download/postgresql-42.7.3.jar' -o postgresql-42.7.3.jar.jdbc4.jar
-
Выполните тестовый запрос, чтобы проверить соединение. Например, запросите список таблиц в БД:
$ sqoop list-tables \ --connect jdbc:postgresql://127.0.0.1:5432/test_db \ --username <username> -P
Пример вывода:
2024-05-29 11:47:29,608 (main) [INFO - org.apache.sqoop.Sqoop.<init>(Sqoop.java:94)] Running Sqoop version: 1.4.7_arenadata2 2024-05-29 11:47:29,743 (main) [INFO - org.apache.sqoop.manager.SqlManager.initOptionDefaults(SqlManager.java:98)] Using default fetchSize of 1000 author book
Перенос данных в HDFS
Чтобы перенести данные из определенной таблицы в HDFS, выполните команду:
$ sqoop import \
--connect <JDBC-URL> \
--username <username> -P \
--table <table-name> \
--target-dir <HDFS-directory>
Здесь:
-
JDBC-URL
— строка подключения JDBC; -
username
— имя пользователя, имеющего доступ к запрошенной таблице; -
table-name
— имя таблицы, которую нужно импортировать в HDFS; -
HDFS-directory
— новая или существующая директория в HDFS.
Пример команды:
$ sqoop import \
--connect jdbc:postgresql://127.0.0.1:5432/test_db \
--username user1 -P \
--table book \
--target-dir books/
Чтобы убедиться, что данные успешно скопированы, выполните:
$ hdfs dfs -ls hdfs://adhdev/books
Пример вывода:
Found 5 items -rw-r--r-- 3 hdfs hadoop 0 2024-05-29 07:45 hdfs://adhdev/user/sqoop/books/_SUCCESS -rw-r--r-- 3 hdfs hadoop 50 2024-05-29 07:44 hdfs://adhdev/user/sqoop/books/part-m-00000 -rw-r--r-- 3 hdfs hadoop 57 2024-05-29 07:44 hdfs://adhdev/user/sqoop/books/part-m-00001 -rw-r--r-- 3 hdfs hadoop 31 2024-05-29 07:45 hdfs://adhdev/user/sqoop/books/part-m-00002 -rw-r--r-- 3 hdfs hadoop 35 2024-05-29 07:45 hdfs://adhdev/user/sqoop/books/part-m-00003
Создание задачи
Задача Sqoop (команда job
) — это инструмент, который позволяет сохранять команды импорта и экспорта для использования в будущем.
Чтобы создать задачу, используйте команду:
$ sqoop job --create myjob \
--import \
--connect jdbc:postgresql://127.0.0.1:5432/test_db \
--username user1 -P \
--table book \
--target-dir books/
Приведенная выше команда создает задачу под названием myjob
, которая импортирует данные из таблицы PostgreSQL book
в директорию books в HDFS.
Убедитесь, что задача была создана успешно, выполнив:
$ sqoop job --list
Вывод команды:
Available jobs: myjob
Для запуска сохраненной задачи используйте команду:
$ sqoop job --exec myjob
Перенос данных из HDFS
Вы можете экспортировать данные обратно из HDFS в базу данных с помощью команды export
. Таблица для экспортируемых данных уже должна быть создана в базе.
Для экспорта данных в БД выполните команду:
$ sqoop export \
--connect <JDBC-URL> \
--username <username> -P \
--table <table-name> \
--export-dir <HDFS-directory>
Здесь:
-
JDBC-URL
— строка подключения JDBC; -
username
— имя пользователя, имеющего доступ к запрошенной таблице; -
table-name
— имя таблицы, в которую необходимо перенести данные; -
HDFS-directory
— HDFS-директория с данными, которые нужно перенести.
Пример команды:
$ sqoop export \
--connect jdbc:postgresql://127.0.0.1:5432/test_db \
--username user1 -P \
--table book \
--target-dir books/
Чтобы убедиться, что данные успешно скопированы:
-
Войдите как пользователь
postgres
:$ sudo su - postgres
-
Запустите клиент psql:
$ psql terminal client
-
Запросите информацию о таблице:
$ \d book
Пример вывода:
Table "public.book" Column | Type | Collation | Nullable | Default -------------+------------------------+-----------+----------+---------------------------------- id | integer | | not null | nextval('book_id_seq'::regclass) title | character varying(255) | | not null | author_id | integer | | not null | public_year | smallint | | | Indexes: "book_pkey" PRIMARY KEY, btree (id) Foreign-key constraints: "fk_author" FOREIGN KEY (author_id) REFERENCES author(id)