Cassandra:从一个键空间导出到另一个键空间

时间:2015-02-01 10:26:22

标签: cassandra cql

我仍然试图在Cassandra世界中找到自己的方式,并成功地将一些遗留的东西从MySQL导入到Cassandra的“legacy_imports'密钥空间。

问题是,我的工作版本是在另一个关键空间' stats'而且我想保留“legacy_imports”#39;和我在一起并将其合并到“统计数据”中。同样。 所以这里想要的操作就是将一些表(包括COUNTER表)从一个密钥空间复制到同一节点上的另一个

我尝试COPY ... TO,但我遇到了错误: <ErrorMessage code=0000 [Server error] message="com.google.common.util.concurrent.UncheckedExecutionException: java.lang.RuntimeException: org.apache.cassandra.exceptions.ReadTimeoutException: Operation timed out - received only 1 responses.">

我也试过sstableloader,但我很难用它。我的数据分为2个磁盘,路径如下所示:

/media/disk2/cassandra/data/legacy_imports/log_by_day-1e6b7de0a90111e49471715135b1c904/snapshots/1422680322490-log_by_day/legacy_imports-log_by_day-ka-1-Data.db

当我尝试sstableloader时,在legacy_imports目录中,我得到:

Could not retrieve endpoint ranges: InvalidRequestException(why:No such keyspace: snapshots)

最后如果我只在legacy_imports上做,我得到:

Exception in thread "main" java.lang.NullPointerException at org.apache.cassandra.io.sstable.SSTableLoader.<init>(SSTableLoader.java:71) at org.apache.cassandra.tools.BulkLoader.main(BulkLoader.java:79)

2 个答案:

答案 0 :(得分:1)

遗憾的是,COPY命令在C * 2.1之前并不是非常高效,因此它偶尔会遇到问题。您收到的特定错误是因为其中一个读取正在执行但结果未在timeout参数中获得。请注意,它确实说它收到了一个响应,这意味着至少有一个节点能够及时响应。这意味着您可以使用较低的一致性级别。

我认为最好的(可扩展的解决方案)是使用像spark这样的东西进行传输。像

这样的东西
sc.cassandraTable("firstKeyspace","legacy_table").saveToCassandra("secondKeyspace","otherTable")

另一种解决方案是编写一个简短的驱动程序来为您执行此操作,其中从一个表读取数据并将其写入另一个表。在这里你可以有一个更精细调整的写控制,这样你就可以在重写之前处理ReadTimeouts / WriteTimeouts甚至转换数据。

答案 1 :(得分:1)

只需将SSTables移动到位即可。程序基本上是:

  1. stats键空间
  2. 中创建表格
  3. 将SSTable复制到stats
  4. 下的相应数据目录
  5. nodetool refresh -- stats legacy_table