代码之家  ›  专栏  ›  技术社区  ›  Onst

Cassandra SELECT DISTINCT和超时问题

  •  0
  • Onst  · 技术社区  · 8 年前

    运行以下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
    

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

    2 回复  |  直到 8 年前
        1
  •  1
  •   Jeff Jirsa    8 年前

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

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

        2
  •  1
  •   dilsingi    8 年前

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

    sstabledump -e 
         OR
    $ bin/sstablekeys <sstable_name>
    

    但您需要跨所有节点数据目录运行它们,并手动筛选不同的密钥。不直接但可行!

    以下是实用程序的参考 Cassandra SSTabledump Cassandra SSTablekeys

    查询超时的原因是

    1. 查询中没有where子句
    2. Coordinator现在必须保持查询打开,直到从集群中的每个节点获得响应,然后过滤不同的。
    3. 对于这个用例来说,distinct操作的成本太高。
    4. 节点崩溃是因为它们基本上用所选的整行填充堆,并导致OutOfMemory(OOM错误)
    推荐文章