Data Engineering

Hive Metastore & SparkSQL & Local FileSystem

HOONY_612 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);
...
반응형