ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Hive] Remote Metastore Database 구성하기
    Hive 2024. 11. 18. 11:15
    반응형

    - 목차

     

    들어가며.

    이번 글에서는 Hive Metastore 에서 Local Database 인 Derby 가 아닌 Remote Database 와 연결하는 전반적인 과정을 설명합니다.

     

    https://cwiki.apache.org/confluence/pages/viewpage.action?pageId=27362076#AdminManualMetastoreAdministration-RemoteMetastoreDatabase

     

    AdminManual Metastore Administration - Apache Hive - Apache Software Foundation

    All the metadata for Hive tables and partitions are accessed through the Hive Metastore. Metadata is persisted using JPOX ORM solution (Data Nucleus) so any database that is supported by it can be used by Hive. Most of the commercial relational databases a

    cwiki.apache.org

     

    Remote Database 는 MySQL 를 사용하며, Docker 기반으로 실습 환경 구축을 설명합니다.

     

    MySQL ConnectorJ 를 포함하는 Hive Docker Image 구성.

    먼저 Hive 는 기본적으로 MySQL Connector 드라이버를 포함하고 있지 않습니다.

    따라서 Hive 가 MySQL 과 JDBC 통신을 하기 위하여 드라이버가 필요하며, 이를 포함하는 Docker 이미지를 빌드합니다.

    베이스 이미지로써 apache/hive:4.0.1 을 사용하였습니다.

    그리고 MySQL Connector Driver 를 다운로드하여 Hive 가 사용하는 Classpath 하위에 등록합니다.

     

    mkdir -p ./dockers
    
    cat <<EOF> ./dockers/hive-docker
    FROM apache/hive:4.0.1
    USER root
    
    RUN apt-get update && apt-get install -y wget
    RUN wget https://repo1.maven.org/maven2/mysql/mysql-connector-java/8.0.30/mysql-connector-java-8.0.30.jar \
        -O /opt/hive/lib/mysql-connector-java-8.0.30.jar
    
    USER hive
    
    EOF
    
    docker build -t hive-mysql:4.0.1 -f ./dockers/hive-docker .

     

    hive-site.xml 구성.

    우선 Hive 와 Remote Database 를 연결하기 위해서는 아래의 설정들이 추가된 hive-site.xml 파일이 필요합니다. 

    javax.jdo.option.ConnectionURL

    기본적으로 Hive 와 외부 데이터베이스들은 JDBC 기반으로 통신을 하게 됩니다.

    그리하여 MySQL Connector Driver 의 설치과정이 수반되었던 것이며, 

    javax.jdo.option.ConnectionURL 은 "jdbc:mysql://mysql:3306/metastore" 와 같은 형식의 주소 URL 을 입력합니다. 

     

    javax.jdo.option.ConnectionDriverName

    ConnectionDriverName 은 미리 설치하였던 MySQL Connector Driver 를 Fully Qualified Name 을 사용합니다.

    "com.mysql.jdbc.Driver"

     

    javax.jdo.option.ConnectionUserName / javax.jdo.option.ConnectionPassword

    Hive Client 를 위해서 생성한 UserName & Password 를 입력하여 사용합니다.

     

    결과적으로 아래와 같은 형식으로 hive-site.xml 파일을 준비해주시면 Hive Metastore 와 Remote Database 사이의 연결 준비가 끝이 납니다. 

    <configuration>
      <property>
        <name>javax.jdo.option.ConnectionURL</name>
        <value>jdbc:mysql://mysql:3306/metastore?createDatabaseIfNotExist=true</value>
      </property>
      <property>
        <name>javax.jdo.option.ConnectionDriverName</name>
        <value>com.mysql.cj.jdbc.Driver</value>
      </property>
      <property>
        <name>javax.jdo.option.ConnectionUserName</name>
        <value>hive</value>
      </property>
      <property>
        <name>javax.jdo.option.ConnectionPassword</name>
        <value>hive123</value>
      </property>
      <property>
        <name>hive.metastore.uris</name>
        <value>thrift://hive:9083</value>
      </property>
      <property>
        <name>hive.metastore.authorization.storage.checks</name>
        <value>true</value>
      </property>
    </configuration>

     

    Hive 와 MySQL 실행.

    아래의 내용들은 Hive 와 MySQL 을 Docker Container 로 실행하기 위한 방법과 순서를 설명합니다.

    MySQL ConnectorJ 를 추가한 Hive Docker Image.

    mkdir -p ./dockers
    
    cat <<EOF> ./dockers/hive-docker
    FROM apache/hive:4.0.1
    USER root
    
    RUN apt-get update && apt-get install -y wget
    RUN wget https://repo1.maven.org/maven2/mysql/mysql-connector-java/8.0.30/mysql-connector-java-8.0.30.jar \
        -O /opt/hive/lib/mysql-connector-java-8.0.30.jar
    
    USER hive
    
    EOF
    
    docker build -t hive-mysql:4.0.1 -f ./dockers/hive-docker .
     

    Config Files.

    cat <<EOF> ./dockers/user.sql
    CREATE DATABASE metastore;
    CREATE USER 'hive'@'%' IDENTIFIED BY 'hive123';
    GRANT ALL PRIVILEGES ON metastore.* TO 'hive'@'%';
    FLUSH PRIVILEGES;
    EOF
    
    cat <<EOF> ./dockers/hive-site.xml
    <configuration>
      <property>
        <name>javax.jdo.option.ConnectionURL</name>
        <value>jdbc:mysql://mysql:3306/metastore?createDatabaseIfNotExist=true</value>
      </property>
      <property>
        <name>javax.jdo.option.ConnectionDriverName</name>
        <value>com.mysql.cj.jdbc.Driver</value>
      </property>
      <property>
        <name>javax.jdo.option.ConnectionUserName</name>
        <value>hive</value>
      </property>
      <property>
        <name>javax.jdo.option.ConnectionPassword</name>
        <value>hive123</value>
      </property>
      <property>
        <name>hive.metastore.uris</name>
        <value>thrift://hive:9083</value>
      </property>
      <property>
        <name>hive.metastore.authorization.storage.checks</name>
        <value>true</value>
      </property>
    </configuration>
    EOF

    docker-compose.yaml

    cat <<EOF> $(pwd)/dockers/docker-compose.yaml
    version: '3.9'
    
    services:
      mysql:
        image: mysql:8.0.30
        platform: linux/amd64
        container_name: mysql
        hostname: mysql
        volumes:
          - $(pwd)/dockers/user.sql:/docker-entrypoint-initdb.d/user.sql
        environment:
          MYSQL_ROOT_PASSWORD: 1234
        ports:
          - "3306:3306"
        networks:
          - hive
      hive-metastore:
        image: hive-mysql:4.0.1
        container_name: hive-metastore
        hostname: hive-metastore
        entrypoint: ["/bin/bash", "-c"]
        command: >
          "schematool -dbType mysql -initSchema;
           hive --service metastore"
        volumes:
          - $(pwd)/dockers/hive-site.xml:/opt/hive/conf/hive-site.xml
        environment:
          HIVE_METASTORE_USER: hive
          HIVE_METASTORE_PASSWORD: hive123
          HIVE_METASTORE_DB_TYPE: mysql
          HIVE_METASTORE_HOST: mysql
          SERVICE_NAME: metastore
          DB_ROOT_PASSWORD: 1234
        depends_on:
          - mysql
        ports:
          - "9083:9083"
        networks:
          - hive
    networks:
      hive:
        driver: bridge
    EOF
    
    docker-compose -f ./dockers/docker-compose.yaml -p hive up -d

     

    위 docker-compose 가 실행되면 아래의 이미지와 같은 2개의 Container 를 확인할 수 있습니다.

     

    Hive 와 MySQL 의 연결 시도의 성공 결과로써 아래와 같은 Database 와 Table 이 생성됨을 확인할 수 있습니다. 

    show databases;
    
    +------------------+
    |Database          |
    +------------------+
    |information_schema|
    |metastore         |
    |mysql             |
    |performance_schema|
    |sys               |
    +------------------+

     

    show tables;
    +-----------------------------+
    |Tables_in_metastore          |
    +-----------------------------+
    |AUX_TABLE                    |
    |BUCKETING_COLS               |
    |CDS                          |
    |COLUMNS_V2                   |
    |COMPACTION_METRICS_CACHE     |
    |COMPACTION_QUEUE             |
    |COMPLETED_COMPACTIONS        |
    |COMPLETED_TXN_COMPONENTS     |
    |CTLGS                        |
    |DATABASE_PARAMS              |
    |DATACONNECTORS               |
    |DATACONNECTOR_PARAMS         |
    |DBS                          |
    |DB_PRIVS                     |
    |DC_PRIVS                     |
    |DELEGATION_TOKENS            |
    |FUNCS                        |
    |FUNC_RU                      |
    |GLOBAL_PRIVS                 |
    |HIVE_LOCKS                   |
    |I_SCHEMA                     |
    |KEY_CONSTRAINTS              |
    |MASTER_KEYS                  |
    |MATERIALIZATION_REBUILD_LOCKS|
    |METASTORE_DB_PROPERTIES      |
    |MIN_HISTORY_LEVEL            |
    |MIN_HISTORY_WRITE_ID         |
    |MV_CREATION_METADATA         |
    |MV_TABLES_USED               |
    |NEXT_COMPACTION_QUEUE_ID     |
    |NEXT_LOCK_ID                 |
    |NEXT_WRITE_ID                |
    |NOTIFICATION_LOG             |
    |NOTIFICATION_SEQUENCE        |
    |NUCLEUS_TABLES               |
    |PACKAGES                     |
    |PARTITIONS                   |
    |PARTITION_EVENTS             |
    |PARTITION_KEYS               |
    |PARTITION_KEY_VALS           |
    |PARTITION_PARAMS             |
    |PART_COL_PRIVS               |
    |PART_COL_STATS               |
    |PART_PRIVS                   |
    |REPLICATION_METRICS          |
    |REPL_TXN_MAP                 |
    |ROLES                        |
    |ROLE_MAP                     |
    |RUNTIME_STATS                |
    |SCHEDULED_EXECUTIONS         |
    |SCHEDULED_QUERIES            |
    |SCHEMA_VERSION               |
    |SDS                          |
    |SD_PARAMS                    |
    |SEQUENCE_TABLE               |
    |SERDES                       |
    |SERDE_PARAMS                 |
    |SKEWED_COL_NAMES             |
    |SKEWED_COL_VALUE_LOC_MAP     |
    |SKEWED_STRING_LIST           |
    |SKEWED_STRING_LIST_VALUES    |
    |SKEWED_VALUES                |
    |SORT_COLS                    |
    |STORED_PROCS                 |
    |TABLE_PARAMS                 |
    |TAB_COL_STATS                |
    |TBLS                         |
    |TBL_COL_PRIVS                |
    |TBL_PRIVS                    |
    |TXNS                         |
    |TXN_COMPONENTS               |
    |TXN_LOCK_TBL                 |
    |TXN_TO_WRITE_ID              |
    |TXN_WRITE_NOTIFICATION_LOG   |
    |TYPES                        |
    |TYPE_FIELDS                  |
    |VERSION                      |
    |WM_MAPPING                   |
    |WM_POOL                      |
    |WM_POOL_TO_TRIGGER           |
    |WM_RESOURCEPLAN              |
    |WM_TRIGGER                   |
    |WRITE_SET                    |
    +-----------------------------+

     

    반응형
Designed by Tistory.