Pinot 커넥터
Pinot 커넥터 (Pinot connector)
Pinot 커넥터는 Trino가 Apache Pinot에 저장된 데이터를 조회할 수 있게 해줍니다. Pinot의 빠른 집계 기능을 활용하면서 Trino의 표준 SQL 쿼리로 데이터에 접근할 수 있어요.
출처: 문서
본문
요구 사항 (Requirements)
Pinot에 연결하려면 다음이 필요합니다:
- Pinot 1.1.0 이상.
- Trino 코디네이터와 워커에서 Pinot 컨트롤러 노드로의 네트워크 접근. 기본 포트는 8098.
설정 (Configuration)
Pinot 커넥터를 설정하려면 etc/catalog/example.properties 카탈로그 속성 파일을 만들고 최소한 다음 내용을 넣어주세요:
connector.name=pinot
pinot.controller-urls=host1:8098,host2:8098
host1:8098,host2:8098을 Pinot 컨트롤러 노드의 쉼표 구분 목록으로 바꾸세요. IP나 FQDN일 수 있고, URL 스킴(http://)은 선택 사항입니다.
설정 속성 (Configuration properties)
일반 설정 속성 (General configuration properties)
| 속성 이름 | 필수 | 설명 |
|---|---|---|
pinot.controller-urls |
예 | 컨트롤러 호스트의 쉼표 구분 목록. Kubernetes로 배포된 경우 컨트롤러 서비스 엔드포인트를 가리켜야 합니다. Pinot는 호스트 이름을 반환하므로 Pinot 브로커와 서버는 DNS로 접근 가능해야 합니다. |
pinot.broker-url |
아니요 | 브로커의 호스트와 포트. Pinot 컨트롤러 API가 노출한 브로커 URL에 접근할 수 없을 때 브로커 엔드포인트를 지정할 수 있습니다. 이 속성을 켜면 브로커 탐색이 비활성화됩니다. |
pinot.connection-timeout |
아니요 | Pinot 연결 타임아웃. 기본값 1m. |
pinot.metadata-expiry |
아니요 | Pinot 메타데이터 만료 시간. 기본값 2m. |
pinot.controller.authentication.type |
아니요 | 컨트롤러 요청 인증 방법. NONE과 PASSWORD 허용. 기본값은 인증이 없는 NONE. |
pinot.controller.authentication.user |
아니요 | 기본 인증의 컨트롤러 사용자 이름. |
pinot.controller.authentication.password |
아니요 | 기본 인증의 컨트롤러 비밀번호. |
pinot.broker.authentication.type |
아니요 | 브로커 요청 인증 방법. NONE과 PASSWORD 허용. 기본값은 인증이 없는 NONE. |
pinot.broker.authentication.user |
아니요 | 기본 인증의 브로커 사용자 이름. |
pinot.broker.authentication.password |
아니요 | 기본 인증의 브로커 비밀번호. |
pinot.max-rows-per-split-for-segment-queries |
아니요 | Pinot 서버 split이 설정값보다 많은 행을 반환하면 쿼리 실패. 기본값 2,147,483,646. |
pinot.prefer-broker-queries |
아니요 | Pinot 쿼리 계획이 Pinot 브로커를 조회하기를 선호. 기본값 false. |
pinot.forbid-segment-queries |
아니요 | 병렬 조회를 금지하고 모든 조회를 브로커를 통해 수행. 기본값 false. |
pinot.segments-per-split |
아니요 | 하나의 split에서 처리되는 세그먼트 수. 높이면 Pinot에 보내는 요청 수가 줄어듭니다. 작은 Pinot 클러스터에 유용. 기본값 1. |
pinot.fetch-retry-count |
아니요 | 재시도 가능한 Pinot 데이터 fetch 호출의 재시도 횟수. 기본값 2. |
pinot.non-aggregate-limit-for-broker-queries |
아니요 | Pinot 브로커에 대한 비집계 쿼리의 최대 limit. 기본값 25,000. |
pinot.max-rows-for-broker-queries |
아니요 | 브로커 쿼리가 반환할 수 있는 최대 행 수. 기본값 50,000. |
pinot.aggregation-pushdown.enabled |
아니요 | 집계 쿼리 푸시다운. 기본값 true. |
pinot.count-distinct-pushdown.enabled |
아니요 | count distinct 쿼리를 Pinot로 푸시다운. 기본값 true. |
pinot.target-segment-page-size |
아니요 | 세그먼트 쿼리의 최대 허용 페이지 크기. 기본값 1MB. |
pinot.proxy.enabled |
아니요 | 컨트롤러/브로커 요청에 Pinot Proxy 사용. 기본값 false. |
pinot.controller.authentication.type이 PASSWORD이면 pinot.controller.authentication.user와 pinot.controller.authentication.password가 모두 필요합니다. pinot.broker.authentication.type이 PASSWORD이면 pinot.broker.authentication.user와 pinot.broker.authentication.password가 모두 필요합니다. pinot.controller-urls가 https 스킴을 사용하면 브로커를 포함한 모든 연결에 TLS가 활성화됩니다.
gRPC 설정 속성 (gRPC configuration properties)
| 속성 이름 | 필수 | 설명 |
|---|---|---|
pinot.grpc.port |
아니요 | Pinot gRPC 포트. 기본값 8090. |
pinot.grpc.max-inbound-message-size |
아니요 | gRPC 클라이언트 초기화 시 최대 인바운드 메시지 바이트. 기본값 128MB. |
pinot.grpc.use-plain-text |
아니요 | gRPC 통신에 평문 사용. 기본값 true. |
pinot.grpc.tls.keystore-type |
아니요 | gRPC 연결의 TLS 키 스토어 유형. 기본값 JKS. |
pinot.grpc.tls.keystore-path |
아니요 | gRPC 연결의 TLS 키 스토어 파일 위치. 기본값 비어 있음. |
pinot.grpc.tls.keystore-password |
아니요 | TLS 키 스토어 비밀번호. 기본값 비어 있음. |
pinot.grpc.tls.truststore-type |
아니요 | gRPC 연결의 TLS 트러스트 스토어 유형. 기본값 JKS. |
pinot.grpc.tls.truststore-path |
아니요 | gRPC 연결의 TLS 트러스트 스토어 파일 위치. 기본값 비어 있음. |
pinot.grpc.tls.truststore-password |
아니요 | TLS 트러스트 스토어 비밀번호. 기본값 비어 있음. |
pinot.grpc.tls.ssl-provider |
아니요 | SSL 공급자. 기본값 JDK. |
pinot.grpc.proxy-uri |
아니요 | Pinot Rest Proxy gRPC 엔드포인트 URI. 기본값 null. |
더 많은 Apache Pinot TLS 설정은 Configuring TLS/SSL 문서를 참고하세요. 시크릿 (secrets)을 사용하면 카탈로그 속성 파일에 실제 값을 넣지 않을 수 있습니다.
Pinot 테이블 조회 (Querying Pinot tables)
Pinot 커넥터는 카탈로그의 기본 스키마에 있는 모든 테이블을 자동으로 노출합니다. 다음 쿼리로 pinot 카탈로그의 모든 테이블을 나열할 수 있습니다:
SHOW TABLES FROM example.default;
flight_status 테이블의 컬럼을 나열하려면:
DESCRIBE example.default.flight_status;
SHOW COLUMNS FROM example.default.flight_status;
SQL로 작성한 쿼리는 완전히 지원되며 필터와 limit을 포함할 수 있습니다:
SELECT foo
FROM pinot_table
WHERE bar = 3 AND baz IN ('ONE', 'TWO', 'THREE')
LIMIT 25000;
동적 테이블 (Dynamic tables)
Pinot의 빠른 집계를 활용하려면 PQL로 작성한 Pinot 쿼리를 테이블 이름으로 사용할 수 있습니다. 외부 쿼리의 필터와 limit은 Pinot으로 푸시다운됩니다. 예제 쿼리를 살펴봅시다:
SELECT *
FROM example.default."SELECT MAX(col1), COUNT(col2) FROM pinot_table GROUP BY col3, col4"
WHERE col3 IN ('FOO', 'BAR') AND col4 > 50
LIMIT 30000
필터링과 limit 처리가 Pinot으로 푸시다운됩니다.
쿼리는 브로커로 라우팅되며 집계 쿼리에 더 적합합니다. 집계가 없는 SELECT 쿼리는 일반 SQL 쿼리를 발행하는 것이 더 성능이 좋습니다. 처리는 데이터를 저장하는 서버로 직접 라우팅됩니다.
위 쿼리는 다음 Pinot PQL 쿼리로 변환됩니다:
SELECT MAX(col1), COUNT(col2)
FROM pinot_table
WHERE col3 IN('FOO', 'BAR') and col4 > 50
TOP 30000
데이터 유형 매핑 (Type mapping)
Trino와 Pinot는 서로 지원하지 않는 유형이 있으므로, 커넥터는 데이터를 읽을 때 일부 유형을 매핑합니다.
Pinot 유형에서 Trino 유형으로의 매핑:
| Pinot 유형 | Trino 유형 |
|---|---|
INT |
INTEGER |
LONG |
BIGINT |
FLOAT |
REAL |
DOUBLE |
DOUBLE |
STRING |
VARCHAR |
BYTES |
VARBINARY |
JSON |
JSON |
TIMESTAMP |
TIMESTAMP |
INT_ARRAY |
VARCHAR |
LONG_ARRAY |
VARCHAR |
FLOAT_ARRAY |
VARCHAR |
DOUBLE_ARRAY |
VARCHAR |
STRING_ARRAY |
VARCHAR |
그 외 유형은 지원되지 않습니다.
Date 유형 (Date Type)
Pinot DateTimeFields의 경우 FormatSpec이 일(days) 단위면 Trino DATE 유형으로 변환됩니다. Pinot는 LONG 필드가 days의 FormatSpec을 가질 수도 있게 허용하는데, 값이 Integer.MAX_VALUE보다 크면 Trino DATE로의 변환이 실패합니다.
null 처리 (Null Handling)
Pinot TableSpec의 nullHandlingEnabled가 true면 숫자 유형의 null 값은 해당 유형의 MIN_VALUE로 인코딩됩니다. Pinot STRING 유형의 null 값은 NULL 값으로 해석됩니다.
SQL 지원 (SQL support)
커넥터는 Pinot의 데이터와 메타데이터에 접근하기 위한 전역 사용 가능 명령문과 읽기 연산 명령문을 제공합니다.
푸시다운 (Pushdown)
커넥터는 다음 연산에 대해 푸시다운을 지원합니다:
- LIMIT 푸시다운
- 다음 함수에 대한 집계 푸시다운:
avg(),approx_distinct(),count(*)와count(distinct)변형,max(),min(),sum()
집계 함수 푸시다운은 기본적으로 활성화되어 있지만, pinot.aggregation-pushdown.enabled 카탈로그 속성 또는 aggregation_pushdown_enabled 카탈로그 세션 속성으로 비활성화할 수 있습니다.
count(distinct) 푸시다운은 Pinot가 전체 테이블 스캔을 실행해 성능에 큰 영향을 줄 수 있습니다. 이 문제가 발생하면 pinot.count-distinct-pushdown.enabled 카탈로그 속성 또는 count_distinct_pushdown_enabled 카탈로그 세션 속성으로 비활성화할 수 있습니다.
커넥터는 성능이 향상될 수 있는 곳에서 푸시다운을 수행하지만, 정확성을 지키기 위해 일부 연산은 푸시다운되지 않을 수 있습니다.
더 알아보기 (Learn more)
Pinot 커넥터로 다른 데이터 소스와 데이터를 조합해보세요. 커넥터의 일반적인 개념은 커넥터 개요 문서에서 확인할 수 있어요.