Cassandra SELECT DISTINCT 和超时问题

Cassandra SELECT DISTINCT and timeout issue

当运行以下CQL查询时:

SELECT DISTINCT partition_key FROM table_name;

这应该是 return 用于给定 table 的分区键列表。但是默认超时设置为10s,总是超时:

ReadTimeout: Error from server: code=1200 [Coordinator node timed out waiting for replica nodes' responses] message="Operation timed out - received only 0 responses." info={'received_responses': 0, 'required_responses': 1, 'consistency': 'ONE'}

将超时设置更改为:

read_request_timeout_in_ms: 60000
range_request_timeout_in_ms: 60000
request_timeout_in_ms: 60000

然后 运行 表示查询导致多个 Cassandra 节点崩溃,包括协调器节点。 table 有大约 >100M 行和大约 5000 个唯一分区键。

是否有找到唯一的分区键列表的解决方法?

还有另一种使用以下任一实用程序获取密钥列表的方法:

sstabledump -e 
     OR
$ bin/sstablekeys <sstable_name>

但是您需要 运行 它们跨所有节点数据目录并手动过滤不同的键。不直接但可行!

这是实用程序的参考 Cassandra SSTabledump and Cassandra SSTablekeys

查询超时的原因是

  1. 查询中没有 where 子句
  2. 要扫描的行太多 > 100M
  3. 协调器现在必须保持查询打开,直到从集群中的每个节点获得响应,然后过滤不同的。
  4. distinct 操作对于这个用例来说成本太高了。
  5. 节点崩溃,因为基本上它们填满了整个堆被选中的行并导致 OutOfMemory(OOM 错误)

假定您使用的客户端支持 paging/fetch-size,并且使用足够低的提取大小(实际限制取决于您的服务器负载)。

使用第三方驱动程序,寻找一个选项来降低 page/fetch 大小。将它设置为 100,看看它是否表现更好。

使用 cqlsh,如果您有 cassandra 3.0 或更新版本,请尝试 PAGING 100;