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.controller-urls

Pinot 控制器 URL。

pinot.controller-rest-service

Pinot 控制器請求的替代 REST 端點。

pinot.rest-proxy-url

Pinot REST Proxy URL。

pinot.limit-large-for-segment

在向下推送非彙總區段查詢時,限制傳回的列數,預設值為 2147483647。

pinot.topn-large

在向下推送 Broker 查詢時,限制 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

不向下推送 Broker 要求,預設值為 false。

pinot.forbid-segment-queries

不向下推送區段查詢,如果無法向下推送 Broker 查詢,則使查詢失敗,預設值為 false。

pinot.rest-proxy-service-for-query

將 REST Proxy 端點用於 Pinot Broker 要求,預設值為 false。

pinot.use-date-trunc

使用 Pinot 中與 Presto 更相容的新 UDF dateTrunc,預設值為 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 Broker 的非彙總查詢的最大限制,預設值為 25000。

pinot.infer-date-type-in-schema

將 Pinot DAYS epoch 資料行推斷為 Presto DATE 類型,預設值為 true。

pinot.infer-timestamp-type-in-schema

將 Pinot SECONDS epoch 資料行推斷為 Presto TIMESTAMP 類型,預設值為 true。

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

失敗時重試 Pinot 要求,預設值為 true。

pinot.pushdown-topn-broker-queries

允許將查詢模式向下推送至 Broker:彙總 + groupBy + orderBy,預設值為 false。

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

初始化 gRPC 用戶端時的最大輸入訊息位元組數,預設值為 128MB。

pinot.proxy-enabled

Pinot 叢集位於 Proxy 後方,預設值為 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 控制器/Broker 時的額外標頭。例如 k1:v1,k2:v2。

pinot.extra-grpc-metadata

當將基於 gRPC 的 Pinot 要求傳送至 Pinot Broker/伺服器/Proxy 時的額外中繼資料。例如 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 Broker 要求的驗證方法。允許的值為 NONEPASSWORD - 預設值為 NONE,即不驗證。

pinot.broker-authentication-user

基本驗證方法的 Broker 使用者名稱。

pinot.broker-authentication-password

基本驗證方法的 Broker 密碼。

pinot.query-options

Pinot 查詢相關的大小寫敏感選項。例如:skipUpsert:true,enableNullHandling:true

如果 pinot.controller-authentication-type 設定為 PASSWORD,則必須同時設定 pinot.controller-authentication-userpinot.controller-authentication-password

如果 pinot.broker-authentication-type 設定為 PASSWORD,則必須同時設定 pinot.broker-authentication-userpinot.broker-authentication-password

工作階段屬性

以下的工作階段屬性可用

屬性名稱

描述

pinot.forbid_broker_queries

禁止查詢 Broker。

pinot.forbid_segment_queries

禁止 Segment 查詢。

pinot.mark_data_fetch_exceptions_as_retriable

在資料擷取異常時重試 Pinot 查詢。

pinot.retry_count

可重試的 Pinot 資料擷取呼叫的重試次數。

pinot.use_date_trunc

在 Pinot 中使用新的 UDF dateTrunc,它與 Presto 更相容。

pinot.non_aggregate_limit_for_broker_queries

對 Pinot Broker 進行非聚合查詢的最大限制。

pinot.pushdown_topn_broker_queries

將 order by 下推到 Pinot Broker 以進行頂層查詢。

pinot.num_segments_per_split

每個分割區相同主機的 Segment 數量。

pinot.limit_larger_for_segment

大型 Segment 的伺服器查詢選擇限制。

pinot.override_distinct_count_function

將相異計數函數覆寫為另一個函數名稱。

pinot.topn_large

在下推 Broker 查詢時,限制 TOP/LIMIT 值。

pinot.controller_authentication_user

基本驗證方法的控制器使用者名稱。

pinot.controller_authentication_password

基本驗證方法的控制器密碼。

pinot.broker_authentication_user

基本驗證方法的 Broker 使用者名稱。

pinot.broker_authentication_password

基本驗證方法的 Broker 密碼。

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 綱要項目。

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 列。