HiveServer2 엔드포인트

HiveServer2 엔드포인트

Flink SQL GatewayHiveServer2 와이어 프로토콜과 호환되는 HiveServer2 엔드포인트로 배포되는 것을 지원합니다. 이를 통해 사용자는 Thrift 또는 Hive JDBC 드라이버를 사용하는 기존 Hive 클라이언트로 Flink SQL Gateway를 통해 Hive-dialect SQL을 제출할 수 있습니다. 이러한 클라이언트에는 Beeline, DBeaver, Apache Superset 등이 포함됩니다.

HiveServer2와 동일한 경험을 얻으려면 HiveServer2 엔드포인트를 Hive Catalog와 Hive dialect와 함께 사용하는 것이 권장됩니다. 자세한 내용은 Hive Dialect를 참조하세요.

출처: 문서

본문

설정

HiveServer2 엔드포인트로 SQL Gateway 여정을 시작하기 전에 필요한 의존성을 준비하세요.

HiveServer2 엔드포인트 구성

HiveServer2 엔드포인트는 SQL Gateway의 기본 엔드포인트가 아닙니다. 다음을 호출하여 HiveServer2 엔드포인트를 사용하도록 구성할 수 있습니다.

$ ./bin/sql-gateway.sh start -Dsql-gateway.endpoint.type=hiveserver2 -Dsql-gateway.endpoint.hiveserver2.catalog.hive-conf-dir=<path to hive conf>

또는 Flink 구성 파일에 다음 구성을 추가합니다(<path to hive conf>를 자신의 hive conf 경로로 바꾸세요).

sql-gateway.endpoint.type: hiveserver2
sql-gateway.endpoint.hiveserver2.catalog.hive-conf-dir: <path to hive conf>

HiveServer2에 연결

SQL Gateway를 시작한 후 Apache Hive Beeline으로 SQL을 제출할 수 있습니다.

$ ./beeline
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/Users/ohmeatball/Work/hive-related/apache-hive-2.3.9-bin/lib/log4j-slf4j-impl-2.6.2.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/usr/local/Cellar/hadoop/3.2.1_1/libexec/share/hadoop/common/lib/slf4j-log4j12-1.7.25.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.apache.logging.slf4j.Log4jLoggerFactory]
Beeline version 2.3.9 by Apache Hive
beeline> !connect jdbc:hive2://localhost:10000/default;auth=noSasl
Connecting to jdbc:hive2://localhost:10000/default;auth=noSasl
Enter username for jdbc:hive2://localhost:10000/default:
Enter password for jdbc:hive2://localhost:10000/default:
Connected to: Apache Flink (version 1.16)
Driver: Hive JDBC (version 2.3.9)
Transaction isolation: TRANSACTION_REPEATABLE_READ
0: jdbc:hive2://localhost:10000/default> CREATE TABLE Source (
. . . . . . . . . . . . . . . . . . . .> a INT,
. . . . . . . . . . . . . . . . . . . .> b STRING
. . . . . . . . . . . . . . . . . . . .> );
+---------+
| result  |
+---------+
| OK      |
+---------+
0: jdbc:hive2://localhost:10000/default> CREATE TABLE Sink (
. . . . . . . . . . . . . . . . . . . .> a INT,
. . . . . . . . . . . . . . . . . . . .> b STRING
. . . . . . . . . . . . . . . . . . . .> );
+---------+
| result  |
+---------+
| OK      |
+---------+
0: jdbc:hive2://localhost:10000/default> INSERT INTO Sink SELECT * FROM Source; 
+-----------------------------------+
|              job id               |
+-----------------------------------+
| 55ff290b57829998ea6e9acc240a0676  |
+-----------------------------------+
1 row selected (2.427 seconds)

엔드포인트 옵션

YAML 파일이나 DDL로 HiveServer2 엔드포인트 인스턴스를 생성할 때 지원되는 옵션은 다음과 같습니다.

