Начало работы с Sqoop

В этом руководстве описано, как использовать Sqoop для передачи данных между базами данных и HDFS.

Установка Sqoop

Чтобы установить Sqoop в существующий кластер через ADCM:

  1. Добавьте сервис Sqoop в кластер, как показано в статье Добавление сервисов.

  2. Распределите компоненты Sqoop по хостам кластера, выполнив действия, описанные в статье Добавление компонентов.

  3. При необходимости отредактируйте конфигурацию Sqoop по умолчанию, согласно инструкции в статье Настройка сервисов.

  4. Установите сервис.

Соединение с базой данных

Sqoop использует JDBC для подключения к базе данных. В этом примере создается подключение к базе данных Arenadata PostgreSQL 14, поэтому для корректной работы необходимо загрузить драйвер JDBC PostgreSQL соответствующей версии.

  1. Сделайте каталог с JDBC-драйверами Sqoop доступным для чтения и записи:

    $ chmod -R 777 /var/lib/sqoop
  2. Загрузите драйвер:

    $ curl -L 'https://jdbc.postgresql.org/download/postgresql-42.7.3.jar' -o postgresql-42.7.3.jar.jdbc4.jar
  3. Выполните тестовый запрос, чтобы проверить соединение. Например, запросите список таблиц в БД:

    $ 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/

Чтобы убедиться, что данные успешно скопированы:

  1. Войдите как пользователь postgres:

    $ sudo su - postgres
  2. Запустите клиент psql:

    $ psql terminal client
  3. Запросите информацию о таблице:

    $ \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)
Нашли ошибку? Выделите текст и нажмите Ctrl+Enter чтобы сообщить о ней