#Backend

Hive는 잊으려 했지만, Spark는 기억하고 있었다: 사라진 get_table RPC 복원기

Hive는 잊으려 했지만, Spark는 기억하고 있었다: 사라진 get_table RPC 복원기
01

Summary

사라진 'get_table'을 찾아서: Hive 4.2 업그레이드 중 마주친 Spark 오류 해결기

Thrift RPC 하위 호환성을 지키며 대규모 데이터 플랫폼의 중단을 막아낸 이야기

이 아티클은 네이버 Hadoop 데이터 플랫폼의 핵심 인프라인 Hive Metastore를 4.2 버전으로 마이그레이션하면서 발생한 대규모 장애 가능성을 차단한 과정을 다룹니다. 원인은 최신 Hive에서 제거된 레거시 RPC 'get_table'을 구버전 클라이언트를 내장한 Spark가 계속 호출하고 있었기 때문이었습니다. 저자는 서비스 중단과 클라이언트 일괄 수정이라는 부담 대신, 서버 측에 하위 호환용 RPC를 설계 복원하고 기존 내부 로직에 안전하게 위임하는 '견고성 원칙' 기반의 해결 전략을 제시합니다.

  • 01Hive 4.2 업그레이드 이후 Spark 잡에서 발생한 'TApplicationException: Invalid method name' 오류 원인 추적
  • 02Thrift IDL 기반 RPC의 메서드 문자열 매칭 및 디스패치 메커니즘 상세 분석
  • 03인자 나열 방식의 get_table에서 요청 객체 캡슐화 방식의 get_table_req로 API가 진화한 배경 및 하위 호환 필드 규칙 설명
  • 04Spark가 격리된 클래스로더를 통해 구버전의 Hive Metastore 클라이언트를 사용하는 구조 파악
  • 05서버 측 HMSHandler에 레거시 RPC를 복원하고 신형 요청 객체로 변환하여 내부 로직에 위임하는 호환 조치 적용

RECOMMENDATION

대규모 분산 환경에서 다기종 클라이언트 간의 호환성을 유지하면서 핵심 인프라를 안정적으로 마이그레이션해야 하는 데이터 엔지니어 및 백엔드 시스템 아키텍트에게 강력히 추천합니다.

The Problem

네이버의 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'로 완전히 전환했기 때문입니다.

The Solution

사내 Hive 포크 버전의 'hive_metastore.thrift' IDL 파일에 기존 'get_table' 인터페이스 정의(필드 번호, 타입, 반환값 일치)를 다시 추가하여 복원하고 스텁 코드를 재생성했습니다. 이후 HMSHandler 서버 구현체에 해당 레거시 메서드를 오버라이드하여 수신된 요청을 신형 'GetTableRequest' 구조체로 변환하고 기존의 검증된 내부 조회 로직에 위임하도록 개발했습니다.

The Result

기존의 오래된 Hive Metastore 클라이언트를 내장하여 사용하는 Spark 3.x 환경에서도 클라이언트 측의 변경이나 대규모 재검증 없이 Hive 4.2 기반 Metastore 서버와 정상적으로 통신하여 테이블 조회 잡을 안정적으로 수행할 수 있게 되었습니다.

Trade-off

업스트림 Apache Hive 코드베이스와 다른 사내 포크만의 커스텀 패치를 유지 관리해야 하므로 향후 추가적인 업그레이드 시 패치 충돌 위험 및 유지보수 비용이 발생합니다. 또한 IDL 선언 복원으로 인해 Java, C++, Python 등 다국어용 자동 생성 코드가 약 1,800줄 가량 새로 늘어났습니다.

03

Key Concepts

Concept · 01

Thrift IDL (Interface Definition Language)

서로 다른 프로그래밍 언어로 작성된 클라이언트와 서버가 RPC를 통해 상호작용할 수 있도록 중립적인 인터페이스 규격을 기술하는 스키마 파일 형식입니다.

  • hive_metastore.thrift 파일 내에 테이블 정보 조회를 위한 원격 API 및 데이터 형식을 정의하는 데 사용되었습니다.
Concept · 02

Method-name based Dispatch

Thrift RPC 프레임워크에서 수신한 네트워크 패킷의 메서드 이름 문자열을 기반으로 프로세서 맵에서 일치하는 핸들러 함수를 찾아 매칭하는 동적 제어 흐름 방식입니다.

  • 클라이언트가 전송한 'get_table' 요청명이 서버의 프로세서 맵에 존재하지 않아 TApplicationException: UNKNOWN_METHOD 오류가 발생한 주요 원인이 되었습니다.
Concept · 03

Isolated Class Loader (격리된 클래스로더)

동일 애플리케이션 안에서 버전이 충돌할 수 있는 특정 외부 라이브러리 의존성을 분리하기 위해, 자바 클래스들을 독립적인 네임스페이스 영역에서 격리하여 로드하는 JVM 수준의 메커니즘입니다.

  • Spark 본체와 버전 충돌을 피하면서 다양한 버전의 Hive Metastore 서버와 통신할 수 있도록 내장 클라이언트 jar들을 독립적으로 로드하는 장치로 작동합니다.