Развертывание MinIO для работы с данными через S3 API#

MinIO это S3-совместимый object storage, который удобно использовать при тестировании и изучении работы CedrusData и Trino с озерами данных в S3.

В данной статье приведена пошаговая инструкция по развертыванию MinIO на локальном компьютере и его интеграции с CedrusData. Мы запустим MinIO в standalone режиме, настроим Hive Metastore и CedrusData для работы с S3 API, после чего выполним SQL-запросы из CedrusData к данным в MinIO.

Процесс развертывания занимает порядка 10-15 минут.

Введение#

Что такое S3 API#

В 2006 году компания Amazon запустила продукт Amazon S3, представляющий собой объектное хранилище (object storage) в облаке AWS. Пользовательские приложения работают с Amazon S3 через S3 REST API - набор команд, которые можно отправить через протокол HTTP.

Со временем конкуренты выпустили ряд собственных объектных хранилищ, которые также поддерживают S3 REST API. Таким образом, S3 REST API де-факто является стандартным интерфейсом для работы с объектными хранилищами.

Для упрощения работы с S3-совместимыми объектными хранилищами был написан набор вспомогательных библиотек. Так, для выполнения операций над хранилищем из Java можно использовать библиотеку AWS Java SDK For Amazon S3. Для представления объектного хранилища в качестве файловой системы в экосистеме Hadoop была разработана файловая система S3AFileSystem.

Что такое MinIO#

MinIO это популярное высокопроизводительное S3-совместимое объектное хранилище, которое может быть развернуто on-premise. Возможность запуска on-premise позволяет использовать MinIO для тестирования и интеграции продуктов, работающих с S3 API.

Целевая конфигурация#

Наш пример состоит из следующих компонентов:

  • Экземпляр MinIO, который хранит данные в локальной файловой системе.

  • Экземпляр Hive Metastore, который хранит метаданные в Postgres, и работает с данными MinIO через S3 API.

  • Узел CedrusData, который настроен на работу с указанными выше экземплярами MinIO и Hive Metastore.

Развертывание MinIO#

Инструкции ниже приведены для операционных систем Ubuntu/Debian с использованием сетевых портов по умолчанию. Адаптируйте инструкции, если вы используете другую операционную систему, или если у вас возникает конфликт портов.

  1. Создайте локальную директорию, в которой будут храниться данные MinIO. Владельцем директории должен быть пользователь, от имени которого будет запущен MinIO. В данном примере мы создаем директорию /home/minio и меняем владельца на текущего пользователя.

    sudo mkdir /home/minio && \
    sudo chown $USER /home/minio
    
  2. Скачайте сервер MinIO и установите executable флаг:

    wget http://dl.min.io/server/minio/release/linux-amd64/minio && \
    chmod +x minio
    
  3. Запустите сервер MinIO. Сервер будет доступен на порту 9000. Поменяйте порт при необходимости. В команде ниже мы задаем имя и пароль root пользователя, которые будут в дальнейшем использованы как access key и secret key, соответственно.

    Примечание

    При промышленном использовании MinIO, имя и пароль root пользователя обычно используются администраторами, а конечные пользователи получают индивидуальные ключи с необходимым уровнем доступа.

    MINIO_ROOT_USER=accesskey MINIO_ROOT_PASSWORD=secretkey ./minio server /home/minio --address ":9000" --console-address ":9001"
    
  4. Скачайте клиент MinIO и настройте его для работы с запущенным сервером:

    wget https://dl.min.io/client/mc/release/linux-amd64/mc && \
    chmod +x mc && \
    ./mc alias set myminio http://localhost:9000 accesskey secretkey
    
  5. Создайте в MinIO bucket с именем mybucket:

    ./mc mb myminio/mybucket
    
  6. Убедитесь, что в директории /home/minio появилась директория mybucket:

    ls -R /home/minio
    

Процесс развертывания MinIO завершен.

Конфигурация Hive Metastore#

