Интеграция HDFS с S3

Обзор

Simple Storage Service (S3) — это объектное хранилище, доступ к которому осуществляется по протоколу типа S3. Отдельный контейнер хранения в объектном хранилище S3 называется бакет. Бакеты могут быть публичными, что означает, что любой может получить доступ к хранилищу, или частными, требующими аутентификации.

Hadoop поддерживает протокол S3A для подключения к хранилищу S3. Это позволяет использовать инструменты командной строки HDFS для взаимодействия с удаленными объектными хранилищами.

В этой статье представлен пример подключения к внешнему хранилищу S3 для копирования данных в локальную HDFS с помощью команды distcp.

Дополнительную информацию о возможных конфигурациях HDFS для работы с хранилищем S3 можно получить в статье Hadoop-AWS module: Integration with Amazon Web Services. Поставщики хранилищ S3 могут поддерживать различные инструменты для подключения к хранилищу. Проконсультируйтесь с вашим провайдером S3 для получения информации о других способах интеграции с хранилищем.

Настройка интеграции с S3

Подготовительные шаги

Убедитесь, что на стороне хранилища создан пользователь для HDFS и у него есть необходимый доступ к файлам. Для прохождения аутентификации потребуются идентификатор ключа доступа (access key ID) и секретный ключ доступа (secret access key).

Если бакет публичный, к нему можно подключиться анонимно.

Зависимости

В ADH есть встроенный коннектор для объектного хранилища — S3A. Для корректной работы коннектора необходимо добавить две дополнительные библиотеки в classpath:

Добавьте эти библиотеки в директорию usr/lib/hadoop/lib/ на хостах кластера.

Аутентификация

Чтобы подключиться к частному бакету S3, необходимо предоставить корректные ключи доступа. При подключении к хранилищу HDFS пробует следующие типы аутентификации в таком порядке:

  • аргументы в URI (предупреждает о возможном нарушении безопасности);

  • конфигурация HDFS;

  • переменные среды AWS;

  • Amazon EC2 Instance Metadata Service.

Дополнительную информацию о настройке каждого типа аутентификации можно получить в статье Hadoop-AWS module: Integration with Amazon Web Services.

ВНИМАНИЕ

Потеря учетных данных может поставить под угрозу учетную запись. Убедитесь, что ключи доступа не попадают в логи и баг-репорты. По этой причине избегайте передачи ключей в S3A URL-запросах.

Для аутентификации с использованием конфигурации HDFS добавьте в core-site.xml параметры из таблице ниже.

Параметр Описание Значение по умолчанию

fs.s3a.access.key

Идентификатор ключа доступа. Не указывать для анонимного подключения

 — 

fs.s3a.secret.key

Секретный ключ доступа. Не указывать для анонимного подключения

 — 

fs.s3a.endpoint

S3-эндпоинт для подключения. Обратитесь к своему провайдеру S3 за информацией о том, какой эндпоинт использовать

s3.amazonaws.com

Дополнительные параметры описаны в документации Apache Hadoop — Hadoop-AWS module: Integration with Amazon Web Services.

Чтобы настроить эти параметры с помощью ADCM:

  1. Перейдите в раздел Clusters и выберите нужный кластер.

  2. Перейдите на вкладку Services и нажмите на HDFS.

  3. Включите параметр Show advanced, разверните список свойств Custom core-site.xml и выберите Add property.

  4. Добавьте необходимый параметр с его значением и нажмите Apply.

  5. Подтвердите изменения в конфигурации HDFS, нажав Save.

  6. В меню Actions выберите Restart, убедитесь, что для параметра Apply configs from ADCM установлено значение true, и нажмите Run.

Настройка параметров подключения к S3 в ADCM
Настройка параметров подключения к S3 в ADCM

Анонимное соединение

К публичному бакету S3 можно подключиться анонимно. Для этого укажите org.apache.hadoop.fs.s3a.AnonymousAWSCredentialsProvider в качестве значения параметра fs.s3a.aws.credentials.provider.

Эту опцию также можно использовать для проверки того, что бакет недоступен для анонимных пользователей. Для этого выполните команду:

$ hadoop fs -D fs.s3a.aws.credentials.provider=org.apache.hadoop.fs.s3a.AnonymousAWSCredentialsProvider \
 -ls s3a://<bucket>/

Здесь <bucket> — это имя бакета, с которым необходимо установить соединение.

Если доступ без аутентификации запрещен, попытка подключения должна завершиться такой ошибкой:

ls: s3a://develop-test-bucket/: getFileStatus on s3a://develop-test-bucket/: com.amazonaws.services.s3.model.AmazonS3Exception: Access Denied (Service: Amazon S3; Status Code: 403; Error Code: AccessDenied; Request ID: dc82c760b5ab707e; S3 Extended Request ID: null; Proxy: null), S3 Extended Request ID: null:AccessDenied

Подключение к хранилищу

Чтобы проверить подключение к хранилищу, выполните команду -ls:

$ hadoop fs -ls s3a://<bucket>/

Здесь <bucket> — это имя бакета, с которым необходимо установить соединение.

Пример вывода:

Found 3 items
drwxrwxrwx   - admin admin          0 2023-11-14 17:28 s3a://develop-test-bucket/adbm_n1
drwxrwxrwx   - admin admin          0 2023-11-14 17:28 s3a://develop-test-bucket/adbm_n2
drwxrwxrwx   - admin admin          0 2023-11-14 17:28 s3a://develop-test-bucket/repo

Копирование данных

Копировать данные между HDFS и S3 можно с помощью команды distcp. Чтобы скопировать данные из S3, выполните команду:

$ hadoop distcp \
       s3a://<bucket>/<path>/ \
       hdfs://<host>/<path>/

Здесь:

  • <bucket> — имя бакета, с которым устанавливается соединение;

  • <host> — nameservice кластера, FQDN или IP-адрес узла NameNode;

  • <path> — путь к копируемым данным или путь для сохранения данных.

Нашли ошибку? Выделите текст и нажмите Ctrl+Enter чтобы сообщить о ней