Spark SQL에서 Hive 메타스토어 연결 설정 방법

Hive 메타스토어를 사용하는 Spark SQL 환경 구성

Spark SQL을 통해 Hive 테이블에 접근하려면 Spark가 Hive의 메타데이터 저장소(Metastore)에 연결할 수 있도록 설정해야 한다. 이를 위해 MySQL 기반의 Hive Metastore와 Spark 간의 연동을 구성하는 절차를 설명한다.

1. MySQL에 Hive 메타스토어 데이터베이스 생성

Hive가 테이블 스키마 및 파티션 정보를 저장할 수 있도록 MySQL에 전용 데이터베이스를 생성한다.

CREATE DATABASE hive_metastore CHARACTER SET utf8;
GRANT ALL PRIVILEGES ON hive_metastore.* TO 'root'@'%' IDENTIFIED BY '111111';
FLUSH PRIVILEGES;

생성된 데이터베이스는 hive-site.xml에서 JDBC URL로 참조된다.

2. Hive 설정 파일 수정

Spark는 내장된 HiveContext를 사용할 때 외부의 Hive 설정을 인식하지 않으므로, hive-site.xml을 Spark의 conf 디렉터리에 복사해야 한다.

cp /usr/local/src/apache-hive-1.2.2-bin/conf/hive-site.xml /usr/local/src/spark-2.0.2-bin-hadoop2.6/conf/

클러스터 환경에서는 모든 워커 노드에도 동일하게 배포해야 한다.

scp /usr/local/src/apache-hive-1.2.2-bin/conf/hive-site.xml root@slave1:/usr/local/src/spark-2.0.2-bin-hadoop2.6/conf/
scp /usr/local/src/apache-hive-1.2.2-bin/conf/hive-site.xml root@slave2:/usr/local/src/spark-2.0.2-bin-hadoop2.6/conf/

3. MySQL JDBC 드라이버 등록

Spark가 MySQL에 접속하기 위해 JDBC 드라이버 JAR 파일을 Spark의 jars 디렉터리에 추가한다.

cp /usr/local/src/apache-hive-1.2.2-bin/lib/mysql-connector-java-5.1.47-bin.jar /usr/local/src/spark-2.0.2-bin-hadoop2.6/jars/

워커 노드들에도 동일하게 복사하여 클래스패스 문제를 방지한다.

4. 의존성 라이브러리 충돌 해결

Hadoop과 Hive 간의 jline 버전 불일치로 인한 오류를 방지하기 위해, Hive에 포함된 jline-2.12.jar를 Hadoop의 라이브러리 디렉터리로 복사한다.

cp apache-hive-1.2.2-bin/lib/jline-2.12.jar hadoop-2.6.1/share/hadoop/yarn/lib/

5. Spark 버전별 JAR 경로 조정

Spark 2.0 이후 버전부터는 lib 대신 jars 디렉터리를 사용하므로, Hive 실행 스크립트 내 Spark 관련 경로를 수정해야 한다.

기존:

if [[ -n "$SPARK_HOME" ]]; then
  sparkAssemblyPath=`ls ${SPARK_HOME}/lib/spark-assembly-*.jar`
  CLASSPATH="${CLASSPATH}:${sparkAssemblyPath}"
fi

수정 후:

if [[ -n "$SPARK_HOME" ]]; then
  sparkJarPaths=`find ${SPARK_HOME}/jars -name "*.jar" | tr '\n' ':'`
  CLASSPATH="${CLASSPATH}:${sparkJarPaths}"
fi

6. Spark Shell에서 Hive 테이블 접근 테스트

설정 완료 후 Spark Shell을 실행하고 Hive 테이블 조회를 시도한다.

./spark-shell

Scala 컨텍스트에서 다음과 같이 쿼리를 실행한다.

val spark = SparkSession.builder()
  .appName("HiveIntegration")
  .enableHiveSupport()
  .getOrCreate()

import spark.implicits._
val result = spark.sql("SELECT * FROM badou.orders")
result.show()

7. 흔히 발생하는 오류 및 해결책

  • Database default already exists: 기존에 생성된 기본 데이터베이스 중복 오류로, 일반적으로 무시해도 무방하다. 재시작 시 초기화되지 않도록 보장하면 된다.
  • Address already in use: Thrift 서버나 UI 포트 충돌로 인한 문제다. hive-site.xml에서 hive.server2.thrift.port 또는 Spark UI 포트(spark.ui.port)를 변경하여 해결할 수 있다.

태그: Spark SQL Hive Metastore MySQL JDBC SparkSession

5월 31일 23:10에 게시됨