Cassandra 连接器

Cassandra 连接器允许查询存储在 Cassandra 或 ScyllaDB 中的数据。

兼容性

连接器与所有 Cassandra 版本(从 2.1.5 开始)兼容。最新测试的 ScyllaDB 版本是 5.1.11。

配置

要配置 Cassandra 连接器,请创建一个目录属性文件 etc/catalog/cassandra.properties,其中包含以下内容,用 host1,host2 替换用于发现集群拓扑的 Cassandra 节点的逗号分隔列表

connector.name=cassandra
cassandra.contact-points=host1,host2

如果您的 Cassandra 节点没有使用默认端口(9042),您还需要设置 cassandra.native-protocol-port

对于 ScyllaDB,您无需添加任何其他配置。ScyllaDB 默认使用与 Cassandra 相同的端口。只需在 cassandra.contact-points 配置属性中指向 ScyllaDB 节点即可。

多个 Cassandra 或 ScyllaDB 集群

您可以根据需要创建任意数量的目录,因此,如果您有其他 Cassandra(ScyllaDB) 集群,只需将另一个属性文件添加到 etc/catalog 中(确保其以 .properties 结尾)。例如,如果您将属性文件命名为 sales.properties,Presto 将使用配置的连接器创建一个名为 sales 的目录。

配置属性

以下配置属性可用

属性名称

描述

cassandra.contact-points

Cassandra 集群中主机列表,用逗号分隔。Cassandra 驱动程序将使用这些联系点来发现集群拓扑。至少需要一个 Cassandra 主机。

cassandra.native-protocol-port

运行本机客户端协议的 Cassandra 服务器端口(默认值为 9042)。

cassandra.consistency-level

Cassandra 中的 Consistency Levels 指的是用于读写操作的一致性级别。有关 Consistency Levels 的更多信息,请参阅 Cassandra 一致性 文档。此属性默认为 ONE 的一致性级别。可能的取值包括 ALLEACH_QUORUMQUORUMLOCAL_QUORUMONETWOTHREELOCAL_ONEANYSERIALLOCAL_SERIAL

cassandra.allow-drop-table

设置为 true 以允许通过 Presto 中的 DROP TABLE 删除 Cassandra 表(默认为 false)。

cassandra.username

用于对 Cassandra 集群进行身份验证的用户名。这是一个全局设置,用于所有连接,而不管连接到 Presto 的用户是谁。

cassandra.password

用于对 Cassandra 集群进行身份验证的密码。这是一个全局设置,用于所有连接,而不管连接到 Presto 的用户是谁。

cassandra.protocol-version

可以覆盖旧版 Cassandra 集群的协议版本。此属性默认为 V3。可能的取值包括 V2V3V4

注意

如果启用了授权,则 cassandra.username 必须拥有足够的权限才能在 system.size_estimates 表上执行 SELECT 查询。

以下高级配置属性可用

属性名称

描述

cassandra.fetch-size

在 Cassandra 查询中一次获取的行数。

cassandra.partition-size-for-batch-select

将单个分区键列表中的分区批量组合到单个选择中的数量。

cassandra.split-size

查询 Cassandra 时每个拆分的键数。

cassandra.splits-per-node

每个节点的拆分数量。默认情况下,将使用来自 system.size_estimates 表的值。仅在连接到 Cassandra 版本 < 2.1.5 时覆盖,该版本缺少 system.size_estimates 表。

cassandra.client.read-timeout

Cassandra 驱动程序等待 Cassandra 节点查询响应的最长时间。请注意,底层 Cassandra 驱动程序可能会在读超时的情况下对多个节点重试查询。增加此值可能有助于使用索引的查询。

cassandra.client.connect-timeout

Cassandra 驱动程序建立与 Cassandra 节点连接的最长时间。增加此值可能有助于负载很高的 Cassandra 集群。

cassandra.client.so-linger

如果未发送的数据排队,则关闭时延迟的秒数。如果设置为零,则套接字将立即关闭。当此选项不为零时,套接字将延迟这么多秒,以获取对所有数据已写入对等方的确认。此选项可用于避免在不再需要连接时立即关闭连接,从而在 Cassandra 服务器上消耗套接字。

cassandra.retry-policy

用于重试对 Cassandra 的失败请求的策略。此属性默认为 DEFAULT。使用 BACKOFF 可能有助于在查询失败并显示“没有足够的副本”时。其他可能的取值是 DOWNGRADING_CONSISTENCYFALLTHROUGH