Key Required Default Type Description
sql-gateway.endpoint.type required "rest" List 사용할 엔드포인트를 지정합니다. 여기서는 'hiveserver2'여야 합니다.
sql-gateway.endpoint.hiveserver2.catalog.hive-conf-dir required (none) String hive-site.xml을 포함하는 Hive conf 디렉터리의 URI입니다. URI는 Hadoop FileSystem이 지원해야 합니다. URI가 상대적이면, 즉 scheme이 없으면 로컬 파일 시스템으로 가정합니다. 옵션이 지정되지 않으면 class path에서 hive-site.xml을 검색합니다.
sql-gateway.endpoint.hiveserver2.catalog.default-database optional "default" String 카탈로그가 현재 카탈로그로 설정될 때 사용할 기본 데이터베이스입니다.
sql-gateway.endpoint.hiveserver2.catalog.name optional "hive" String 사전 등록된 hive 카탈로그의 이름입니다.
sql-gateway.endpoint.hiveserver2.module.name optional "hive" String 사전 등록된 hive 모듈의 이름입니다.
sql-gateway.endpoint.hiveserver2.thrift.exponential.backoff.slot.length optional 100 ms Duration HiveServer2 로그인 중 Thrift 클라이언트의 이진 지수 백오프 슬롯 시간입니다. Thrift 클라이언트 타임아웃에 도달할 때까지의 재시도용입니다.
sql-gateway.endpoint.hiveserver2.thrift.host optional (none) String 통신에 사용할 HiveServer2 호스트의 서버 주소입니다. 기본값은 비어 있으며 localhost에 바인딩함을 의미합니다. 호스트에 여러 네트워크 주소가 있는 경우에만 필요합니다.
sql-gateway.endpoint.hiveserver2.thrift.login.timeout optional 20 s Duration HiveServer2 로그인 중 Thrift 클라이언트의 타임아웃입니다.
sql-gateway.endpoint.hiveserver2.thrift.max.message.size optional 104857600 Long HS2 서버가 수락할 최대 메시지 크기(바이트)입니다.
sql-gateway.endpoint.hiveserver2.thrift.port optional 10000 Integer HiveServer2 엔드포인트의 포트입니다.
sql-gateway.endpoint.hiveserver2.thrift.worker.keepalive-time optional 1 min Duration 유휴 worker 스레드의 유지 시간입니다. worker 수가 최소 worker 수를 초과하면 과도한 스레드는 이 시간 간격 후에 종료됩니다.
sql-gateway.endpoint.hiveserver2.thrift.worker.threads.max optional 512 Integer 최대 Thrift worker 스레드 수입니다.
sql-gateway.endpoint.hiveserver2.thrift.worker.threads.min optional 5 Integer 최소 Thrift worker 스레드 수입니다.

HiveServer2 프로토콜 호환성

HiveServer2 엔드포인트가 있는 Flink SQL Gateway는 Apache Hive의 HiveServer2와 비교해 동일한 경험을 제공하는 것을 목표로 합니다. 따라서 HiveServer2 엔드포인트는 Hive 사용자에게 더 일관된 경험을 주기 위해 환경을 자동으로 초기화합니다.

  • 기본 카탈로그로 Hive Catalog를 생성합니다.
  • Hive 함수 모듈을 로드하고 function module 목록의 첫 번째에 배치하여 Hive 내장 함수를 사용합니다.
  • Hive dialect로 전환합니다(table.sql-dialect = hive).
  • 배치 실행 모드로 전환합니다(execution.runtime-mode = BATCH).
  • DML 문(예: INSERT INTO)을 블로킹 방식으로 하나씩 실행합니다(table.dml-sync = true).

이 필수 전제 조건들로 Hive 스타일의 Hive SQL을 제출하되 Flink 환경에서 실행할 수 있습니다.

클라이언트 & 도구

