ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Hive Metastore & SparkSQL & Local FileSystem
    Data Engineering 2024. 1. 14. 20:07
    반응형

     

    SparkSQL로 RDB에 Metadata 및 실제 데이터를 저장하고 그것을 Hive Metastore(HMS)로 읽어들여보자.

     

    버전

     

    * Spark: 3.5.0

    * Hadoop: 3.3.1

    * Hive Metastore: 3.1.3

     

    Hive Metastore 설치

     

    1. hadoop, hive metastore, mysql connector 다운로드

    //HADOOP Download
    curl -O https://downloads.apache.org/hadoop/common/hadoop-3.3.1/hadoop-3.3.1.tar.gz
    
    //HMS Download
    curl -O https://repo1.maven.org/maven2/org/apache/hive/hive-standalone-metastore/3.1.2/hive-standalone-metastore-3.1.2-bin.tar.gz

     

    mysql-connector: https://dev.mysql.com/downloads/connector/j/

     

     

    2.  압축 해제 및 환경 변수 설정

    //HMS 압축해제
    tar -xvf hive-standalone-metastore-3.1.2-bin.tar.gz
     
    //HADOOP 압축해제
    tar -xvf hadoop-3.3.1.tar.gz -C /opt/hadoop-3.3.1
    
    //HADOOP_HOME 설정(.zsh 편집)
    export HADOOP_HOME=/opt/hadoop-3.3.1
    source .zshrc
    
    //다운 받았던 mysql-connector 옮기기
    mv mysql-connector-java-8.0.27.jar hive-standalone-metastore-3.1.2-bin/lib

     

     

    3. ${HIVE_METASTORE_HOME}/conf/metastore-site.xml 편집

    <configuration>
      <property>
        <name>metastore.thrift.uris</name>
        <value>thrift://localhost:9083</value>
        <description>Thrift URI for the remote metastore. Used by metastore client to connect to remote metastore.</description>
      </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.ConnectionURL</name>
        <value>jdbc:mysql://localhost: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>root</value>
      </property>
      <property>
        <name>javax.jdo.option.ConnectionPassword</name>
        <value>root</value>
      </property>
    </configuration>

     

     

    4. Schema Initialization

    hive-standalone-metastore-3.1.2-bin/bin/schematool -dbType mysql -initSchema

     

     

    5. Start HMS Server

    ${HIVE_METASTORE_HOME}/bin/start-metastore

     

     

    Spark SQL Configuration 설정 및 실행

     

    1. spark 3.5.0 Download

    https://spark.apache.org/downloads.html

     

    Downloads | Apache Spark

    Download Apache Spark™ Choose a Spark release: Choose a package type: Download Spark: Verify this release using the and project release KEYS by following these procedures. Note that Spark 3 is pre-built with Scala 2.12 in general and Spark 3.2+ provides

    spark.apache.org

     

    2. ${SPARK_HOME}/conf 에 hive-site.xml(HMS 설정), spark-defaults.conf(Remote HMS 설정) 설정

     

    hive-site.xml 같은 경우는 기본적으로 Derby(인메모리 DB)로 실행되는 Spark를 원격 RDB를 이용하여 Metadata를 관리할 수 있도록 해준다. Remote Metastore를 사용하기 위해서는 Spark Document 참고 옵션들을 설정해줘야한다.

     

    참고: https://spark.apache.org/docs/latest/sql-data-sources-hive-tables.html

     

    <hive-site.xml>

    <configuration>
        <property>
            <name>hive.metastore.local</name>
            <value>false</value>
        </property>
        <property>
            <name>hive.metastore.warehouse.dir</name>
            <value>/hive/warehouse</value>
        </property>
        <property>
            <name>javax.jdo.option.ConnectionURL</name>
            <value>jdbc:mysql://localhost:3306/metastore?createDatabaseIfNotExist=true&amp;autoReconnection=true&amp;useUnicode=true&amp;characterEncoding=UTF-8&amp;useSSL=false</value>
        </property>
        <property>
            <name>javax.jdo.option.ConnectionDriverName</name>
            <value>com.mysql.jdbc.Driver</value>
        </property>
        <property>
            <name>javax.jdo.option.ConnectionUserName</name>
            <value>root</value>
        </property>
        <property>
            <name>javax.jdo.option.ConnectionPassword</name>
            <value>root</value>
        </property>
    </configuration>

     

    <spark-defaults.conf>

    spark.sql.hive.metastore.jars path
    spark.sql.hive.metastore.jars.path file:///Users/ghkdwlgns612/Downloads/spark-hms-jar/*.jar
    spark.sql.hive.metastore.version 3.1.3
    spark.sql.hive.metastore.sharedPrefixes com.mysql.jdbc
    spark.driver.bindAddress 127.0.0.1

     

    난 위 Jar를 해결할 때 실행해가며 NotFoundClass를 하나하나 해결해가면서 jar를 추가하였다.

     

    3. Spark SQL 실행

    ${SPARK_HOME}/bin/spark-sql

     

    4. Create Table 실행

    create table tmp(a String) location 'file:///Users/ghkdwlgns612/Downloads/spark-warehouse';

     

    5. Insert Data 및 확인

    insert into tmp (a) values ("hello");
    
    select * from tmp;

     

    6. Data Directory 확인

    ls ~/Downloads/spark-warehouse
    //part-00000-cb51e195-b327-4081-a7ab-c210c59eba7c-c000

     

    7. HMS RDB 확인

    RDB에 접속하여 Hive metastore Metadata를 조회해보자.

    select * from TBLS;
    //6,1705229183,1,0,ghkdwlgns612,USER,0,6,tmp,EXTERNAL_TABLE,,,false

     

    이렇게 Local SparkSQL을 이용하여 RDB(HMS)에 저장 및 데이터를 로컬 파일 시스템에 저장하는 것을 확인하였다.

     

    Hive Metastore 저장 정보 읽어오기

     

    두 가지 방법이 있다. SQL을 만들어서 읽거나 HiveMetastoreClient를 이용하여 Table정보를 가져오는 것이다.

     

    1. SQL 만들어 정보를 가져와 Mapping 하기

    아래 SQL의 결과로 반환되는 정보 중 필요한 정보를 매핑하여 가져온다.

    USE ${DATABASE_NAME};
    DESCRIBE FORMATTED `${TABLE_NAME}`

     

    2. MetastoreClient 이용하기

    Metastore는 SQL 없이 Table 정보를 가져와 활용할 수 있다. 단 Iceberg 같은 자체 Table을 관리하는 것에는 적합하지 않다.

    Table resultTable = new Table();
    IMetaStoreClient client = null;
        try {
        	client = RetryingMetaStoreClient.getProxy(conf, false);
        	org.apache.hadoop.hive.metastore.api.Table findTable = client.getTable(database, name);
    ...
    반응형

    댓글

Designed by Tistory.