cassandra.load-policy.use-dc-aware

设置为 true 以使用 DCAwareRoundRobinPolicy(默认为 false)。

cassandra.load-policy.dc-aware.local-dc

用于 DCAwareRoundRobinPolicy 的本地数据中心的名称。

cassandra.load-policy.dc-aware.used-hosts-per-remote-dc

使用每个远程数据中心提供的主机数量作为本地主机的故障转移,用于 DCAwareRoundRobinPolicy

cassandra.load-policy.dc-aware.allow-remote-dc-for-local

设置为 true 以允许使用远程数据中心的主机来实现本地一致性级别。

cassandra.load-policy.use-token-aware

设置为 true 以使用 TokenAwarePolicy(默认为 false)。

cassandra.load-policy.shuffle-replicas

设置为 true 以使用带有副本混洗的 TokenAwarePolicy(默认为 false)。

cassandra.load-policy.use-white-list

设置为 true 以使用 WhiteListPolicy(默认为 false)。

cassandra.load-policy.white-list.addresses

逗号分隔的 WhiteListPolicy 主机列表。

cassandra.no-host-available-retry-timeout

针对 NoHostAvailableException 的重试超时时间(默认为 1m)。

cassandra.speculative-execution.limit

推测执行的次数(默认为 1)。

cassandra.speculative-execution.delay

每次推测执行之间的延迟(默认为 500ms)。

cassandra.tls.enabled

是否启用 TLS 安全(默认为 false)。

cassandra.tls.keystore-path

PEM 或 JKS 密钥库的路径。

cassandra.tls.truststore-path

PEM 或 JKS 信任库的路径。

cassandra.tls.keystore-password

密钥库的密码。

cassandra.tls.truststore-password

信任库的密码。

查询 Cassandra 或 ScyllaDB 表格

users 表是 Cassandra 入门指南 中的示例 Cassandra 表格。可以使用 Cassandra 的 cqlsh(CQL 交互式终端)与 mykeyspace keyspace 一起创建该表格

cqlsh> CREATE KEYSPACE mykeyspace
   ... WITH REPLICATION = { 'class' : 'SimpleStrategy', 'replication_factor' : 1 };
cqlsh> USE mykeyspace;
cqlsh:mykeyspace> CREATE TABLE users (
              ...   user_id int PRIMARY KEY,
              ...   fname text,
              ...   lname text
              ... );

该表格可以在 Presto 中进行描述

DESCRIBE cassandra.mykeyspace.users;
 Column  |  Type   | Extra | Comment
---------+---------+-------+---------
 user_id | bigint  |       |
 fname   | varchar |       |
 lname   | varchar |       |
(3 rows)

然后,可以在 Presto 中查询该表格

SELECT * FROM cassandra.mykeyspace.users;

数据类型

数据类型映射如下所示

Cassandra

Presto

ASCII

VARCHAR

BIGINT

BIGINT

BLOB

VARBINARY

BOOLEAN

BOOLEAN

DECIMAL

DOUBLE

DOUBLE

DOUBLE

FLOAT

REAL

INET

VARCHAR(45)

INT

INTEGER

LIST<?>

VARCHAR

MAP<?, ?>

VARCHAR

SET<?>

VARCHAR

TEXT

VARCHAR

TIMESTAMP

TIMESTAMP

TIMEUUID

VARCHAR

VARCHAR

VARCHAR

VARINT

VARCHAR

SMALLINT

INTEGER

TINYINT

INTEGER

DATE

DATE

任何集合(LIST/MAP/SET)都可以被指定为 FROZEN,并且其值映射到 VARCHAR。此外,blob 存在不能为空的限制。

表格中未提到的类型不支持(例如,元组或 UDT)。

分区键只能以下列类型存在

  • ASCII

  • TEXT

  • VARCHAR

  • BIGINT

  • BOOLEAN

  • DOUBLE

  • INET

  • INT

  • FLOAT

  • DECIMAL

  • TIMESTAMP

  • UUID

  • TIMEUUID

  • SMALLINT

  • TINYINT

  • DATE

限制

  • 不包含分区键的筛选器查询会导致获取所有分区。这会导致对整个数据集进行完全扫描,因此与包含分区键作为筛选器的类似查询相比,速度要慢得多。

  • IN 列表筛选器只能应用于索引(即分区键或聚簇键)列。

  • 范围(<>BETWEEN)筛选器只能应用于分区键。