HiveServer2 엔드포인트는 HiveServer2 와이어 프로토콜과 호환됩니다. 따라서 Hive SQL을 관리하는 도구는 HiveServer2 엔드포인트가 있는 SQL Gateway에서도 작동합니다. 현재 Hive JDBC, Hive Beeline, Dbeaver, Apache Superset 등이 HiveServer2 엔드포인트가 있는 Flink SQL Gateway에 연결해 SQL을 제출할 수 있음이 테스트되었습니다.

Hive JDBC

SQL Gateway는 HiveServer2와 호환됩니다. Hive JDBC를 사용해 SQL Gateway에 연결하는 프로그램을 작성할 수 있습니다. 프로그램을 빌드하려면 프로젝트 pom.xml에 다음 의존성을 추가하세요.

<dependency>
    <groupId>org.apache.hive</groupId>
    <artifactId>hive-jdbc</artifactId>
    <version>${hive.version}</version>
</dependency>

의존성을 다시 가져온 후 다음 프로그램을 사용해 연결하고 Hive Catalog의 테이블을 나열할 수 있습니다.

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

public class JdbcConnection {
    public static void main(String[] args) throws Exception {
        try (
                // Please replace the JDBC URI with your actual host, port and database.
                Connection connection = DriverManager.getConnection("jdbc:hive2://{host}:{port}/{database};auth=noSasl"); 
                Statement statement = connection.createStatement()) {
            statement.execute("SHOW TABLES");
            ResultSet resultSet = statement.getResultSet();
            while (resultSet.next()) {
                System.out.println(resultSet.getString(1));
            }
        }
    }
}

DBeaver

DBeaver는 Hive JDBC를 사용해 HiveServer2에 연결합니다. 따라서 DBeaver는 Flink SQL Gateway에 연결해 Hive SQL을 제출할 수 있습니다. API 호환성을 고려해 HiveServer2처럼 Flink SQL Gateway에 연결할 수 있습니다. DBeaver로 HiveServer2 엔드포인트가 있는 Flink SQL Gateway에 연결하는 방법은 guidance를 참조하세요.

주의: 현재 HiveServer2 엔드포인트는 인증을 지원하지 않습니다. 다음 JDBC URL을 사용해 DBeaver에 연결하세요.

jdbc:hive2://{host}:{port}/{database};auth=noSasl

설정 후 DBeaver로 Flink를 탐색할 수 있습니다.

DBeaver

Apache Superset

Apache Superset은 강력한 데이터 탐색 및 시각화 플랫폼입니다. API 호환성으로 Hive처럼 Flink SQL Gateway에 연결할 수 있습니다. 자세한 내용은 guidance를 참조하세요.

Apache Superset

주의: 현재 HiveServer2 엔드포인트는 인증을 지원하지 않습니다. 다음 JDBC URL을 사용해 Apache Superset에 연결하세요.

hive://hive@{host}:{port}/{database}?auth=NOSASL

스트리밍 SQL

Flink는 배치-스트리밍 통합 엔진입니다. 다음 SQL로 스트리밍 SQL로 전환할 수 있습니다.

SET table.sql-dialect=default; 
SET execution.runtime-mode=streaming; 
SET table.dml-sync=false;

그 후 환경은 Flink SQL을 파싱하고 스트리밍 플래너로 최적화하며 비동기 모드로 작업을 제출할 준비가 됩니다.

주의: HiveServer2 API의 RowKind는 항상 INSERT입니다. 따라서 HiveServer2 엔드포인트는 CDC 데이터를 표현하는 것을 지원하지 않습니다.

지원되는 타입

HiveServer2 엔드포인트는 현재 Hive2를 기반으로 구축되어 모든 Hive2 사용 가능 타입을 지원합니다. Hive 호환 테이블의 경우 HiveServer2 엔드포인트는 Flink 타입을 Hive 타입으로 변환하고 thrift 객체로 직렬화하는 데 HiveCatalog와 같은 규칙을 따릅니다. 타입 매핑은 HiveCatalog를 참조하세요.

더 알아보기 (Learn more)