HiveServer2 의 Thrift 프로토콜을 그대로 구현한 Spark 쪽 서비스다. JDBC/ODBC 클라이언트가 HiveQL 문법으로 접속하면 Spark SQL 엔진이 처리한다. BI 도구나 기존 Hive 클라이언트를 그대로 두고 실행 엔진만 Spark 로 바꾸고 싶을 때 쓴다.
Spark 4.0.0 은 JDK 8 과 11 지원을 끊고 JDK 17 을 기본으로 삼았으며, Scala 2.12 를 제외하고 Scala 2.13 을 기본으로 한다. 기존 Spark 2.x/3.x 환경에서 쓰던 JDK 8 과 Scala 2.12 기반 JAR 을 그대로 가져오면 동작하지 않는다.
wget https://archive.apache.org/dist/spark/spark-4.0.0/spark-4.0.0-bin-hadoop3.tgz
tar -xzf spark-4.0.0-bin-hadoop3.tgz
export SPARK_HOME=/opt/spark-4.0.0-bin-hadoop3
export PATH=$SPARK_HOME/bin:$SPARK_HOME/sbin:$PATH
bin-hadoop3 배포본에도 실제 클러스터의 Hadoop 설정과 일부 라이브러리는 별도로 연결해야 한다. NoClassDefFoundError: org/apache/hadoop/fs/FSDataInputStream 처럼 Hadoop 공통 클래스를 찾지 못하는 오류는 classpath 문제다. 이 클래스는 hadoop-common-<version>.jar 에 있다.
export HADOOP_HOME=/opt/hadoop
export HADOOP_CONF_DIR=/etc/hadoop/conf
export SPARK_DIST_CLASSPATH=$($HADOOP_HOME/bin/hadoop classpath)
SPARK_DIST_CLASSPATH 는 Hadoop 을 번들하지 않는 배포본에서 표준적인 방법이다. JAR 을 손으로 복사해 넣기보다 이 방식을 쓴다.
$SPARK_HOME/sbin/start-thriftserver.sh \
--master yarn \
--deploy-mode client \
--driver-memory 4g \
--executor-memory 4g \
--num-executors 4 \
--conf spark.sql.hive.metastore.version=3.1.3 \
--conf spark.hadoop.hive.metastore.uris=thrift://metastore01:9083
$SPARK_HOME/sbin/stop-thriftserver.sh
beeline -u "jdbc:hive2://sts-host:10000"
기본 포트는 10000 이며 HiveServer2 와 충돌하기 쉽다.
spark.hadoop.hive.server2.thrift.port=12345
$SPARK_HOME/sbin/start-thriftserver.sh \
--master yarn \
--conf spark.hadoop.hive.server2.thrift.port=12345
ss -lntp | grep 12345
beeline -u "jdbc:hive2://sts-host:12345"
Thrift Server 는 Spark 드라이버 프로세스다. 동시 세션이 많거나 메타데이터가 큰 환경에서 java.lang.OutOfMemoryError: Java heap space 가 나면 드라이버 메모리를 올린다.
$SPARK_HOME/sbin/start-thriftserver.sh --driver-memory 8g
spark.driver.memory 로 지정해도 되지만, client 모드에서는 JVM 이 이미 뜬 뒤라 적용되지 않는 경우가 있으므로 --driver-memory 를 쓴다. 결과를 클라이언트로 모으는 쿼리가 많으면 spark.driver.maxResultSize 도 함께 본다.
Thrift Server 는 단일 Spark 애플리케이션이다. 모든 세션이 하나의 드라이버와 익스큐터 풀을 공유하므로, 무거운 쿼리 하나가 전체 응답을 끌어내린다. 다중 사용자 환경에서는 큐를 나누거나 인스턴스를 분리한다.
Cloudera Data Platform 처럼 벤더가 관리하는 환경에서는 CLI 로 직접 띄우지 않고 관리 도구에서 서비스로 추가한다.