
Thrift RPC 하위 호환성을 지키며 대규모 데이터 플랫폼의 중단을 막아낸 이야기
이 아티클은 네이버 Hadoop 데이터 플랫폼의 핵심 인프라인 Hive Metastore를 4.2 버전으로 마이그레이션하면서 발생한 대규모 장애 가능성을 차단한 과정을 다룹니다. 원인은 최신 Hive에서 제거된 레거시 RPC 'get_table'을 구버전 클라이언트를 내장한 Spark가 계속 호출하고 있었기 때문이었습니다. 저자는 서비스 중단과 클라이언트 일괄 수정이라는 부담 대신, 서버 측에 하위 호환용 RPC를 설계 복원하고 기존 내부 로직에 안전하게 위임하는 '견고성 원칙' 기반의 해결 전략을 제시합니다.
대규모 분산 환경에서 다기종 클라이언트 간의 호환성을 유지하면서 핵심 인프라를 안정적으로 마이그레이션해야 하는 데이터 엔지니어 및 백엔드 시스템 아키텍트에게 강력히 추천합니다.
네이버의 Hadoop 플랫폼 C3의 Hive Metastore를 4.2 버전으로 업그레이드한 후, 구버전 HMS 클라이언트를 사용하는 Spark 잡에서 'get_table' RPC를 찾지 못해 Invalid method name 예외가 발생하며 실패하는 문제가 나타났습니다. 이는 Apache Hive 업스트림 프로젝트에서 4.0.1 버전부터 레거시 API인 'get_table'을 공식 제거하고 요청 객체 기반의 'get_table_req'로 완전히 전환했기 때문입니다.
사내 Hive 포크 버전의 'hive_metastore.thrift' IDL 파일에 기존 'get_table' 인터페이스 정의(필드 번호, 타입, 반환값 일치)를 다시 추가하여 복원하고 스텁 코드를 재생성했습니다. 이후 HMSHandler 서버 구현체에 해당 레거시 메서드를 오버라이드하여 수신된 요청을 신형 'GetTableRequest' 구조체로 변환하고 기존의 검증된 내부 조회 로직에 위임하도록 개발했습니다.
기존의 오래된 Hive Metastore 클라이언트를 내장하여 사용하는 Spark 3.x 환경에서도 클라이언트 측의 변경이나 대규모 재검증 없이 Hive 4.2 기반 Metastore 서버와 정상적으로 통신하여 테이블 조회 잡을 안정적으로 수행할 수 있게 되었습니다.
Trade-off
업스트림 Apache Hive 코드베이스와 다른 사내 포크만의 커스텀 패치를 유지 관리해야 하므로 향후 추가적인 업그레이드 시 패치 충돌 위험 및 유지보수 비용이 발생합니다. 또한 IDL 선언 복원으로 인해 Java, C++, Python 등 다국어용 자동 생성 코드가 약 1,800줄 가량 새로 늘어났습니다.
서로 다른 프로그래밍 언어로 작성된 클라이언트와 서버가 RPC를 통해 상호작용할 수 있도록 중립적인 인터페이스 규격을 기술하는 스키마 파일 형식입니다.
Thrift RPC 프레임워크에서 수신한 네트워크 패킷의 메서드 이름 문자열을 기반으로 프로세서 맵에서 일치하는 핸들러 함수를 찾아 매칭하는 동적 제어 흐름 방식입니다.
동일 애플리케이션 안에서 버전이 충돌할 수 있는 특정 외부 라이브러리 의존성을 분리하기 위해, 자바 클래스들을 독립적인 네임스페이스 영역에서 격리하여 로드하는 JVM 수준의 메커니즘입니다.




