-
Hive Metastore & SparkSQL & Local FileSystemData 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&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); ...
반응형'Data Engineering' 카테고리의 다른 글
Spark + Iceberg - 3(Hidden Partitioning) (0) 2024.01.17 Spark + Iceberg - 2(Partition, Schema evolution) (0) 2024.01.16 Spark + Iceberg - 1(소개 및 연동) (0) 2024.01.16 SparkSQL CLI 대신 Spark Thrift Server (0) 2024.01.15 Spark + S3 연동하기 (0) 2024.01.15