Для выполнения дальнейших шагов необходимо развернуть Hive Metastore и CedrusData согласно инструкции Развертывание Hive Metastore. Чтобы Hive Metastore мог работать с S3 API, необходимо добавить ряд библиотек и предоставить конфигурацию файловой системы S3AFileSystem.

  1. Добавьте в Hive Metastore библиотеки для работы с S3:

    export HIVE_HOME=<директория дистрибутива Hive Metastore> && \
    wget https://repo1.maven.org/maven2/org/apache/hadoop/hadoop-aws/3.3.4/hadoop-aws-3.3.4.jar -P $HIVE_HOME/lib && \
    wget https://repo1.maven.org/maven2/com/amazonaws/aws-java-sdk-core/1.12.336/aws-java-sdk-core-1.12.336.jar -P $HIVE_HOME/lib && \
    wget https://repo1.maven.org/maven2/com/amazonaws/aws-java-sdk-s3/1.12.336/aws-java-sdk-s3-1.12.336.jar -P $HIVE_HOME/lib && \
    wget https://repo1.maven.org/maven2/com/amazonaws/aws-java-sdk-dynamodb/1.12.336/aws-java-sdk-dynamodb-1.12.336.jar -P $HIVE_HOME/lib && \
    wget https://repo1.maven.org/maven2/joda-time/joda-time/2.12.1/joda-time-2.12.1.jar -P $HIVE_HOME/lib
    
  2. В директории дистрибутива Hive Metastore добавьте следующее содержимое в файл conf/metastore-site.xml.

    Примечание

    В данном примере мы работаем с MinIO через протокол http. Это сделано для простоты. В реальных сценариях следует использовать протокол https.

    <property>
        <name>fs.s3a.access.key</name>
        <value>accesskey</value>
    </property>
    <property>
        <name>fs.s3a.secret.key</name>
        <value>secretkey</value>
    </property>
    <property>
        <name>fs.s3a.endpoint</name>
        <value>http://localhost:9000</value>
    </property>
    <property>
        <name>fs.s3a.path.style.access</name>
        <value>true</value>
    </property>
    
  3. Из директории дистрибутива Hive Metastore перезапустите Hive Metastore. Убедитесь, что переменные окружения JAVA_HOME и HADOOP_HOME заданы:

    export JAVA_HOME=<директория установки JDK> && \
    export HADOOP_HOME=<директория дистрибутива Hadoop> && \
    bin/start-metastore
    

Процесс конфигурации Hive Metastore завершен.

Конфигурация CedrusData#

Чтобы CedrusData мог работать с S3 API, необходимо добавить параметры S3 в конфигурацию Hive коннектора.

  1. В директории дистрибутива CedrusData добавьте следующее содержимое в файл etc/catalog/hive.properties.

    Примечание

    В данном примере мы отключаем SSL и работаем с MinIO через протокол http. Это сделано для простоты. В реальных сценариях следует использовать протокол https.

    hive.s3.aws-access-key=accesskey
    hive.s3.aws-secret-key=secretkey
    hive.s3.endpoint=http://localhost:9000
    hive.s3.ssl.enabled=false
    hive.s3.path-style-access=true
    
  2. Из директории дистрибутива CedrusData перезапустите узел:

    bin/launcher restart
    

Процесс конфигурации CedrusData завершен.

Проверка работы MinIO с CedrusData#

На данном этапе у вас должны быть запущенны MinIO, Hive Metastore и узел CedrusData.

  1. Из директории дистрибутива CedrusData выполните следующие команды, чтобы создать таблицу call_center, и наполнить ее данными в формате Parquet:

    bin/trino --execute "create schema hive.minio with (location = 's3a://mybucket/myschema')" && \
    bin/trino --execute "create table hive.minio.call_center as select * from tpcds.sf1.call_center;"
    
  2. Убедитесь, что в директории /home/minio появились новые директории и файлы:

    ls -R /home/minio
    
  3. Из директории дистрибутива CedrusData выполните следующую команду для чтения данных из таблицы call_center:

    bin/trino --execute "select cc_call_center_id, cc_name from hive.minio.call_center"
    
  4. Из директории дистрибутива CedrusData выполните следующие команды для удаления таблицы и схемы:

    bin/trino --execute "drop table hive.minio.call_center" && \
    bin/trino --execute "drop schema hive.minio"
    
  5. Убедитесь, что соответствующие файлы и директории удалены из /home/minio:

    ls -R /home/minio
    

Мы также рекомендуем вам ознакомиться с расширенными инструкциями по настройке безопасности MinIO и Trino.