Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cassandra SELECT DISTINCT和超时问题_Cassandra_Cql_Cqlsh - Fatal编程技术网

Cassandra SELECT DISTINCT和超时问题

Cassandra SELECT DISTINCT和超时问题,cassandra,cql,cqlsh,Cassandra,Cql,Cqlsh,运行以下CQL查询时: SELECT DISTINCT partition_key FROM table_name; 这可能意味着返回给定表正在使用的分区键列表。但是,默认超时设置为10秒时,它总是超时: ReadTimeout: Error from server: code=1200 [Coordinator node timed out waiting for replica nodes' responses] message="Operation timed out - receive

运行以下CQL查询时:

SELECT DISTINCT partition_key FROM table_name;
这可能意味着返回给定表正在使用的分区键列表。但是,默认超时设置为10秒时,它总是超时:

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节点崩溃,包括协调器节点。该表大约有>100M行,其中包含大约5000个唯一分区键


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

有另一种方法可以使用以下任一实用程序获取键列表:

sstabledump -e 
     OR
$ bin/sstablekeys <sstable_name>
sstabledump-e
或
$bin/sstablekeys
但您需要在所有节点数据目录中运行它们,并手动筛选不同的密钥。不是直截了当的,而是可行的

以下是实用程序和应用程序的参考

查询超时的原因是

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

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

    sstabledump -e 
         OR
    $ bin/sstablekeys <sstable_name>
    
    sstabledump-e
    或
    $bin/sstablekeys
    
    但您需要在所有节点数据目录中运行它们,并手动筛选不同的密钥。不是直截了当的,而是可行的

    以下是实用程序和应用程序的参考

    查询超时的原因是

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

  • 假设您使用的客户端支持分页/获取大小,并且使用足够低的获取大小(实际限制取决于您的服务器负载),则此查询在现代版本的cassandra(2.1及更新版本)上应该可以正常工作

    使用第三方驱动程序,查找删除页面/获取大小的选项。将其设置为100,然后查看其性能是否更好


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

    假设您使用的客户端支持分页/获取大小,并且使用足够低的获取大小(实际限制取决于您的服务器负载),则此查询在现代版本的cassandra(2.1及更新版本)上应能正常工作

    使用第三方驱动程序,查找删除页面/获取大小的选项。将其设置为100,然后查看其性能是否更好


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

    这看起来确实很违反直觉。Cassandra是为大规模而设计的,所以如果它不支持大规模表,为什么还要添加这个特性呢?SELECT DISTINCT适用于小桌子,但当一个人开始缩放它时,它会断裂,我认为这与Cassandra背后的理念背道而驰。如果我们有一个用户表,并且开始扩展,那么就没有简单的方法来运行CQL查询并获取整个用户列表了吗?肯定有办法。@Onst Cassandra不是什么都能拿到的。它是关于按键查找的。任何分布式系统都是如此。通过分区进行水平扩展,在扩展过程中查询所有内容变得越来越痛苦。这看起来确实很违反直觉。Cassandra是为大规模而设计的,所以如果它不支持大规模表,为什么还要添加这个特性呢?SELECT DISTINCT适用于小桌子,但当一个人开始缩放它时,它会断裂,我认为这与Cassandra背后的理念背道而驰。如果我们有一个用户表,并且开始扩展,那么就没有简单的方法来运行CQL查询并获取整个用户列表了吗?肯定有办法。@Onst Cassandra不是什么都能拿到的。它是关于按键查找的。任何分布式系统都是如此。通过分区进行水平扩展,在扩展时查询所有内容变得越来越痛苦。谢谢,在运行查询之前设置分页100在cqlsh中起作用。谢谢,在运行查询之前设置分页100在cqlsh中起作用。