본문 바로가기
개발/Hadoop eco-system

[Hadoop] HiveServer2

by 달사쿠 2023. 1. 13.
반응형

Introduction

HiveServer2(HS2)는 클라이언트가 Hive에 대해 쿼리를 실행할 수 있도록 하는 서비스입니다. HiveServer2는 더 이상 사용되지 않는 HiveServer1의 후속 제품입니다. HS2는 다중 클라이언트 동시성 및 인증을 지원합니다. JDBC 및 ODBC와 같은 개방형 API 클라이언트에 대한 더 나은 지원을 제공하도록 설계되었습니다.

HS2는 Thrift 기반 Hive 서비스(TCP 또는 HTTP)와 웹 UI용 Jetty 웹 서버를 포함하는 복합 서비스로 실행되는 단일 프로세스입니다.

 


HS2 Architecture

Thrift 기반 Hive 서비스는 HS2의 핵심이며 Hive 쿼리(예: Beeline에서) 서비스를 담당합니다. Thrift는 교차 플랫폼 서비스를 구축하기 위한 RPC 프레임워크입니다. 스택은 서버, 프로세서, 프로토콜, 전송으로 4개 계층으로 구성됩니다. 계층에 대한 자세한 내용은 https://thrift.apache.org/docs/concepts에서 확인할 수 있으며, 스택

 

Apache Thrift - Concepts

Thrift network stack Simple representation of the Apache Thrift networking stack +-------------------------------------------+ | Server | | (single-threaded, event-driven etc) | +-------------------------------------------+ | Processor | | (compiler genera

thrift.apache.org

HS2 구현에서 이러한 계층의 사용은 아래에 설명되어 있습니다.

 

Server

HS2는 TCP 모드에 TThreadPoolServer(Thrift에서 제공)를 사용하거나 HTTP 모드에 Jetty 서버를 사용합니다.

TThreadPoolServer는 TCP 연결당 하나의 작업자 스레드를 할당합니다. 각 스레드는 연결이 유휴 상태인 경우에도 항상 connection과 연결됩니다. 따라서 많은 수의 동시 연결로 인해 많은 수의 스레드로 인해 발생하는 잠재적인 성능 문제가 있습니다. 향후 HS2는 TThreadedSelectorServer와 같은 TCP 모드의 다른 서버 유형으로 전환될 수 있습니다. 다음은 서로 다른 Thrift Java 서버 간의 성능 비교에 대한 기사입니다.

Processor

프로세스 구현은 요청을 처리하는 애플리케이션 로직입니다. 예를 들어 ThriftCLIService.ExecuteStatement() 메서드는 Hive 쿼리를 컴파일하고 실행하는 논리를 구현합니다.

Protocol

프로토콜 구현은 직렬화 및 역직렬화를 담당합니다. HS2는 현재 직렬화를 위한 Thrift 프로토콜로 TBinaryProtocol을 사용하고 있습니다. 향후에는 더 많은 성능 평가를 기반으로 TCompactProtocol과 같은 다른 프로토콜을 고려할 수 있습니다.

Transport

HTTP 모드는 클라이언트와 서버 간에 프록시가 필요한 경우(예: 부하 분산 또는 보안상의 이유로) 필요합니다. 이것이 TCP 모드뿐만 아니라 지원되는 이유입니다. Hive 구성 속성 hive.server2.transport.mode를 통해 Thrift 서비스의 전송 모드를 지정할 수 있습니다.

 


Dependencies of HS2

메타스토어

메타스토어는 임베디드(HS2와 동일한 프로세스에서) 또는 원격 서버(역시 Thrift 기반 서비스임)로 구성할 수 있습니다. HS2는 쿼리 컴파일에 필요한 메타데이터에 대해 메타스토어와 통신합니다.

하둡 클러스터

HS2는 다양한 실행 엔진(MapReduce/Tez/Spark)에 대한 물리적 실행 계획을 준비하고 실행을 위해 Hadoop 클러스터에 작업을 제출합니다.

 

여기에서 HS2와 해당 종속성 간의 상호 작용에 대한 다이어그램을 찾을 수 있습니다.

 


JDBC Client

JDBC 드라이버는 클라이언트 측이 HS2와 상호 작용하는 데 권장됩니다. Thrift 클라이언트를 직접 사용하고 JDBC를 우회하는 일부 사용 사례(예: Hadoop Hue)가 있습니다.

 

다음은 첫 번째 쿼리를 만드는 데 관련된 일련의 API 호출입니다.

  • JDBC 클라이언트(예: Beeline)는 전송 연결(예: TCP 연결)을 시작한 다음 SessionHandle을 가져오기 위한 OpenSession API 호출을 시작하여 HiveConnection을 생성합니다. 세션은 서버 측에서 생성됩니다.
  • HiveStatement가 실행되고(JDBC 표준에 따라) Thrift 클라이언트에서 ExecuteStatement API 호출이 이루어집니다. API 호출에서 SessionHandle 정보는 쿼리 정보와 함께 서버로 전달됩니다.
  • HS2 서버는 요청을 수신하고 드라이버(CommandProcessor)에게 쿼리 구문 분석 및 컴파일을 요청합니다. 드라이버는 Hadoop과 통신하는 백그라운드 작업을 시작하고 즉시 클라이언트에 응답을 반환합니다. 이것은 ExecuteStatement API의 비동기 설계입니다. 응답에는 서버 측에서 생성된 OperationHandle이 포함됩니다.
  • 클라이언트는 OperationHandle을 사용하여 HS2와 통신하여 쿼리 실행 상태를 폴링합니다.

https://cwiki.apache.org/confluence/display/hive/hiveserver2+overview 

https://cwiki.apache.org/confluence/display/Hive/HiveServer2+Clients 

 

반응형

댓글