Cassandra超时cqlsh查询大量数据

28

我正在进行一个学生项目,涉及构建和查询Cassandra数据集群。

当我的集群负载比较轻(约30GB)时,我的查询可以正常运行,但现在它变得相当庞大(1/2TB),我的查询超时。

我曾想到这个问题可能会出现,所以在生成和加载测试数据之前,我已经在我的cassandra.yaml文件中更改了以下数值:

request_timeout_in_ms (默认值为10000)其他杂项操作的默认超时时间。

然而,当我将该值更改为1000000时,Cassandra似乎在启动时挂起了——但这可能只是超大超时的作用。

我的数据生成目标为2TB。如何查询如此大的空间而不遇到超时问题?

查询:

SELECT  huntpilotdn 
FROM    project.t1 
WHERE   (currentroutingreason, orignodeid, origspan,  
        origvideocap_bandwidth, datetimeorigination)
        > (1,1,1,1,1)
AND      (currentroutingreason, orignodeid, origspan,    
         origvideocap_bandwidth, datetimeorigination)
         < (1000,1000,1000,1000,1000)
LIMIT 10000
ALLOW FILTERING;

SELECT  destcause_location, destipaddr
FROM    project.t2
WHERE   datetimeorigination = 110
AND     num >= 11612484378506
AND     num <= 45880092667983
LIMIT 10000;


SELECT  origdevicename, duration
FROM    project.t3
WHERE   destdevicename IN ('a','f', 'g')
LIMIT 10000
ALLOW FILTERING;

我有一个演示键空间,其模式与实际使用的键空间相同,但数据规模要小得多(约为10GB),在该键空间中,这些查询运行得非常好。

所有被查询的表都有数百万行,每行大约有30列。


你能发一下你的查询示例吗? - Aaron
4个回答

67
如果您正在使用Datastax的,则可以通过命令行参数指定客户端超时秒数。默认值为10

$ cqlsh --request-timeout=3600

Datastax文档


7
即使使用cassandra.yml中定义的read_request_timeout_in_ms设置,count(*)查询似乎仍然会失败,而不考虑cli参数。 - xref
1
这不适用于SELECT查询,请参见https://docs.datastax.com/en/dse/5.1/cql/cql/cql_reference/cqlsh_commands/cqlsh.html。 - adinas

23
我猜你也在使用二级索引。你亲身体验到了为什么不推荐使用二级索引查询和ALLOW FILTERING查询,因为这些设计模式对于大型数据集来说无法扩展。使用支持主键查找的查询表重建你的模型,因为这就是Cassandra设计的工作方式。
“受限制的变量是群集密钥。”
是的...这意味着它们不是分区键。如果没有限制你的分区键,那么基本上就在扫描整个表,因为聚簇键仅在其分区键内有效(聚簇数据)。
因此,虽然我可能已经得到了“接受”的答案,但我可以看到这里有三个额外的答案。它们都侧重于更改查询超时时间,其中两个超过了我的答案(一个相当多)。
随着这个问题继续累积页面浏览量,我感到有必要解决增加超时时间方面的问题。现在,我不会downvote任何人的答案,因为这看起来像是投票方面的“酸葡萄”。但是我可以说明为什么我认为这解决不了问题。
首先,查询超时的事实只是一个症状;它不是主要问题。因此,增加查询超时时间只是一个止血措施,掩盖了主要问题。
当然,主要问题在于,OP试图强制集群支持与基础数据模型不匹配的查询。只要忽略这个问题并进行解决方案(而不是直接处理),这个问题就会继续出现。
其次,看看OP实际上想做什么:我的数据生成目标是2TB。如何查询那么大的空间,而不会遇到超时?那些查询超时限制是为了保护你的集群。如果你要通过2TB的数据运行全表扫描(即对Cassandra进行完全集群扫描),那么超时阈值将非常大。实际上,如果你确实找到了正确的数字来允许这样做,那么在大部分数据被汇集到结果集中之前,你的协调节点会崩溃。
总之,增加查询超时时间:
  1. 看起来像是“有所帮助”,但实际上违背了Cassandra设计的初衷。
  2. 可能会导致节点崩溃,从而危及底层集群的稳定性。
