HiveServer2 개요(Overview)
HiveServer2 개요(Overview)
HiveServer2(HS2)는 클라이언트가 Hive에 대해 쿼리를 실행할 수 있게 하는 서비스예요. HiveServer2는 더 이상 사용되지 않는(deprecated) HiveServer1의 후속 버전으로, 다중 클라이언트 동시성과 인증을 지원하며 JDBC/ODBC 같은 오픈 API 클라이언트를 더 잘 지원하도록 설계됐어요.
출처: 문서
본문
소개(Introduction)
HS2는 복합(composite) 서비스로 동작하는 단일 프로세스예요. Thrift 기반 Hive 서비스(TCP 또는 HTTP)와 Web UI용 Jetty 웹 서버를 포함합니다.
HS2 아키텍처
Thrift 기반 Hive 서비스는 HS2의 핵심으로, (예: Beeline의) Hive 쿼리를 처리하는 역할을 해요. Thrift는 크로스 플랫폼 서비스를 만들기 위한 RPC 프레임워크입니다. 그 스택은 Server, Transport, Protocol, Processor의 4개 레이어로 구성됩니다. 레이어에 대한 자세한 내용은 https://thrift.apache.org/docs/concepts 에서 볼 수 있어요.
Server
HS2는 TCP 모드에서 Thrift의 TThreadPoolServer를, HTTP 모드에서는 Jetty 서버를 사용해요.
TThreadPoolServer는 TCP 연결당 작업자 스레드 하나를 할당해요. 연결이 유휴(idle) 상태여도 각 스레드는 항상 연결과 묶여 있습니다. 그래서 많은 동시 연결이 생기면 스레드 수가 많아져 잠재적 성능 이슈가 발생할 수 있어요. 향후 HS2는 TCP 모드에서 TThreadedSelectorServer 같은 다른 서버 타입으로 전환할 수도 있습니다.
Transport
클라이언트와 서버 사이에 프록시가 필요할 때(예: 로드 밸런싱이나 보안상 이유) HTTP 모드가 필요해요. 그래서 TCP 모드뿐 아니라 HTTP 모드도 지원됩니다. Thrift 서비스의 transport 모드는 Hive 구성 속성 hive.server2.transport.mode로 지정할 수 있어요.
Protocol
Protocol 구현은 직렬화/역직렬화를 담당해요. HS2는 현재 직렬화에 TBinaryProtocol을 Thrift 프로토콜로 사용합니다. 향후 더 많은 성능 평가에 따라 TCompactProtocol 같은 다른 프로토콜이 고려될 수 있어요.
Processor
Processor 구현은 요청을 처리하는 애플리케이션 로직이에요. 예를 들어 ThriftCLIService.ExecuteStatement() 메서드는 Hive 쿼리를 컴파일하고 실행하는 로직을 구현합니다.
HS2의 의존성(Dependencies)
- Metastore - metastore는 (HS2와 같은 프로세스의) 임베디드 또는 (Thrift 기반 서비스인) 원격 서버로 구성할 수 있어요. HS2는 쿼리 컴파일에 필요한 메타데이터를 metastore와 주고받습니다.
- Hadoop 클러스터 - HS2는 다양한 실행 엔진(MapReduce/Tez/Spark)을 위한 물리 실행 계획을 준비하고, 실행을 위해 잡(job)을 Hadoop 클러스터에 제출해요.
JDBC 클라이언트
클라이언트 쪽에서 HS2와 상호작용하려면 JDBC 드라이버를 권장해요. Thrift 클라이언트를 직접 쓰고 JDBC를 우회하는 사용 사례(Hadoop Hue 같은)도 있습니다.
첫 쿼리를 만들기 위한 API 호출 순서는 다음과 같아요:
- JDBC 클라이언트(예: Beeline)가 transport 연결(예: TCP 연결)을 시작한 뒤
OpenSessionAPI 호출로SessionHandle을 얻어HiveConnection을 만들어요. 세션은 서버 쪽에서 생성됩니다. - (JDBC 표준에 따라)
HiveStatement가 실행되고, Thrift 클라이언트에서ExecuteStatementAPI 호출이 이뤄져요. API 호출에서 SessionHandle 정보가 쿼리 정보와 함께 서버로 전달됩니다. - HS2 서버는 요청을 받아 쿼리 파싱과 컴파일을 위해 드라이버(CommandProcessor)에 요청해요. 드라이버는 Hadoop과 통신할 백그라운드 잡을 시작하고 즉시 클라이언트에 응답을 반환해요. 이는 ExecuteStatement API의 비동기 설계입니다. 응답에는 서버 쪽에서 생성된
OperationHandle이 포함돼요. - 클라이언트는
OperationHandle을 사용해 HS2와 통신하며 쿼리 실행 상태를 폴링합니다.
소스 코드 설명(Source Code Description)
다음 섹션은 HiveServer2의 기본 컴포넌트를 소스 코드에서 찾는 데 도움을 줘요.
서버 쪽(Server Side)
- TCLIService용 Thrift IDL 파일: https://github.com/apache/hive/blob/master/service-rpc/if/TCLIService.thrift
- TCLIService.Iface 구현:
org.apache.hive.service.cli.thrift.ThriftCLIService클래스 - ThriftCLIService 하위 클래스: TCP 모드용
ThriftBinaryCLIService와 HTTP 모드용ThriftHttpCLIService - org.apache.hive.service.cli.thrift.EmbeddedThriftBinaryCLIService 클래스: HS2의 임베디드 모드. 임베디드 metastore와 혼동하지 마세요(개념은 비슷하지만 다른 서비스입니다).
- org.apache.hive.service.cli.session.HiveSessionImpl 클래스: 서버 쪽에서 생성되어
SessionManager인스턴스가 관리하는 세션 클래스 - org.apache.hive.service.cli.operation.Operation 클래스: (예: 쿼리) 오퍼레이션을 정의. 서버에서 생성되어
OperationManager인스턴스가 관리 - org.apache.hive.service.auth.HiveAuthFactory 클래스: HTTP/TCP 모드 모두에서 인증에 사용되는 헬퍼. 다양한 인증 옵션은 Setting Up HiveServer2, 특히 Authentication/Security Configuration과 Cookie Based Authentication을 참고
클라이언트 쪽(Client Side)
- org.apache.hive.jdbc.HiveConnection 클래스:
java.sql.Connection(JDBC의 일부) 인터페이스 구현. 이 클래스 인스턴스는 서버에 Thrift API 호출을 할 때 얻는SessionHandle인스턴스에 대한 참조를 보유 - org.apache.hive.jdbc.HiveStatement 클래스:
java.sql.Statement인터페이스 구현. 클라이언트(예: Beeline)는 쿼리를 위해HiveStatement.execute()를 호출.execute()내부에서 Thrift 클라이언트로 API 호출 - org.apache.hive.jdbc.HiveDriver 클래스:
java.sql.Driver인터페이스 구현. 핵심 메서드는 JDBC 클라이언트가 SQL 연결을 시작하는 데 쓰는connect()
클라이언트/서버 상호작용
- org.apache.hive.service.cli.SessionHandle 클래스: 세션 식별자. 서버에서 반환되어 클라이언트가 Thrift API 호출의 입력으로 사용
- org.apache.hive.service.cli.OperationHandle 클래스: 오퍼레이션 식별자. 서버에서 반환되어 클라이언트가 오퍼레이션의 실행 상태를 폴링하는 데 사용
리소스(Resources)
- HS2 설정 방법: Setting Up HiveServer2
- HS2 클라이언트: HiveServer2 Clients
- 사용자 인터페이스: Web UI for HiveServer2
- 메트릭: Hive Metrics
더 알아보기 (Learn more)
HS2는 Hive의 현대적 접근 서비스예요. TCP/HTTP transport와 Thrift 프로토콜, JDBC 기반 클라이언트 흐름을 이해하면 Beeline 같은 도구가 실제로 어떻게 쿼리를 실행하는지 파악할 수 있습니다.