이번 글에서는 hadoop 3 & hive 3 버전에서 동작하는 spark 환경 구축을 설명한다.
최근 hadoop 3 cluster를 구축하는 작업에 참여하고 있는데 spark도 기존과 변경되는 부분이 있어 정리했다.
hadoop과 hive의 설치 버전은 다음과 같다. 해당 버전들이 현재 시점(2020-05-25)의 안정화 버전이다.
-
hadoop 3.1.3
-
hive 3.1.2
spark의 배포버전을 빌드할 때, hadoop/ hive 3 버전으로 변경 되더라도 큰 차이가 없다.
spark에서 hive 1.2.1 버전을 default로 해서 빌드되기 때문에 추가 설정 작업이 필요하다.
그래서 spark 빌드 및 배포, hive 관련 옵션 설정을 나누어서 설명을 한다.
1. spark 빌드 및 배포
Building Spark 문서를 살펴보면 구축 환경에 맞는 spark 빌드 방법을 설명하고 있다.
참조한 링크가 lastest 버전인 (2.4.5)가 아니라 3.0.0-preview 버전인데 이유는 앞으로 설명할 내용에 포함되어 있다.
필자는 spark의 버전을 github에서 받은 spark 코드에서 v3.0.0-preview tag를 찾아서 checkout 했다.
필자가 spark을 돌리려는 환경을 다음과 같이 정의했다.
YARN 환경에 submit 하고 기존에 구축된 Hive 3.1.2을 활용해 hive query를 실행할 수 있어야 한다.
실행 가능한 배포본을 빌드할 때 ./dev/make-distribution.sh를 활용하면 된다.
./dev/make-distribution.sh --help을 실행해 보면 적용할 수 있는 옵션들을 볼 수 있다.
필자가 사용한 옵션과 maven profile은 다음과 같다.
-
--name : 배포 파일 이름
-
--tgz : gzip 압축
-
-Pyarn : YARN에서 실행
-
-Phive and -Phive-thriftserver: Spark SQL과 Hive 통합
-Phive 프로파일은 추가로 설명이 필요한데 Hive 버전과 관련이 있다.
문서에 보면 Hive의 기본 지원 버전으로 1.2.1, 2.3.6을 선택할 수 있다.
-Phadoop-3.2를 설정하지 않으면 1.2.1. 설정하면 2.3.6 버전의 패키지가 포함된다.
# With Hive 1.2.1 support
./build/mvn -Pyarn -Phive -Phive-thriftserver -DskipTests clean package
# With Hive 2.3.6 support
./build/mvn -Pyarn -Phive -Phive-thriftserver -Phadoop-3.2 -DskipTests clean package
문제는 필자는 Hive 2.3.6 버전이 아닌 더 상위 Hive 3.1.2를 사용하는데 있다.
Hive 3.1.2를 사용하는 방법은 chaper 2에서 살펴보자.
또 이런 질문을 할 수 있다.
사용할 Hadoop 버전은 3.1.3 인데 -Phadoop-3.2로 설정하는게 맞는가?
필자로 처음에 -Phadoop-3.1로 사용했다. 하지만 이런 프로파일은 존재하지 않았고 잘못된 설정이었다.
그리고 -Phadoop-3.1로 설정해서 Hive 연결할 때 문제도 발생했다.
-Phadoop-3.1는 없는 프로파일이기에 설정하지 않는 것으로 취급되었고, hive 1.2.1 버전이 포함되었다.
최종적으로 사용한 빌드 옵션은 다음과 같다.
./dev/make-distribution.sh --name 3.1.3-test-scala2.12 --tgz \
-Phadoop-3.2 -Dhadoop.version=3.1.3 -Phive -Phive-thriftserver \
-Pyarn -Pscala-2.12 -DskipTests
hadoop 버전과 관련된 패키지는 -Dhadoop.version=3.1.3으로 설정해서 필요로 하는 3.1.3 버전이 정상적으로 포함됐다.
-Phadoop-3.2는 hive 2.3.6을 기본으로 포함하기 위한 옵션이다.
2. hive 옵션 설정
그럼 패키지가 준비되었다고 가정하고 hive 옵션에 대해서 추가로 설명한다.
Hive Tables 문서를 보면 hive 설정과 관련 된 설명이 있다.
추가로 설정이 필요한 옵션은 다음과 같다.
Property Name | Default | Meaning |
spark.sql.hive.metastore.version | 1.2.1 | Hive metastore의 버전. 3.1.2까지 가능하다. |
spark.sql.hive.metastore.jars | builtin | Hive metastore 버전에 맞는 jar 파일 위치 |
spark.sql.hive.metastore.sharedPrefixes |
com.mysql.jdbc, |
jdbc driver 접두사 |
위 옵션에서 주목할 부분은 spark.sql.hive.metastore.version의 설명이다. 설정이 가능한 버전을 설명하는데 3.1.2까지 가능하다고 되어 있다. 그런데 안정화 버전인 2.4.5는 현재 hive 3 지원이 되지 않는다. 2.4.5의 문서를 보면 2.3.3까지 지원한다고 나온다.
이런 이유 때문에 3.0.0-preview 버전을 사용한 것이다.
다음과 같이 spark-defaults.xml에 추가했다.
spark.sql.hive.metastore.jars {hive lib 위치}
spark.sql.hive.metastore.version 3.1.2
spark.sql.hive.metastore.sharedPrefixes com.mysql.jdbc
그리고 접근할 hive metastore 정보를 hive-site.xml에 추가했다.
<property>
<name>hive.metastore.uris</name>
<value>thrift://localhost:9083</value>
</property>
설정이 완료 되었다면 spark-shell로 테스트를 해보자.
Welcome SPARK 3.0.0-preview
그리고 다음과 같이 hive table 쿼리를 실행해서 hive에 포함된 table 정보가 나오는지 확인해 보자.
spark.sql("show tables").show
테이블들이 정상적으로 나오면은 성공이다!
관련 문서
'Big Data > Spark' 카테고리의 다른 글
hadoop 2.6.0 버전을 위한 spark 3.x 빌드 (0) | 2022.09.28 |
---|---|
[Spark] Direct API for Kafka (직접 모델) (2) | 2021.08.12 |
[Spark] 2.4.0 - bucket pruning (0) | 2020.03.10 |
[Spark] Dataset (0) | 2020.01.14 |
[Spark] Accumulators (0) | 2019.05.03 |