因此,增加查询超时时间是一个可怕的,极其糟糕的想法

我并没有使用二级索引。被限制的变量是集群键。当我设置limit < 5时,查询就会完成。你有什么更多的想法可以让查询在大于5的限制下完成吗?编辑:我正在使用cqlsh查询我的数据库,你认为我应该编写一个应用程序来处理这些查询吗? - slmyers
4
受限制的变量是群集键。这意味着它们不是分区键。如果没有限制分区键,那么基本上是在扫描整个表格,因为群集键只能在其分区键内聚集数据。 - Aaron
当我想要检查数据是否存在于Cassandra中(作为调试过程的一部分),并且我正在手动检查时,超时是我最不关心的问题,我不介意它运行一个小时。 - undefined

9

要更改在Apache Cassandra中的客户端超时限制,有两种技术:

技术1:这是一个好的技术:

1. Navigate to the following hidden directory under the home folder: (Create the hidden directory if not available)

    $ pwd
    ~/.cassandra


2. Modify the file cqlshrc in it to an appropriate time in seconds: (Create the file if not available)

    Original Setting:

        $ more cqlshrc
        [connection]
        client_timeout = 10
        # Can also be set to None to disable:
        # client_timeout = None
        $

    New Setting:

        $ vi cqlshrc
        $ more cqlshrc
        [connection]
        client_timeout = 3600
        # Can also be set to None to disable:
        # client_timeout = None
        $

    Note: Here time is in seconds. Since, we wanted to increase the timeout to one hour. Hence, we have set it to 3600 seconds.

技巧2:这不是一个好的技巧,因为你正在更改客户端程序(cqlsh)本身的设置。 注意:如果你已经使用技巧1进行了更改,则它将覆盖使用技巧2指定的时间。因为配置文件设置具有最高优先级。

1. Navigate to the path where cqlsh program is located. This you can find using the which command:

    $ which cqlsh
    /opt/apache-cassandra-2.1.9/bin/cqlsh
    $ pwd
    /opt/apache-cassandra-2.1.9/bin
    $ ls -lrt cqlsh
    -rwxr-xr-x 1 abc abc 93002 Nov  5 12:54 cqlsh


2. Open the program cqlsh and modify the time specified using the client_timeout variable. Note that time is specified in seconds.
$ vi cqlsh

In __init__ function:
    def __init__(self, hostname, port, color=False,
                 username=None, password=None, encoding=None, stdin=None, tty=True,
                 completekey=DEFAULT_COMPLETEKEY, use_conn=None,
                 cqlver=DEFAULT_CQLVER, keyspace=None,
                 tracing_enabled=False, expand_enabled=False,
                 display_time_format=DEFAULT_TIME_FORMAT,
                 display_float_precision=DEFAULT_FLOAT_PRECISION,
                 max_trace_wait=DEFAULT_MAX_TRACE_WAIT,
                 ssl=False,
                 single_statement=None,
                 client_timeout=10,
                 connect_timeout=DEFAULT_CONNECT_TIMEOUT_SECONDS):

In options.client_timeout setting:
    options.client_timeout = option_with_default(configs.get, 'connection', 'client_timeout', '10')

You can modify at both these places. The second line picks up client_timeout information from the cqlshrc file.

2
  1. 在cassandra.yaml文件中增加read_request_timeout_in_sec的时间

  2. 修改cqlsh.py程序,改变变量值而不是在函数中进行更改。 DEFAULT_REQUEST_TIMEOUT_SECONDS=100 DEFAULT_CONNECT_TIMEOUT_SECONDS=100

这肯定有效。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接