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)를 변경하여 해결할 수 있다.