Big Data/Spark

hadoop 2.6.0 버전을 위한 spark 3.x 빌드

devidea 2022. 9. 28. 23:48

이번에는 spark 빌드 관련해서 이야기를 하려고 합니다. spark은 대부분 hadoop yarn 기반에서 실행하는 경우가 많습니다. 하지만 hadoop cluster의 버전이 회사의 환경에 따라 다르므로 빌드하는 spark 버전에 따라 호환성을 잘 살펴야 합니다. 필자는 낮은 버전의 hadoop을 사용하고 있는데, 사용 하는 hadoop이 spark의 어느 버전까지 빌드해서 사용 가능한지 검토하게 됐습니다. 이 글은 그런 경험을 토대로 정리하는 목적으로 쓰게 됐습니다.

 

실행 가능한 spark 배포판을 빌드할 때, 사용하는 hadoop 버전을 명시해서 빌드를 합니다. 예를 들어 hadoop 3.3.0 버전을 사용할 때 아래와 같이 옵션을 넣어서 spark 배포판을 빌드합니다.

./build/mvn -Pyarn -Dhadoop.version=3.3.0 -DskipTests clean package

hadoop 버전이 2.x 라면 어떻게 넣을까요? 옵션이 하나 더 추가됩니다.

./build/mvn -Phadoop-2 -Pyarn -Dhadoop.version=2.8.5 -DskipTests clean package

필자는 hadoop 2.6.0 버전을 사용하고 있습니다. 그래서 -Dhadoop.version=2.6.0을 넣어서 배포판 빌드를 수행했습니다. 결과는 예상하셨듯이 실패했습니다. 그러면 왜 실패를 했을까요?

 

spark의 hadoop 버전 호환성을 체크하기 위해 release notes들을 살펴보기 시작했습니다. 눈에 띄는 내용이 spark 3.0.0 release note에 있었습니다.

 

3.0.0 버전부터 hadoop 2.6을 지원하지 않는다고 합니다. spark download 페이지를 보면 package type를 고를 수 있는데 hadoop 2.7 버전 이상만 보입니다. spark 3.0.0 이후로 성능 향상이 많이 이루어졌다는 내용을 들었어서 필자는 고민하게 됐습니다. 이대로 spark 3.0.0 이상의 버전 사용의 포기할지 여부 말이지요(원래는 공식적으로 지원하지 않으니 포기하는 것이 맞습니다). 그래서 조금 더 살펴보기로 했습니다.

 

release note에서 나온 SPARK-25016 티켓을 찾아봤습니다. 해당 티켓에 연결된 pull request 코드를 살폈습니다. 코드 내용을 보니 spark 2.6.0 지원을 제외하기 위해서 빌드 옵션 항목의 수정 사항이 대부분이었습니다. spark 코드 수정에서는 명확히 hadoop 2.6.0을 사용하지 않을 근거가 없었습니다. 그래서 SPARK-25016의 변경 코드를 되돌려서 빌드를 시도하기로 했습니다(참고로 필자는 spark 3.0.3 태그를 체크아웃해서 작업했습니다). 그리고 아래와 같이 옵션을 변경해서 다시 빌드를 수행했습니다.

./dev/make-distribution.sh --name hadoop-2.6.0-package --tgz -Phadoop-2.6 -Dhadoop.version=2.6.0 -Phive -Phive-thriftserver -Pyarn -Pnetlib-lgpl -DskipTests

결과를 성공이었습니다. 그리고 spark를 사용하는 기존 시스템에서 spark 버전을 변경해서 테스트를 했습니다. 그랬더니 두번째 문제가 발생하더군요. spark을 사용하는 기존 시스템은 spark을 public maven repository에서 dependency를 가져와서 사용하고 있었습니다. 그런데 해당 dependency가 필자가 빌드한 spark의 dependency와 맞지 않아서 발생한 문제였습니다. 그래서 기존 시스템에 public maven repository가 아닌 사내 private repository로 새롭게 빌드 후 배포한 버전을 사용할 수 있도록 수정했습니다.

./build/mvn clean deploy -Phadoop-2.6 -Dhadoop.version=2.6.0 -Phive-1.2 -Phive-thriftserver -Pyarn -Pnetlib-lgpl -Dmaven.test.skip -DskipTests -Dcheckstyle.skip

repository 수정 후 다시 수행했더니 정상적으로 동작했습니다.

3.0.3 버전까지 빌드를 성공한 필자는 자신감을 가지고 3.1.0 버전의 빌드를 시도했습니다. 참고로 현재 시점 spark의 가장 최신버전은 3.3.0 입니다. 빌드 시도의 결과를 먼저 말씀드리면 실패했습니다.

 

이유는 3.1.0 버전에서는 hive 1.2도 지원이 종료되었기 때문입니다(필자는 hive 1.2도 사용). 

지원하지 않더라도 앞선 작업처럼 빌드 스크립트를 수정하면 되지 않냐고 물어보실 수 있습니다. 빌드를 시도해보니 hive 1.2가 제외된 것을  포함해서 hive 2.7에서 추가된 함수들을 spark이 사용하고 있다는데 원인이 있었습니다. 앞선 경우와 달리 코드의 변경이 있었던 것이지요. 그 시점에 이르자 더 이상의 시도는 무의미하다고 생각했습니다.

 

결론

사실 필자의 시도가 좋은 방법이라고 생각하지 않습니다. spark의 버전이 올라가면서 호환성의 범위가 줄어드는 것은 자연스러운 일이고, 오히려 너무 오래된 버전의 hadoop을 사용하는 것이 문제라고 생각합니다. 하지만 이 글의 과정을 거치면서 spark의 빌드가 어떤 식으로 이루어지는지 내부 동작을 살펴볼 수 있어서 좋았습니다.

 

 

참고 문서

반응형