Развертывание Hive Metastore#

Данное руководство представляет инструкции по развертыванию Hive Metastore на локальном компьютере для тестирования работы CedrusData с озерами данных. Мы будем использовать локальную файловую систему для хранения данных и СУБД Postgres в Docker-контейнере для хранения метаданных.

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

Введение#

Что такое Hive Metastore#

Озеро данных это совокупность файлов, хранящихся в файловой системе (например, HDFS или локальная файловая система) или облаке (например, S3). Для извлечения информации из файлов с помощью SQL необходимы метаданные, которые описывают, как представить информацию из файлов в виде реляционных таблиц. Примерами метаданных являются информация о путях к файлам, информация о колонках и типах данных, информация о partitioning. Hive Metastore представляет собой сервис управления метаданными.

Исторически Hive Metastore был частью инсталляции Hive, распределенного SQL-движка, который позволяет выполнять SQL-запросы к большим данным с помощью map-reduce задач Hadoop. Со временем популярность Hadoop и Hive снизилась, уступив место таким продуктам, как Spark и Trino. Так как Hive Metastore по-прежнему достаточно хорошо справляется с задачами управления метаданным, его продолжают использовать в инсталляциях Spark, Trino и ряда других продуктов в качестве изолированного компонента. Hive Metastore не требует развертывания Hadoop или Hive, но зависит от некоторых библиотек Hadoop.

Архитектура Hive Metastore#

Hive Metastore получает запросы на чтение или изменение метаданных от сторонних приложений через встроенный сервер, который работает по протоколу Thrift.

Hive Metastore хранит метаданные в сторонней базе данных для обеспечения сохранности информации в случае перезапуска сервиса. При получении запроса, Hive Metastore получает или обновляет необходимые метаданные в базе данных через интерфейс JDBC.

Некоторые запросы к Hive Metastore требуют изменение данных непосредственно в файловой системе. Например, при получении запроса на создание схемы, необходимо директорию схемы в файловой системе, а при получении запроса на удаление таблицы, необходимо удалить соответствующие файлы.

Для выполнения операций над файловой системой, Hive использует интерфейс Hadoop FileSystem. Файловая система может требовать специфичную конфигурацию. Так, для работы с данными в локальной файловой системе необходимо знать директорию, в которой хранятся данные, а для работы с данными в S3 необходимо предоставить URL и ключи доступа к object storage.

