Apache Pinot コネクタ

Apache Pinot コネクタを使用すると、外部の Apache Pinot データベースでテーブルのクエリと作成を行うことができます。これは、Pinot データのクエリや、Pinot データと他のデータの結合に使用できます。

設定

Pinot コネクタを設定するには、etc/catalogにカタログプロパティファイルを作成します。たとえば、pinot.propertiesという名前で、Pinot コネクタをpinotカタログとしてマウントします。次の内容でファイルを作成し、接続プロパティをセットアップに合わせて適宜変更してください。

connector.name=pinot
pinot.controller-urls=controller_host1:9000,controller_host2:9000

pinot.controller-urlsプロパティでは、Pinot コントローラーのホスト/ポートのペアをコンマ区切りリストで指定できます。

複数のPinotクラスタ

必要な数のカタログを持つことができます。そのため、追加のPinotクラスタがある場合は、別の名前(.propertiesで終わるようにする)で別のプロパティファイルをetc/catalogに追加するだけです。たとえば、プロパティファイルの名前をsales.propertiesにした場合、Prestoは設定されたコネクタを使用してsalesという名前のカタログを作成します。

カタログプロパティ

次のカタログ設定プロパティを使用できます。

プロパティ名

説明

pinot.controller-urls

Pinot コントローラーのURL。

pinot.controller-rest-service

Pinot コントローラーのリクエストに対する代替RESTエンドポイント。

pinot.rest-proxy-url

Pinot RESTプロキシのURL。

pinot.limit-large-for-segment

集約以外のセグメントクエリをプッシュダウンするときの返される行数を制限します。デフォルトは2147483647です。

pinot.topn-large

ブローカークエリをプッシュダウンするときのTOP/LIMIT値を制限します。デフォルトは10000です。

pinot.connection-timeout

Pinotサーバーとの通信の接続タイムアウト。デフォルトは1分です。

pinot.metadata-expiry

Pinotメタデータキャッシュの有効期限。デフォルトは2分です。

pinot.estimated-size-in-bytes-for-non-numeric-column

数値以外の列の推定バイトサイズ。デフォルトは20です。

pinot.service-header-param

RPCサービスヘッダーキー。デフォルトは"RPC-Service"です。

pinot.caller-header-param

RPCサービス呼び出し元ヘッダーキー。デフォルトは"RPC-Caller"です。

pinot.caller-header-value

RPCサービス呼び出し元ヘッダー値。デフォルトは"presto"です。

pinot.forbid-broker-queries

ブローカーリクエストのプッシュダウンを禁止します。デフォルトはfalseです。

pinot.forbid-segment-queries

セグメントクエリのプッシュダウンを禁止します。ブローカークエリのプッシュダウンが不可能な場合は、クエリが失敗します。デフォルトはfalseです。

pinot.rest-proxy-service-for-query

PinotブローカーのリクエストにRESTプロキシエンドポイントを使用します。デフォルトはfalseです。

pinot.use-date-trunc

Prestoとの互換性が高い新しいUDF dateTruncをPinotで使用します。デフォルトはfalseです。

pinot.num-segments-per-split

分割あたりの同じホストのセグメント数。デフォルトは1です。

pinot.ignore-empty-responses

空または欠落しているPinotサーバーの応答を無視します。デフォルトはfalseです。

pinot.fetch-retry-count

再試行可能なPinotデータフェッチ呼び出しの再試行回数。デフォルトは2です。

pinot.non-aggregate-limit-for-broker-queries

Pinotブローカーへの集約以外のクエリの最大制限。デフォルトは25000です。

pinot.infer-date-type-in-schema

PinotのDAYSエポック列をPrestoのDATE型に推論します。デフォルトはtrueです。

pinot.infer-timestamp-type-in-schema

PinotのSECONDSエポック列をPrestoのTIMESTAMP型に推論します。デフォルトはtrueです。

pinot.mark-data-fetch-exceptions-as-retriable

失敗時にPinotリクエストを再試行します。デフォルトはtrueです。

