我仍然试图在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)
答案 0 :(得分:1)
遗憾的是,COPY命令在C * 2.1之前并不是非常高效,因此它偶尔会遇到问题。您收到的特定错误是因为其中一个读取正在执行但结果未在timeout参数中获得。请注意,它确实说它收到了一个响应,这意味着至少有一个节点能够及时响应。这意味着您可以使用较低的一致性级别。
我认为最好的(可扩展的解决方案)是使用像spark这样的东西进行传输。像
这样的东西sc.cassandraTable("firstKeyspace","legacy_table").saveToCassandra("secondKeyspace","otherTable")
另一种解决方案是编写一个简短的驱动程序来为您执行此操作,其中从一个表读取数据并将其写入另一个表。在这里你可以有一个更精细调整的写控制,这样你就可以在重写之前处理ReadTimeouts / WriteTimeouts甚至转换数据。
答案 1 :(得分:1)
只需将SSTables移动到位即可。程序基本上是:
stats
键空间stats
nodetool refresh -- stats legacy_table