Hadoop 2.6.0과 CDH 라이브러리의 호환성 문제
HDFS Browser에서 파일 내용을 조회하는 기능에 오류가 발생했습니다. 확인해 보니 사용하는 메서드의 파라미터가 예상한 형태와 달랐습니다. 둘 다 Hadoop 2.6.0을 기반으로 했지만, Apache 배포본과 CDH에 포함된 라이브러리가 같지 않았습니다.
당시에는 배포판에 따라 코드와 의존성을 나누는 방식으로 대응했습니다.
같은 기본 버전과 다른 배포판
당시 CDH에서 사용하는 Hadoop 버전에는 2.6.0-cdh5.13.0처럼 Cloudera 배포판을 나타내는 접미사가 붙었습니다. 이 버전은 Cloudera 저장소에서 별도로 관리됐습니다.
기본 버전이 2.6.0이라는 이유로 Apache Hadoop 2.6.0과 같은 API를 제공한다고 가정하면 안 됐습니다. 이번 문제도 파일 내용을 읽는 코드가 호출하는 메서드의 차이에서 시작했습니다.
프로필로 코드와 의존성 분리
CDH에 맞는 처리를 프로필로 나누고, 빌드할 때 사용하는 provided 라이브러리도 함께 바뀌도록 수정했습니다. 코드만 분리하고 컴파일에 사용하는 라이브러리를 그대로 두면, 실행할 배포판과 다시 어긋날 수 있습니다.
Maven 프로필 은 대상 환경에 따라 속성과 빌드 구성을 바꿀 때 사용할 수 있습니다. 아래는 버전 선택을 설명하기 위한 예시입니다. 당시 전체 POM을 옮긴 것은 아닙니다.
<profiles>
<profile>
<id>apache</id>
<properties>
<hadoop.version>2.6.0</hadoop.version>
</properties>
</profile>
<profile>
<id>cdh</id>
<properties>
<hadoop.version>2.6.0-cdh5.13.0</hadoop.version>
</properties>
</profile>
</profiles>실제로는 선택한 버전에 맞는 저장소와 의존성 설정도 필요합니다. 버전 속성만 선언했다고 해당 라이브러리가 자동으로 포함되는 것은 아닙니다.
Provided 범위와 실행 환경
provided는 컴파일에는 필요하지만 실행 시에는 환경에서 제공한다고 가정하는 의존성 범위입니다. Maven 의존성 문서 에 각 범위의 의미가 정리돼 있습니다.
이 설정 자체가 서버의 라이브러리를 찾아 주거나 호환성을 보장하지는 않습니다. 배포 후 어떤 JAR가 실제 classpath에 들어가는지도 맞춰야 합니다. 빌드한 버전과 실행 시 로드한 버전이 다른지 확인할 때 구분해서 봐야 할 부분입니다.
이번 오류 이후에는 Hadoop의 기본 버전뿐 아니라 배포판 접미사와 실제 의존성을 함께 확인하게 됐습니다. 이 글의 버전은 2018년 당시 문제를 설명하기 위한 기록입니다.