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 代理 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

将 REST 代理端点用于 Pinot 代理请求,默认值为 false。

pinot.use-date-trunc

在 Pinot 中使用新的 UDF dateTrunc 函数,该函数更兼容 Presto,默认值为 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-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

禁止对代理进行查询。

pinot.forbid_segment_queries

禁止段查询。

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 代理的非聚合查询的最大限制。

pinot.pushdown_topn_broker_queries

将 orderBy 下推到 Pinot 代理以进行 top 查询。

pinot.num_segments_per_split

每个拆分的相同主机的段数。

pinot.limit_larger_for_segment

大型段的服务器查询选择限制。

pinot.override_distinct_count_function

将 distinct count 函数覆盖为其他函数名称。

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 Schema 映射到 Presto Schema

一般来说,将 Pinot Schema 映射到 Presto Schema 非常直接。默认情况下,数据类型映射遵循下表。

Pinot 数据类型

Presto 数据类型

INT

INTEGER

LONG

BIGINT

FLOAT

DOUBLE

DOUBLE

DOUBLE

BYTES

VARBINARY

STRING

VARCHAR

由于 Pinot 将每个字段定义为维度、指标或时间(date_time)字段,因此可以推断 Presto 数据类型 DATETIMESTAMP

  • 具有时间粒度 { "TimeFormat":"EPOCH", "TimeUnit":"DAYS", "TimeUnitSize": 1 } 的 Pinot TIME 字段可以映射到 DATE 类型。

  • 具有时间粒度 { "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 Schema 示例

{
  "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 Schema 示例

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 目录在扁平的 Schema 中暴露所有 Pinot 表。在查询时 Schema 名称无关紧要,但运行 SHOW SCHEMAS 时,将只显示 default 的一个 Schema 条目。

Pinot 目录的名称是你创建的目录文件,不带 .properties 扩展名。

例如,如果你创建了一个名为 mypinotcluster.properties 的文件,可以使用以下命令查看其中的所有表

SHOW TABLES from mypinotcluster.default

或者

SHOW TABLES from mypinotcluster.foo

这两个命令都将列出你的 Pinot 集群中的所有表。这是因为 Pinot 没有 Schema 的概念。

假设你在 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 支持的所有内容都推送到下层,包括聚合、分组、所有 UDF 等。它生成正确的 Pinot 查询,并考虑到 Pinot 的特殊情况。

默认情况下,它将聚合和限制查询发送到 Pinot 代理,并对非聚合/非限制查询执行并行扫描。Pinot 代理查询创建一个单个拆分,让 Pinot 代理执行散射-聚集。而在并行扫描模式下,为一个或多个 Pinot 段创建一个拆分,Presto 服务器直接与 Pinot 服务器联系(即,Pinot 代理不参与并行扫描模式)。

有一些配置控制这种行为。

  • pinot.prefer-broker-queries:此配置默认情况下为 true。将其设置为 false 将为聚合和限制查询创建并行计划。

  • pinot.forbid-segment-queries:此配置默认情况下为 false。将其设置为 true 将禁止并行查询,并强制所有查询通过代理执行。

  • pinot.non-aggregate-limit-for-broker-queries:为了防止代理不堪重负,连接器只允许查询 Pinot 代理的 查询。我们将 查询定义为聚合(或分组)查询或限制小于为 pinot.non-aggregate-limit-for-broker-queries 配置的值的查询。此限制的默认值为 25K 行。