pinot.pushdown-topn-broker-queries

クエリパターンをブローカーにプッシュダウンすることを許可します:集約 + groupBy + orderBy。デフォルトはfalseです。

pinot.streaming-server-grpc-max-inbound-message-bytes

gRPCクライアントを初期化するときの最大受信メッセージバイト数。デフォルトは128MBです。

pinot.proxy-enabled

Pinotクラスタがプロキシの背後にあるかどうか。デフォルトはfalseです。

pinot.grpc-host

Pinot gRPCホスト。

pinot.grpc-port

Pinot gRPCポート。

pinot.secure-connection

すべての接続にhttpsを使用します。デフォルトはfalseです。

pinot.override-distinct-count-function

'distinctCount'関数の名前をオーバーライドします。デフォルトは"distinctCount"です。

pinot.extra-http-headers

HTTPベースのPinotリクエストをPinotコントローラー/ブローカーに送信するときの追加ヘッダー。例:k1:v1,k2:v2。

pinot.extra-grpc-metadata

gRPCベースのPinotリクエストをPinotブローカー/サーバー/プロキシに送信するときの追加メタデータ。例:k1:v1,k2:v2。

pinot.grpc-tls-key-store-path

gRPC接続のTLSキーストアファイルの場所。デフォルトは空(不要)です。

pinot.grpc-tls-key-store-type

gRPC接続のTLSキーストアの種類。デフォルトは空(不要)です。

pinot.grpc-tls-key-store-password

TLSキーストアパスワード。デフォルトは空(不要)です。

pinot.grpc-tls-trust-store-path

gRPC接続のTLSトラストストアファイルの場所。デフォルトは空(不要)です。

pinot.grpc-tls-trust-store-type

gRPC接続のTLSトラストストアの種類。デフォルトは空(不要)です。

pinot.grpc-tls-trust-store-password

TLSトラストストアパスワード。デフォルトは空(不要)です。

pinot.controller-authentication-type

コントローラーリクエストのPinot認証方法。許可される値はNONEPASSWORDです。デフォルトはNONE(認証なし)です。

pinot.controller-authentication-user

基本認証方法のコントローラーのユーザー名。

pinot.controller-authentication-password

基本認証方法のコントローラーのパスワード。

pinot.broker-authentication-type

ブローカーリクエストのPinot認証方法。許可される値はNONEPASSWORDです。デフォルトはNONE(認証なし)です。

pinot.broker-authentication-user

基本認証方法のブローカーのユーザー名。

pinot.broker-authentication-password

基本認証方法のブローカーのパスワード。

pinot.query-options

Pinotクエリ関連の大文字小文字を区別するオプション。例:skipUpsert:true,enableNullHandling:true

pinot.controller-authentication-typePASSWORDに設定されている場合、pinot.controller-authentication-userpinot.controller-authentication-passwordの両方が必要です。

pinot.broker-authentication-typePASSWORDに設定されている場合、pinot.broker-authentication-userpinot.broker-authentication-passwordの両方が必要です。

セッションプロパティ

以下のセッションプロパティを使用できます。

プロパティ名

説明

pinot.forbid_broker_queries

ブローカーへのクエリを禁止します。

pinot.forbid_segment_queries

セグメントクエリを禁止します。

pinot.mark_data_fetch_exceptions_as_retriable

データフェッチ例外が発生した場合、Pinotクエリを再試行します。

pinot.retry_count

再試行可能なPinotデータフェッチ呼び出しの再試行回数。

pinot.use_date_trunc

Prestoとの互換性を高めた新しいUDF dateTruncをPinotで使用します。

pinot.non_aggregate_limit_for_broker_queries

Pinotブローカーへの非集計クエリの上限。

pinot.pushdown_topn_broker_queries

トップクエリに対して、PinotブローカーにOrderByをプッシュダウンします。

pinot.num_segments_per_split

分割ごとの同じホストのセグメント数。

pinot.limit_larger_for_segment

