【问题标题】:Cassandra timeout cqlsh query large(ish) amount of dataCassandra超时cqlsh查询大量(ish)数据
【发布时间】:2015-06-08 20:35:45
【问题描述】:

我正在做一个涉及构建和查询 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 列。

【问题讨论】:

  • 您能发布一个查询示例吗?

标签: cassandra timeout cqlsh


【解决方案1】:

如果您使用 Datastax cqlsh,那么您可以将客户端超时秒数指定为命令行参数。默认为10。

$ cqlsh --request-timeout=3600

Datastax Documentation

【讨论】:

【解决方案2】:

我猜你也在使用二级索引。您将直接了解为什么不建议使用二级索引查询和 ALLOW FILTERING 查询……因为这些类型的设计模式不适用于大型数据集。使用支持主键查找的查询表重建您的模型,这就是 Cassandra 的工作原理。

编辑

“受约束的变量是簇键。”

对...这意味着它们不是分区键。在不限制分区键的情况下,您基本上是在扫描整个表,因为集群键仅在其分区键内有效(集群数据)。

编辑 20190731

所以虽然我可以得到“接受”的答案,但我可以看到这里还有三个额外的答案。他们都专注于更改查询超时,其中两个超过了我的答案(一个相当多)。

随着这个问题不断增加页面浏览量,我觉得有必要解决增加超时的问题。现在,我不打算否决任何人的答案,因为从投票的角度来看,这看起来像是“酸葡萄”。但我可以清楚地说明为什么我觉得这不能解决任何问题。

首先,查询超时是一个症状;这不是主要问题。因此,增加查询超时只是一个临时解决方案,掩盖了主要问题。

主要问题当然是,OP 试图强制集群支持与底层数据模型不匹配的查询。只要忽略此问题并采取变通方法(而不是直接处理),此问题就会继续显现。

其次,看看 OP 到底在做什么:

我的数据生成目标是 2TB。如何在不超时的情况下查询这么大的空间?

这些查询超时限制是为了保护您的集群。如果您要对 2TB 的数据运行全表扫描(这意味着对 Cassandra 的全集群扫描),那么超时阈值将非常大。事实上,如果您确实设法找到了允许这样做的正确数字,那么您的协调节点会在大部分数据组装到结果集中之前倾倒LONG。

总之,增加查询超时:

  1. 通过强制 Cassandra 违背其设计方式来提供“帮助”的外观。

  2. 可能会导致节点崩溃,从而危及底层集群的稳定性。

因此,增加查询超时是一个可怕的可怕的想法。

【讨论】:

  • 我根本没有使用secondary indexes。受约束的变量是cluster keys。当我设置 limit
  • @slmyers “受约束的变量是集群键。”对...这意味着它们不是分区键。在不限制分区键的情况下,您基本上是在扫描整个表,因为集群键仅在其分区键内聚集数据。
【解决方案3】:

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

技巧一:这是个好技巧:

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.

【讨论】:

    【解决方案4】:
    1. 增加 cassandra.yaml 文件中的 read_request_timeout_in_sec

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

    确实有效

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-02-20
      • 2015-08-25
      • 1970-01-01
      • 2018-07-10
      • 2020-01-13
      • 2015-12-03
      • 2015-03-02
      • 2014-10-21
      相关资源
      最近更新 更多