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 コントローラーのURL。 |
|
Pinot コントローラーのリクエストに対する代替RESTエンドポイント。 |
|
Pinot RESTプロキシのURL。 |
|
集約以外のセグメントクエリをプッシュダウンするときの返される行数を制限します。デフォルトは2147483647です。 |
|
ブローカークエリをプッシュダウンするときのTOP/LIMIT値を制限します。デフォルトは10000です。 |
|
Pinotサーバーとの通信の接続タイムアウト。デフォルトは1分です。 |
|
Pinotメタデータキャッシュの有効期限。デフォルトは2分です。 |
|
数値以外の列の推定バイトサイズ。デフォルトは20です。 |
|
RPCサービスヘッダーキー。デフォルトは"RPC-Service"です。 |
|
RPCサービス呼び出し元ヘッダーキー。デフォルトは"RPC-Caller"です。 |
|
RPCサービス呼び出し元ヘッダー値。デフォルトは"presto"です。 |
|
ブローカーリクエストのプッシュダウンを禁止します。デフォルトはfalseです。 |
|
セグメントクエリのプッシュダウンを禁止します。ブローカークエリのプッシュダウンが不可能な場合は、クエリが失敗します。デフォルトはfalseです。 |
|
PinotブローカーのリクエストにRESTプロキシエンドポイントを使用します。デフォルトはfalseです。 |
|
Prestoとの互換性が高い新しいUDF dateTruncをPinotで使用します。デフォルトはfalseです。 |
|
分割あたりの同じホストのセグメント数。デフォルトは1です。 |
|
空または欠落しているPinotサーバーの応答を無視します。デフォルトはfalseです。 |
|
再試行可能なPinotデータフェッチ呼び出しの再試行回数。デフォルトは2です。 |
|
Pinotブローカーへの集約以外のクエリの最大制限。デフォルトは25000です。 |
|
PinotのDAYSエポック列をPrestoのDATE型に推論します。デフォルトはtrueです。 |
|
PinotのSECONDSエポック列をPrestoのTIMESTAMP型に推論します。デフォルトはtrueです。 |
|
失敗時にPinotリクエストを再試行します。デフォルトはtrueです。 |
|
クエリパターンをブローカーにプッシュダウンすることを許可します:集約 + groupBy + orderBy。デフォルトはfalseです。 |
|
gRPCクライアントを初期化するときの最大受信メッセージバイト数。デフォルトは128MBです。 |
|
Pinotクラスタがプロキシの背後にあるかどうか。デフォルトはfalseです。 |
|
Pinot gRPCホスト。 |
|
Pinot gRPCポート。 |
|
すべての接続にhttpsを使用します。デフォルトはfalseです。 |
|
'distinctCount'関数の名前をオーバーライドします。デフォルトは"distinctCount"です。 |
|
HTTPベースのPinotリクエストをPinotコントローラー/ブローカーに送信するときの追加ヘッダー。例:k1:v1,k2:v2。 |
|
gRPCベースのPinotリクエストをPinotブローカー/サーバー/プロキシに送信するときの追加メタデータ。例:k1:v1,k2:v2。 |
|
gRPC接続のTLSキーストアファイルの場所。デフォルトは空(不要)です。 |
|
gRPC接続のTLSキーストアの種類。デフォルトは空(不要)です。 |
|
TLSキーストアパスワード。デフォルトは空(不要)です。 |
|
gRPC接続のTLSトラストストアファイルの場所。デフォルトは空(不要)です。 |
|
gRPC接続のTLSトラストストアの種類。デフォルトは空(不要)です。 |
|
TLSトラストストアパスワード。デフォルトは空(不要)です。 |
|
コントローラーリクエストのPinot認証方法。許可される値は |
|
基本認証方法のコントローラーのユーザー名。 |
|
基本認証方法のコントローラーのパスワード。 |
|
ブローカーリクエストのPinot認証方法。許可される値は |
|
基本認証方法のブローカーのユーザー名。 |
|
基本認証方法のブローカーのパスワード。 |
|
Pinotクエリ関連の大文字小文字を区別するオプション。例:skipUpsert:true,enableNullHandling:true |
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クエリを再試行します。 |
|
再試行可能なPinotデータフェッチ呼び出しの再試行回数。 |
|
Prestoとの互換性を高めた新しいUDF dateTruncをPinotで使用します。 |
|
Pinotブローカーへの非集計クエリの上限。 |
|
トップクエリに対して、PinotブローカーにOrderByをプッシュダウンします。 |
|
分割ごとの同じホストのセグメント数。 |
|
大規模セグメントに対するサーバークエリ選択の上限。 |
|
個別のカウント関数を別の関数名にオーバーライドします。 |
|
ブローカークエリをプッシュダウンするときのTOP/LIMIT値を制限します。 |
|
基本認証方法のコントローラーのユーザー名。 |
|
基本認証方法のコントローラーのパスワード。 |
|
基本認証方法のブローカーのユーザー名。 |
|
基本認証方法のブローカーのパスワード。 |
|
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データ型DATE
とTIMESTAMP
を推測できます。
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クラスタ内のすべてのテーブルをリストします。
mypinotcluster
にclicks
というテーブルがあるとします。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行です。