大規模セグメントに対するサーバークエリ選択の上限。

pinot.override_distinct_count_function

個別のカウント関数を別の関数名にオーバーライドします。

pinot.topn_large

ブローカークエリをプッシュダウンするときのTOP/LIMIT値を制限します。

pinot.controller_authentication_user

基本認証方法のコントローラーのユーザー名。

pinot.controller_authentication_password

基本認証方法のコントローラーのパスワード。

pinot.broker_authentication_user

基本認証方法のブローカーのユーザー名。

pinot.broker_authentication_password

基本認証方法のブローカーのパスワード。

pinot.query_options

Pinotクエリ関連の大文字小文字を区別するオプション。例:skipUpsert:true,enableNullHandling:true

PinotスキーマとPrestoスキーマのマッピング

一般的に、PinotスキーマからPrestoスキーマへのマッピングは非常に簡単です。デフォルトでは、データ型マッピングは下表に従います。

Pinotデータ型

Prestoデータ型

INT

INTEGER

LONG

BIGINT

FLOAT

DOUBLE

DOUBLE

DOUBLE

BYTES

VARBINARY

STRING

VARCHAR

Pinotは各フィールドをディメンション、メトリック、または時間(date_time)フィールドとして定義するため、Prestoデータ型DATETIMESTAMPを推測できます。

  • timeGranularityが{ "TimeFormat":"EPOCH", "TimeUnit":"DAYS", "TimeUnitSize": 1 }であるPinotのTIMEフィールドは、DATE型にマッピングできます。

  • timeGranularityが{ "TimeFormat":"EPOCH", "TimeUnit":"MILLISECONDS", "TimeUnitSize": 1 }であるPinotのTIMEフィールドは、TIMESTAMP型にマッピングできます。

  • 形式が1:DAYS:EPOCHであるPinotのDATE_TIMEフィールドは、DATE型にマッピングできます。

  • 形式が1:MILLISECONDS:EPOCHであるPinotのDATE_TIMEフィールドは、TIMESTAMP型にマッピングできます。

この動作を制御するいくつかの設定があります。

  • pinot.infer-date-type-in-schema: この設定はデフォルトでfalseです。これをtrueに設定すると、PinotのTIME/DATE_TIMEフィールドを可能であればPrestoのDATEに推測します。

  • pinot.infer-timestamp-type-in-schema: この設定はデフォルトでfalseです。これをtrueに設定すると、PinotのTIME/DATE_TIMEフィールドを可能であればPrestoのTIMESTAMPに推測します。

以下は、設定:pinot.infer-timestamp-type-in-schema=trueの例です。

Pinotスキーマのサンプル

{
  "schemaName": "meetupRsvp",
  "dimensionFieldSpecs": [
    {
      "name": "venue_name",
      "dataType": "STRING"
    },
    {
      "name": "event_name",
      "dataType": "STRING"
    },
    {
      "name": "event_id",
      "dataType": "STRING"
    },
    {
      "name": "event_time",
      "dataType": "LONG"
    },
    {
      "name": "group_city",
      "dataType": "STRING"
    },
    {
      "name": "group_country",
      "dataType": "STRING"
    },
    {
      "name": "group_id",
      "dataType": "LONG"
    },
    {
      "name": "group_name",
      "dataType": "STRING"
    }
  ],
  "metricFieldSpecs": [
    {
      "name": "rsvp_count",
      "dataType": "INT"
    }
  ],
  "timeFieldSpec": {
    "incomingGranularitySpec": {
      "name": "mtime",
      "dataType": "LONG",
      "timeType": "MILLISECONDS"
    }
  }
}

Prestoスキーマのサンプル

