Skip to Content
Data EngineeringZeppelin HBase Interpreter 호환성 에러 (NPE) 해결 및 수동 라이브러리 교체
📊 Data Engineering2017년 10월 26일

Zeppelin HBase Interpreter 호환성 에러 (NPE) 해결 및 수동 라이브러리 교체

#zeppelin#hbase#interpreter#data-engineering#flamingo

과거 사내 빅데이터 모니터링 플랫폼에는 수집된 대규모 데이터를 데이터 사이언티스트나 분석가들이 즉각적으로 쿼리하고 시각화해 볼 수 있도록 Apache Zeppelin 기반의 대시보드가 내장되어 제공되었습니다.

당시 HDFS에 적재된 파일 기반의 로그 외에도, 실시간 시계열 메트릭 트렌드를 저장하는 메인 레이어는 NoSQL인 HBase였습니다. 사용자들이 Zeppelin 웹 UI에서 %hbase 인터프리터를 선언하고 JRuby 쉘 명령어 문법으로 데이터가 잘 들어오는지 디버깅하곤 했는데, 특정 고객사의 클러스터(주로 Hortonworks HDP 혹은 Cloudera CDH)에 배포할 때마다 번번이 NullPointerException(NPE)이나 ClassNotFoundException 에러를 뿜으며 인터프리터 데몬이 죽어버리는 현상이 발생했습니다.


1. 이슈 원인: Interpreter 내장 라이브러리의 파편화

Apache Zeppelin은 다운로드 받을 때 내부에 수십 개의 인터프리터 플러그인과 그 구동을 위한 뚱뚱한(Fat) 의존성 Jar 팩(Pack)들을 기본으로 품고 있습니다.

Zeppelin 공식 빌드 버전에 포함된 hbase-client 버전(예: 1.1.x 바닐라)과, 고객사에 실제 깔려 구동 중인 Zookeeper 및 HBase RegionServer의 프로토콜 버전에 아주 미세한 패치 차이만 발생해도 직렬화/역직렬화(RPC 통신) 과정에서 호환성 에러가 발생하게 됩니다.

가장 이상적인 방법은 Zeppelin 소스 코드를 다운받아 고객사 환경 버전에 맞춰 pom.xml 속성을 수정한 뒤 2시간 동안 재빌드하는 것이지만, 설치 현장(폐쇄망)에서는 불가능한 작업이었습니다.


2. 해결 방법: 로컬 라이브러리 수동 덮어쓰기 (Cherry-Pick)

현장에서 가장 빠르고 확실한 대처법은 깡통 버전에 맞춰져 있는 Zeppelin 인터프리터 경로 내의 하둡/HBase 클라이언트 라이브러리들을, 현재 구동 중인 클러스터 OS 위치에서 뽑아와(Symlink or Copy) 수동으로 강제 교체해 버리는 것입니다.

만약 환경이 Hortonworks(HDP) 구동 노드라면, 아래 스크립트와 같이 현재 버전에 맞는 hbase-client 라이브러리를 복사해 넣어 버전을 완벽하게 동기화할 수 있습니다.

shell
$ mkdir -p ~/zeppelin-hbase-bak $ mv $ZEPPELIN_HOME/interpreter/hbase/hbase-client-*.jar ~/zeppelin-hbase-bak/ # 2. HDP 배포판 네이티브 디렉터리에서 실제 사용 중인 jar 복사 $ cp /usr/hdp/current/hbase-client/lib/hbase-client-*.jar $ZEPPELIN_HOME/interpreter/hbase/ # (필요 시) 하둡 코어 라이브러리도 충돌할 경우 동일하게 교체 # $ cp /usr/hdp/current/hadoop-client/hadoop-common-*.jar $ZEPPELIN_HOME/interpreter/hbase/

3. 마무리 후 재기동

작업이 완료되면 Zeppelin 서버 데몬을 재시작(bin/zeppelin-daemon.sh restart)하거나, 웹 UI의 Interpreter 설정 메뉴로 들어가 hbase 항목을 Save & Restart 해주어야 새 클래스패스로 로더가 올라가며 정상 접속이 가능해집니다.

오픈소스를 결합하여 하나의 거대한 솔루션 플랫폼을 꾸릴 때는 각 컴포넌트가 사용하는 제각각의 Native Client 의존성을 현장 런타임에 동적으로 맞춰주는(Align) 스킬이 현장 엔지니어에겐 무엇보다 강력한 무기였습니다.

Last updated on