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 叢集,只需將另一個屬性檔案新增至 etc/catalog
,並使用不同的名稱(確保它以 .properties
結尾)。例如,如果您將屬性檔案命名為 sales.properties
,Presto 將使用已設定的連接器建立名為 sales
的目錄。
目錄屬性¶
以下目錄組態屬性可用
屬性名稱 |
描述 |
---|---|
|
Pinot 控制器 URL。 |
|
Pinot 控制器請求的替代 REST 端點。 |
|
Pinot REST Proxy URL。 |
|
在向下推送非彙總區段查詢時,限制傳回的列數,預設值為 2147483647。 |
|
在向下推送 Broker 查詢時,限制 TOP/LIMIT 值,預設值為 10000。 |
|
與 Pinot 伺服器通訊的連線逾時,預設值為 1 分鐘。 |
|
Pinot 中繼資料快取過期時間,預設值為 2 分鐘。 |
|
非數值資料行的預估位元組大小,預設值為 20。 |
|
RPC 服務標頭索引鍵,預設值為「RPC-Service」。 |
|
RPC 服務呼叫者標頭索引鍵,預設值為「RPC-Caller」。 |
|
RPC 服務呼叫者標頭值,預設值為「presto」。 |
|
不向下推送 Broker 要求,預設值為 false。 |
|
不向下推送區段查詢,如果無法向下推送 Broker 查詢,則使查詢失敗,預設值為 false。 |
|
將 REST Proxy 端點用於 Pinot Broker 要求,預設值為 false。 |
|
使用 Pinot 中與 Presto 更相容的新 UDF dateTrunc,預設值為 false。 |
|
每個分割區的相同主機的區段數,預設值為 1。 |
|
忽略空的或遺失的 Pinot 伺服器回應,預設值為 false。 |
|
可重試的 Pinot 資料擷取呼叫的重試計數,預設值為 2。 |
|
對 Pinot Broker 的非彙總查詢的最大限制,預設值為 25000。 |
|
將 Pinot DAYS epoch 資料行推斷為 Presto DATE 類型,預設值為 true。 |
|
將 Pinot SECONDS epoch 資料行推斷為 Presto TIMESTAMP 類型,預設值為 true。 |
|
失敗時重試 Pinot 要求,預設值為 true。 |
|
允許將查詢模式向下推送至 Broker:彙總 + groupBy + orderBy,預設值為 false。 |
|
初始化 gRPC 用戶端時的最大輸入訊息位元組數,預設值為 128MB。 |
|
Pinot 叢集位於 Proxy 後方,預設值為 false。 |
|
Pinot gRPC 主機。 |
|
Pinot gRPC 埠。 |
|
所有連線都使用 HTTPS 的值為 false。 |
|
覆寫「distinctCount」函數名稱,預設值為「distinctCount」。 |
|
當將基於 HTTP 的 Pinot 要求傳送至 Pinot 控制器/Broker 時的額外標頭。例如 k1:v1,k2:v2。 |
|
當將基於 gRPC 的 Pinot 要求傳送至 Pinot Broker/伺服器/Proxy 時的額外中繼資料。例如 k1:v1,k2:v2。 |
|
gRPC 連線的 TLS 金鑰儲存位置,預設值為空 (不需要) |
|
gRPC 連線的 TLS 金鑰儲存類型,預設值為空 (不需要) |
|
TLS 金鑰儲存密碼,預設值為空 (不需要) |
|
gRPC 連線的 TLS 信任儲存位置,預設值為空 (不需要) |
|
gRPC 連線的 TLS 信任儲存類型,預設值為空 (不需要) |
|
TLS 信任儲存密碼,預設值為空 (不需要) |
|
Pinot 控制器要求的驗證方法。允許的值為 |
|
基本驗證方法的控制器使用者名稱。 |
|
基本驗證方法的控制器密碼。 |
|
Pinot Broker 要求的驗證方法。允許的值為 |
|
基本驗證方法的 Broker 使用者名稱。 |
|
基本驗證方法的 Broker 密碼。 |
|
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
。
工作階段屬性¶
以下的工作階段屬性可用
屬性名稱 |
描述 |
---|---|
|
禁止查詢 Broker。 |
|
禁止 Segment 查詢。 |
|
在資料擷取異常時重試 Pinot 查詢。 |
|
可重試的 Pinot 資料擷取呼叫的重試次數。 |
|
在 Pinot 中使用新的 UDF dateTrunc,它與 Presto 更相容。 |
|
對 Pinot Broker 進行非聚合查詢的最大限制。 |
|
將 order by 下推到 Pinot Broker 以進行頂層查詢。 |
|
每個分割區相同主機的 Segment 數量。 |
|
大型 Segment 的伺服器查詢選擇限制。 |
|
將相異計數函數覆寫為另一個函數名稱。 |
|
在下推 Broker 查詢時,限制 TOP/LIMIT 值。 |
|
基本驗證方法的控制器使用者名稱。 |
|
基本驗證方法的控制器密碼。 |
|
基本驗證方法的 Broker 使用者名稱。 |
|
基本驗證方法的 Broker 密碼。 |
|
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 }
的 PinotTIME
欄位可以對應到DATE
類型。具有 timeGranularity
{ "TimeFormat":"EPOCH", "TimeUnit":"MILLISECONDS", "TimeUnitSize": 1 }
的 PinotTIME
欄位可以對應到TIMESTAMP
類型。具有格式
1:DAYS:EPOCH
的 PinotDATE_TIME
欄位可以對應到DATE
類型。具有格式
1:MILLISECONDS:EPOCH
的 PinotDATE_TIME
欄位可以對應到TIMESTAMP
類型。
有一些組態會控制此行為
pinot.infer-date-type-in-schema
:此組態預設為 false。將其設定為 true 將在可能的情況下,將 PinotTIME
/DATE_TIME
欄位推斷為 Presto 中的DATE
。pinot.infer-timestamp-type-in-schema
:此組態預設為 false。將其設定為 true 將在可能的情況下,將 PinotTIME
/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
綱要項目。
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 中。它可以下推 Pinot 支援的所有內容,包括聚合、group by、所有 UDF 等。它會產生正確的 Pinot 查詢,並將 Pinot 的特性納入考量。
預設情況下,它會將聚合和限制查詢傳送到 Pinot Broker,並針對非聚合/非限制查詢執行平行掃描。Pinot Broker 查詢會建立一個單一分割區,讓 Pinot Broker 執行分散收集。然而,在平行掃描模式下,會針對一或多個 Pinot Segment 建立一個分割區,而且 Presto 伺服器會直接聯絡 Pinot 伺服器 (亦即,Pinot Broker 不會參與平行掃描模式)
有一些組態會控制此行為
pinot.prefer-broker-queries
:此組態預設為 true。將其設定為 false 也會為聚合和限制查詢建立平行計畫。pinot.forbid-segment-queries
:此組態預設為 false。將其設定為 true 將禁止平行查詢,並強制所有查詢都透過 Broker 進行。pinot.non-aggregate-limit-for-broker-queries
:為了防止 Broker 負載過重,連接器只允許針對短
查詢查詢 Pinot Broker。我們將短
查詢定義為聚合 (或 group-by) 查詢,或是限制低於為pinot.non-aggregate-limit-for-broker-queries
設定的值的查詢。此限制的預設值為 25K 列。