Cassandra:从一个keyspace导出到另一个keyspace

3

我仍在尝试适应Cassandra的世界,我成功地将一些遗留问题从MySQL导入到了“legacy_imports” keyspace中。

问题是,我的工作版本位于另一个keyspace“stats”中,我想在某个地方保留“legacy_imports”并将其合并到“stats”中。

所需的操作只是将一些表(包括COUNTER表)从一个keyspace复制到另一个keyspace中,它们位于同一节点上。

我尝试使用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,但处理起来很困难。我的数据分布在两个磁盘上,路径看起来像这样:

/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个回答

1
抱歉,COPY命令在C* 2.1之前的性能不佳,因此它偶尔会遇到问题。您接收到的特定错误是由于其中一个读取操作正在执行,但未在超时参数内获得结果。请注意,它确实说它收到了一个响应,这意味着至少有一个节点能够及时响应。这意味着您可能可以使用较低的一致性级别,就可以胜任。我认为最好(且可扩展)的解决方案是使用类似Spark的工具进行传输。例如:
sc.cassandraTable("firstKeyspace","legacy_table").saveToCassandra("secondKeyspace","otherTable")

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

嗨@RussS,感谢您的帮助。我担心会得到这样的答案,因为我一直在推迟集成Spark的时间,但是我认为我不能再推迟了。我想我可以使用Pachyderm.io来帮助我进行此次导入,以便我可以用Go语言完成它(我不太擅长Java开发...)。您对两者之间的选择有任何建议吗?再次感谢。 - Dalpapa
我非常喜欢Spark平台,看起来它将成为未来一个很有价值的平台。当前整个大数据世界都在热议Spark。它与C*一起使用非常有用,因为可以以相对简单的方式完成许多复杂的转换。同时还有Python连接器,但目前仅在DSE中可用。 - RussS
好的,今天早上我尝试安装Spark,但遗憾地失败了...我将手动导入它,因为这是我确定的解决方案。无论如何,还是谢谢你的帮助!! - Dalpapa

1

只需将SSTables移动到指定位置即可。基本步骤如下:

  1. stats keyspace中创建表
  2. 将SSTables复制到stats目录下相应的数据目录中
  3. nodetool refresh -- stats legacy_table

嗨,Gordon, 我尝试了这个方法,但它没有起作用。 Nodetool refresh 没有输出任何错误,但我的数据仍然不在 stats keyspace 中。如 @RussS 所说,我将手动使用 CQL Batch 完成此操作,以确保不会失败。 - Dalpapa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接