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 代理 URL。 |
|
将向下推非聚合段查询返回的行数限制为 2147483647,默认值。 |
|
将向下推代理查询的 TOP/LIMIT 值限制为 10000,默认值。 |
|
与 Pinot 服务器通信的连接超时时间,默认值为 1 分钟。 |
|
Pinot 元数据缓存过期时间,默认值为 2 分钟。 |
|
非数字列的估计字节大小,默认值为 20。 |
|
RPC 服务标题键,默认值为“RPC-Service”。 |
|
RPC 服务调用者标题键,默认值为“RPC-Caller”。 |
|
RPC 服务调用者标题值,默认值为“presto”。 |
|
不允许向下推代理请求,默认值为 false。 |
|
不允许向下推段查询,如果无法向下推代理查询,则会使查询失败,默认值为 false。 |
|
将 REST 代理端点用于 Pinot 代理请求,默认值为 false。 |
|
在 Pinot 中使用新的 UDF dateTrunc 函数,该函数更兼容 Presto,默认值为 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 数据获取调用的重试次数。 |
|
在 Pinot 中使用新的 UDF dateTrunc 函数,该函数更兼容 Presto。 |
|
对 Pinot 代理的非聚合查询的最大限制。 |
|
将 orderBy 下推到 Pinot 代理以进行 top 查询。 |
|
每个拆分的相同主机的段数。 |
|
大型段的服务器查询选择限制。 |
|
将 distinct count 函数覆盖为其他函数名称。 |
|
将向下推代理查询的 TOP/LIMIT 值限制。 |
|
基本身份验证方法的控制器用户名。 |
|
基本身份验证方法的控制器密码。 |
|
基本身份验证方法的代理用户名。 |
|
基本身份验证方法的代理密码。 |
|
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 数据类型 DATE
和 TIMESTAMP
具有时间粒度
{ "TimeFormat":"EPOCH", "TimeUnit":"DAYS", "TimeUnitSize": 1 }
的 PinotTIME
字段可以映射到DATE
类型。具有时间粒度
{ "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 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 行。