Cassandra ByteOrderedPartitioner
Cassandra ByteOrderedPartitioner
我想对结构如下的 table 执行一些范围查询:
CREATE TABLE table(
num int,
val1 int,
val2 float,
val3 text,
...
PRIMARY KEY(num)
)
范围查询应如下所示:
SELECT num, val1, val2 FROM table WHERE num>100 AND num<1000;
我阅读了 post: Performing range queries for cassandra table,但现在我在使用 ByteOrderedPartitoner 时遇到了问题。
我使用 OPSCenter Web 界面并尝试创建一个新集群。我更改分区程序并出现以下错误:
配置集群时出错:当不使用 RandomPartitioner 或 Murmur3Partitioner
时,需要 {ip:token} 形式的 token_map 参数
我找不到 token_map 参数。我究竟做错了什么?我还需要做什么才能启用查询?
我希望有人能帮助我。谢谢!
What am I doing wrong?
您正在使用字节有序分区程序。它的使用已被确定为 Cassandra anti-pattern... 一段时间了。 Matt Dennis 有一个 slideshare presentation on Cassandra Anti-Patterns,它包含一张关于 BOP 的幻灯片:
所以虽然上面的幻灯片是为了幽默,但严重的是,不要使用 Byte Ordered Partitioner。它仍然包含在 Cassanra 中,因此那些在 2011 年使用过它的人有一个升级路径。 不应使用 BOP 构建新集群。您应该使用(默认)Murmur3 分区程序。
至于如何解决您的 Murmur3 分区程序问题,您上面链接的 question/answer 参考了 Patrick McFadin 在 Getting Started With Time Series Data Modeling 上的文章。在那篇文章中,演示了三种建模模式。他们应该能够帮助您提出合适的数据模型。基本上,您可以使用聚类键对数据进行排序,然后使用范围查询读取它...只是不是通过 current 分区键。
CREATE TABLE tableorderedbynum(
num int,
val1 int,
val2 float,
val3 text,
someotherkey text,
...
PRIMARY KEY((someotherkey),num)
);
检查您的数据模型,看看是否可以找到另一个键来帮助对数据进行分区。然后,如果您创建一个查询 table(就像我上面那样),使用另一个键作为您的分区键,并将 num 作为您的集群键;那么这个范围查询将起作用:
SELECT num, val1, val2
FROM tableorderedbynum WHERE someotherkey='yourvalue' AND num>100 AND num<1000;
使用Byte Order Partitioner在Cassandra中肯定是一种反模式,但如果你仍然想继续使用它,那么你可以使用令牌函数实现分区键的范围查询的上述功能。
SELECT num, val1, val2 FROM tableorderedbynum WHERE someotherkey = 'yourvalue' AND
token(num) > token(100) AND token(num) < token(1000);
请注意,在使用 Random Partitioner 或 Murmur3 Partitioner 时,类似的查询将无法提供所需的结果,因为令牌不是按顺序生成的,而是随机生成的。
我想对结构如下的 table 执行一些范围查询:
CREATE TABLE table(
num int,
val1 int,
val2 float,
val3 text,
...
PRIMARY KEY(num)
)
范围查询应如下所示:
SELECT num, val1, val2 FROM table WHERE num>100 AND num<1000;
我阅读了 post: Performing range queries for cassandra table,但现在我在使用 ByteOrderedPartitoner 时遇到了问题。
我使用 OPSCenter Web 界面并尝试创建一个新集群。我更改分区程序并出现以下错误:
配置集群时出错:当不使用 RandomPartitioner 或 Murmur3Partitioner
时,需要 {ip:token} 形式的 token_map 参数我找不到 token_map 参数。我究竟做错了什么?我还需要做什么才能启用查询?
我希望有人能帮助我。谢谢!
What am I doing wrong?
您正在使用字节有序分区程序。它的使用已被确定为 Cassandra anti-pattern... 一段时间了。 Matt Dennis 有一个 slideshare presentation on Cassandra Anti-Patterns,它包含一张关于 BOP 的幻灯片:
所以虽然上面的幻灯片是为了幽默,但严重的是,不要使用 Byte Ordered Partitioner。它仍然包含在 Cassanra 中,因此那些在 2011 年使用过它的人有一个升级路径。 不应使用 BOP 构建新集群。您应该使用(默认)Murmur3 分区程序。
至于如何解决您的 Murmur3 分区程序问题,您上面链接的 question/answer 参考了 Patrick McFadin 在 Getting Started With Time Series Data Modeling 上的文章。在那篇文章中,演示了三种建模模式。他们应该能够帮助您提出合适的数据模型。基本上,您可以使用聚类键对数据进行排序,然后使用范围查询读取它...只是不是通过 current 分区键。
CREATE TABLE tableorderedbynum(
num int,
val1 int,
val2 float,
val3 text,
someotherkey text,
...
PRIMARY KEY((someotherkey),num)
);
检查您的数据模型,看看是否可以找到另一个键来帮助对数据进行分区。然后,如果您创建一个查询 table(就像我上面那样),使用另一个键作为您的分区键,并将 num 作为您的集群键;那么这个范围查询将起作用:
SELECT num, val1, val2
FROM tableorderedbynum WHERE someotherkey='yourvalue' AND num>100 AND num<1000;
使用Byte Order Partitioner在Cassandra中肯定是一种反模式,但如果你仍然想继续使用它,那么你可以使用令牌函数实现分区键的范围查询的上述功能。
SELECT num, val1, val2 FROM tableorderedbynum WHERE someotherkey = 'yourvalue' AND
token(num) > token(100) AND token(num) < token(1000);
请注意,在使用 Random Partitioner 或 Murmur3 Partitioner 时,类似的查询将无法提供所需的结果,因为令牌不是按顺序生成的,而是随机生成的。