Cassandra超时cqlsh查询大量(ish)数据
Cassandra timeout cqlsh query large(ish) amount of data
我正在做一个涉及构建和查询 Cassandra 数据集群的学生项目。
当我的集群负载很轻(大约 30GB)时,我的查询 运行 没有问题,但现在它更大了(1/2TB),我的查询超时了。
我认为可能会出现这个问题,所以在我开始生成和加载测试数据之前,我在 cassandra.yaml 文件中更改了这个值:
request_timeout_in_ms
(Default: 10000 ) The default timeout for other, miscellaneous operations.
但是,当我将该值更改为 1000000 时,cassandra 似乎在启动时挂起——但这可能只是工作中的长时间超时。
我的数据生成目标是 2TB。如何查询那么大的 space 而不会 运行 超时?
查询:
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;
我有一个具有相同模式的演示密钥space,但数据大小要小得多(~10GB),这些查询运行在该密钥space中很好用。
所有这些查询的表都有数百万行,每行大约 30 列。
我猜你也在使用二级索引。您将直接了解为什么不推荐二级索引查询和允许过滤查询……因为这些类型的设计模式无法扩展到大型数据集。使用支持主键查找的查询 table 重建您的模型,因为这就是 Cassandra 设计的工作方式。
编辑
"The variables that are constrained are cluster keys."
对...这意味着它们不是分区键。在不限制分区键的情况下,您基本上是在扫描整个 table,因为集群键仅在其分区键内有效(集群数据)。
编辑 20190731
所以虽然我可能有 "accepted" 答案,但我可以看到这里还有三个额外的答案。他们都专注于更改查询超时,其中有两个比我的答案高出很多(一个相当多)。
随着这个问题不断增加页面浏览量,我觉得有必要解决增加超时的问题。现在,我不打算 否决 任何人的答案,因为从投票的角度来看,这看起来像 "sour grapes"。但我可以说清楚 为什么 我觉得这解决不了任何问题。
首先,查询超时是一个症状;这不是主要问题。因此,增加查询超时时间只是一个创可贴解决方案,掩盖了主要问题。
当然,主要问题是,OP 试图强制集群支持与底层数据模型不匹配的查询。只要忽略此问题并采取变通办法(而不是直接处理),此问题就会继续出现。
其次,看看 OP 实际要做什么:
My goal for data generation is 2TB. How do I query that large of space without running into timeouts?
这些查询超时限制是为了保护您的集群。如果您要通过 2TB 的数据 运行 全 table 扫描(这意味着对 Cassandra 的全集群扫描),该超时阈值将非常大。事实上,如果您确实设法找到了允许这样做的正确数字,那么您的协调器节点会在大多数数据被组装到结果集中之前翻倒 LONG。
总而言之,增加查询超时:
通过强制 Cassandra 违背它的设计方式给出 "helping" 的外观。
可能会导致节点崩溃,从而危及底层集群的稳定性。
因此,增加查询超时是一个糟糕的、糟糕的想法。
要更改 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.
如果您使用的是 Datastax cqlsh
,那么您可以将客户端超时秒数指定为命令行参数。默认为 10
.
$ cqlsh --request-timeout=3600
在cassandra.yaml文件中增加read_request_timeout_in_sec
修改cqlsh.py程序并更改变量值而不是在函数中更改。
DEFAULT_REQUEST_TIMEOUT_SECONDS=100
DEFAULT_CONNECT_TIMEOUT_SECONDS=100
肯定有效
我正在做一个涉及构建和查询 Cassandra 数据集群的学生项目。
当我的集群负载很轻(大约 30GB)时,我的查询 运行 没有问题,但现在它更大了(1/2TB),我的查询超时了。
我认为可能会出现这个问题,所以在我开始生成和加载测试数据之前,我在 cassandra.yaml 文件中更改了这个值:
request_timeout_in_ms (Default: 10000 ) The default timeout for other, miscellaneous operations.
但是,当我将该值更改为 1000000 时,cassandra 似乎在启动时挂起——但这可能只是工作中的长时间超时。
我的数据生成目标是 2TB。如何查询那么大的 space 而不会 运行 超时?
查询:
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;
我有一个具有相同模式的演示密钥space,但数据大小要小得多(~10GB),这些查询运行在该密钥space中很好用。
所有这些查询的表都有数百万行,每行大约 30 列。
我猜你也在使用二级索引。您将直接了解为什么不推荐二级索引查询和允许过滤查询……因为这些类型的设计模式无法扩展到大型数据集。使用支持主键查找的查询 table 重建您的模型,因为这就是 Cassandra 设计的工作方式。
编辑
"The variables that are constrained are cluster keys."
对...这意味着它们不是分区键。在不限制分区键的情况下,您基本上是在扫描整个 table,因为集群键仅在其分区键内有效(集群数据)。
编辑 20190731
所以虽然我可能有 "accepted" 答案,但我可以看到这里还有三个额外的答案。他们都专注于更改查询超时,其中有两个比我的答案高出很多(一个相当多)。
随着这个问题不断增加页面浏览量,我觉得有必要解决增加超时的问题。现在,我不打算 否决 任何人的答案,因为从投票的角度来看,这看起来像 "sour grapes"。但我可以说清楚 为什么 我觉得这解决不了任何问题。
首先,查询超时是一个症状;这不是主要问题。因此,增加查询超时时间只是一个创可贴解决方案,掩盖了主要问题。
当然,主要问题是,OP 试图强制集群支持与底层数据模型不匹配的查询。只要忽略此问题并采取变通办法(而不是直接处理),此问题就会继续出现。
其次,看看 OP 实际要做什么:
My goal for data generation is 2TB. How do I query that large of space without running into timeouts?
这些查询超时限制是为了保护您的集群。如果您要通过 2TB 的数据 运行 全 table 扫描(这意味着对 Cassandra 的全集群扫描),该超时阈值将非常大。事实上,如果您确实设法找到了允许这样做的正确数字,那么您的协调器节点会在大多数数据被组装到结果集中之前翻倒 LONG。
总而言之,增加查询超时:
通过强制 Cassandra 违背它的设计方式给出 "helping" 的外观。
可能会导致节点崩溃,从而危及底层集群的稳定性。
因此,增加查询超时是一个糟糕的、糟糕的想法。
要更改 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.
如果您使用的是 Datastax cqlsh
,那么您可以将客户端超时秒数指定为命令行参数。默认为 10
.
$ cqlsh --request-timeout=3600
在cassandra.yaml文件中增加read_request_timeout_in_sec
修改cqlsh.py程序并更改变量值而不是在函数中更改。 DEFAULT_REQUEST_TIMEOUT_SECONDS=100 DEFAULT_CONNECT_TIMEOUT_SECONDS=100
肯定有效