Развертывание Hive Metastore#

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

  1. Убедитесь, что у вас установлена JDK 8 или выше. Мы рекомендуем использовать Eclipse Temurin JDK 21, которую можно установить с помощью следующих команд:

    wget -O - https://packages.adoptium.net/artifactory/api/gpg/key/public | sudo apt-key add - && \
    echo "deb https://packages.adoptium.net/artifactory/deb $(awk -F= '/^VERSION_CODENAME/{print$2}' /etc/os-release) main" | sudo tee /etc/apt/sources.list.d/adoptium.list && \
    sudo apt update && \
    sudo apt install temurin-21-jdk
    
  2. Убедитесь, что у вас установлен Docker Engine, и что команда docker не требует sudo.

  3. Запустите экземпляр Postgres в Docker-контейнере:

    docker pull postgres && \
    docker run --name postgres-hive -e POSTGRES_USER=hive -e POSTGRES_PASSWORD=hive -p 5432:5432 -d postgres
    
  4. Создайте директорию в локальной файловой системе, в которой будут храниться данные. Владельцем директории должен быть пользователь, от имени которого будет запущен Hive Metastore. В данном примере мы создаем директорию /home/hive и меняем владельца на текущего пользователя:

    sudo mkdir /home/hive && \
    sudo chown $USER /home/hive
    
  5. Скачайте и распакуйте дистрибутив Hadoop:

    wget https://archive.apache.org/dist/hadoop/common/hadoop-3.3.4/hadoop-3.3.4.tar.gz && \
    tar -xf hadoop-3.3.4.tar.gz
    
  6. Скачайте и распакуйте дистрибутив Hive Metastore:

    wget https://archive.apache.org/dist/hive/hive-standalone-metastore-3.0.0/hive-standalone-metastore-3.0.0-bin.tar.gz && \
    tar -xf hive-standalone-metastore-3.0.0-bin.tar.gz
    
  7. Скачайте JDBC драйвер Postgres, и переместите его в поддиректорию lib/ в директории дистрибутива Hive Metastore:

    export HIVE_HOME=<директория дистрибутива Hive Metastore> && \
    wget https://jdbc.postgresql.org/download/postgresql-42.5.0.jar -P $HIVE_HOME/lib
    
  8. В директории дистрибутива Hive Metastore задайте следующее содержимое файлу conf/metastore-site.xml. Важными значениями являются (1) порт сервера Thrift в параметрах hive.metastore.port и metastore.thrift.uris, (2) порт Postgres в параметре javax.jdo.option.ConnectionURL и (3) директория, в которой будут храниться файлы в параметре metastore.warehouse.dir. Измените соответствующие параметры, если вы используете другие порты или другую директорию.

    <configuration>
        <property>
            <name>hive.metastore.port</name>
            <value>9083</value>
        </property>
        <property>
            <name>metastore.thrift.uris</name>
            <value>thrift://localhost:9083</value>
        </property>
        <property>
            <name>metastore.task.threads.always</name>
            <value>org.apache.hadoop.hive.metastore.events.EventCleanerTask</value>
        </property>
        <property>
            <name>metastore.expression.proxy</name>
            <value>org.apache.hadoop.hive.metastore.DefaultPartitionExpressionProxy</value>
        </property>
        <property>
            <name>javax.jdo.option.ConnectionDriverName</name>
            <value>org.postgresql.Driver</value>
        </property>
        <property>
            <name>javax.jdo.option.ConnectionURL</name>
            <value>jdbc:postgresql://localhost:5432/hive</value>
        </property>
        <property>
            <name>javax.jdo.option.ConnectionUserName</name>
            <value>hive</value>
        </property>
        <property>
            <name>javax.jdo.option.ConnectionPassword</name>
            <value>hive</value>
        </property>
        <property>
            <name>metastore.warehouse.dir</name>
            <value>/home/hive</value>
        </property>
    </configuration>
    
  9. Задайте переменные окружения JAVA_HOME и HADOOP_HOME:

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

    Во многих случаях директорию установки JDK можно узнать с помощью следующей команды:

    echo $(dirname $(dirname $(readlink -f $(which java))))
    
  10. Из директории дистрибутива Hive Metastore инициализируйте схему Hive Metastore в Postgres:

    bin/schematool -initSchema -dbType postgres
    
  11. Из директории дистрибутива Hive Metastore запустите Hive Metastore:

    bin/start-metastore
    

На этом процесс развертывания Hive Metastore завершен.

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

Для проверки работы Hive Metastore с CedrusData, мы запустим узел CedrusData с каталогом Hive коннектора, после чего выполним ряд SQL-запросов.

  1. Установите CedrusData из архива согласно инструкции Установка из архива.

  2. Сконфигурируйте каталог для работы с Hive Metastore. Для этого в директории CedrusData создайте файл etc/catalog/hive.properties со следующим содержимым:

    connector.name=hive
    hive.metastore.uri=thrift://localhost:9083
    hive.security=allow-all
    hive.max-partitions-per-writers=1000000
    
  3. Из директории дистрибутива CedrusData перезапустите узел:

    bin/launcher restart
    
  4. Из директории дистрибутива CedrusData выполните следующие команды для создания схемы в Hive Metastore, и создания и наполнения таблицы call_center в формате Parquet <https://parquet.apache.org/>_:

    bin/trino --execute "create schema hive.my_tpcds" && \
    bin/trino --execute "create table hive.my_tpcds.call_center with (format = 'PARQUET') as select * from tpcds.sf1.call_center"
    
  5. Из директории дистрибутива CedrusData выполните следующую команду для чтения данных из таблицы call_center:

    bin/trino --execute "select cc_call_center_id, cc_name from hive.my_tpcds.call_center"
    
  6. Убедитесь, что в директории Hive Metastore /home/hive появился файл таблицы call_center:

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

    bin/trino --execute "drop table hive.my_tpcds.call_center" && \
    bin/trino --execute "drop schema hive.my_tpcds"
    
  8. Убедитесь, что директория Hive Metastore /home/hive больше не содержит вложенных файлов и директорий:

    ls -R /home/hive