从CQL导出数据时出现RPC超时错误

时间:2013-09-18 12:35:03

标签: cassandra cql3

我正在尝试使用CQL客户端从cassandra导出数据。列族中包含大约100000行。当我使用COPY TO命令将dta复制到csv文件时,我得到以下rpc_time out错误。

copy mycolfamily to '/root/mycolfamily.csv'
Request did not complete within rpc_timeout.

我正在参加:

[cqlsh 3.1.6 | Cassandra 1.2.8 | CQL spec 3.0.0 | Thrift protocol 19.36.0]

如何增加RPC超时限制?

我尝试在rpc_timeout_in_ms: 20000文件中添加conf/cassandra.yaml(defalut为10000)。但是当我重新启动cassandra时,我得到了:

[root@user ~]# null; Can't construct a java object for tag:yaml.org,2002:org.apache.cassandra.config.Config; exception=Cannot create property=rpc_timeout_in_ms for JavaBean=org.apache.cassandra.config.Config@71bfc4fc; Unable to find property 'rpc_timeout_in_ms' on class: org.apache.cassandra.config.Config
Invalid yaml; unable to start server.  See log for stacktrace.

4 个答案:

答案 0 :(得分:5)

COPY命令当前对SELECT LIMIT 99999999执行相同的操作。因此,当数据增长时,它最终会超时。这是导出功能;

https://github.com/apache/cassandra/blob/trunk/bin/cqlsh#L1524

我在生产上做同样的出口。我正在做的是以下内容;

  • 从表中选择*,其中timeuuid = someTimeuuid limit 10000
  • 将结果集写入csv文件w />>模式
  • 根据上次timeuuid进行下一次选择

您可以通过以下cqlsh命令在cqlsh中管道命令

echo "{$cql}" | /usr/bin/cqlsh -u user -p password localhost 9160 > file.csv

答案 1 :(得分:2)

您可以通过在Datastax Java驱动程序中指定获取大小来使用自动分页。

Statement stmt = new SimpleStatement("SELECT id FROM mycolfamily;"); 
stmt.setFetchSize(500); 
session.execute(stmt); 
for (Row r:result.all()){
    //write to file
}

答案 2 :(得分:1)

几分钟前我遇到了同样的问题然后我找到了CAPTURE并且它有效:

首先开始捕获cqlsh然后运行您的查询,并限制您的选择。

http://www.datastax.com/documentation/cql/3.0/cql/cql_reference/capture_r.html

答案 3 :(得分:0)

导出数据的最佳方法是使用nodetool snapshot选项。这会立即返回,以后可以恢复。唯一的问题是这个导出是每个节点和整个集群。

实施例: nodetool -h localhost -p 7199快照

参见参考: http://docs.datastax.com/en/archived/cassandra/1.1/docs/backup_restore.html#taking-a-snapshot