Hive Metastore & SparkSQL & Local FileSystem
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&autoReconnection=true&useUnicode=true&characterEncoding=UTF-8&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);
...