table_catalog | table_schema | table_name |  column_name  | ordinal_position | column_default | is_nullable | data_type |  comment  | extra_info
---------------+--------------+------------+---------------+------------------+----------------+-------------+-----------+-----------+------------
pinot         | default      | meetuprsvp | venue_name    |                1 | NULL           | YES         | varchar   | DIMENSION | NULL
pinot         | default      | meetuprsvp | rsvp_count    |                2 | NULL           | YES         | integer   | METRIC    | NULL
pinot         | default      | meetuprsvp | group_city    |                3 | NULL           | YES         | varchar   | DIMENSION | NULL
pinot         | default      | meetuprsvp | event_id      |                4 | NULL           | YES         | varchar   | DIMENSION | NULL
pinot         | default      | meetuprsvp | group_country |                5 | NULL           | YES         | varchar   | DIMENSION | NULL
pinot         | default      | meetuprsvp | group_id      |                6 | NULL           | YES         | bigint    | DIMENSION | NULL
pinot         | default      | meetuprsvp | group_name    |                7 | NULL           | YES         | varchar   | DIMENSION | NULL
pinot         | default      | meetuprsvp | event_name    |                8 | NULL           | YES         | varchar   | DIMENSION | NULL
pinot         | default      | meetuprsvp | mtime         |                9 | NULL           | YES         | timestamp | TIME      | NULL
pinot         | default      | meetuprsvp | event_time    |               10 | NULL           | YES         | bigint    | DIMENSION | NULL

Pinotのクエリ

Pinotカタログは、フラットスキーマ内のすべてのPinotテーブルを公開します。クエリを実行する際にはスキーマ名は重要ではありませんが、SHOW SCHEMASを実行すると、defaultのスキーマエントリが1つだけ表示されます。

Pinotカタログの名前は、.properties拡張子を除いた、上記で作成したカタログファイルです。

たとえば、mypinotcluster.propertiesというファイルを作成した場合、以下のコマンドを使用してその中のすべてのテーブルを確認できます。

SHOW TABLES from mypinotcluster.default

または

SHOW TABLES from mypinotcluster.foo

これらのコマンドはどちらも、Pinotにスキーマの概念がないため、Pinotクラスタ内のすべてのテーブルをリストします。

mypinotclusterclicksというテーブルがあるとします。clicksテーブル内の列のリストは、次のいずれかの方法で確認できます。

DESCRIBE mypinotcluster.dontcare.clicks;
SHOW COLUMNS FROM mypinotcluster.dontcare.clicks;

最後に、clicksテーブルにアクセスできます。

SELECT count(*) FROM mypinotcluster.default.clicks;

Apache Pinotコネクタの動作

このコネクタは、Prestoクエリから推測された最大の部分クエリをPinotにプッシュダウンしようとします。集計、グループ化、すべてのUDFなど、Pinotがサポートするすべてのものをプッシュダウンできます。Pinot特有の点を考慮して、正しいPinotクエリを生成します。

デフォルトでは、集計クエリとLIMITクエリをPinotブローカーに送信し、非集計/非LIMITクエリに対して並列スキャンを実行します。Pinotブローカークエリは、Pinotブローカーが分散収集を実行できるようにする単一の分割を作成します。一方、並列スキャンモードでは、1つ以上のPinotセグメントに対して1つの分割が作成され、PrestoサーバーによってPinotサーバーが直接呼び出されます(つまり、Pinotブローカーは並列スキャンモードには関与しません)。

この動作を制御するいくつかの設定があります。

  • pinot.prefer-broker-queries: この設定はデフォルトでtrueです。これをfalseに設定すると、集計クエリとLIMITクエリについても並列プランが作成されます。

  • pinot.forbid-segment-queries: この設定はデフォルトでfalseです。これをtrueに設定すると、並列クエリが禁止され、すべてのクエリがブローカーを介して実行されます。

  • pinot.non-aggregate-limit-for-broker-queries: ブローカーへの過剰な負荷を防ぐために、コネクタは短いクエリに対してのみPinotブローカーへのクエリを許可します。「短い」クエリとは、集計(またはグループ化)クエリ、またはpinot.non-aggregate-limit-for-broker-queriesで設定された値よりも小さいLIMITを持つクエリのいずれかとして定義されます。この制限のデフォルト値は25K行です。