【问题标题】:Cassandra: export from one keyspace to anotherCassandra:从一个键空间导出到另一个键空间
【发布时间】:2015-02-02 09:56:53
【问题描述】:

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

问题是,我的工作版本在另一个键空间“stats”中,我想将“legacy_imports”保留在某个地方,并将其合并到“stats”中。 所以这里想要的操作只是复制一些表(包括 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)

【问题讨论】:

    标签: cassandra cql


    【解决方案1】:

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

    我认为最好的(和可扩展的解决方案)是使用类似 spark 的东西来进行传输。类似的东西

    sc.cassandraTable("firstKeyspace","legacy_table").saveToCassandra("secondKeyspace","otherTable")
    

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

    【讨论】:

    • 嗨@RussS,感谢您的帮助。我害怕这样的答案,因为我在集成 Spark 的那一刻正在推后,但我想我不能再推了。我想我可能会使用 Pachyderm.io 来帮助我进行此导入,以便我可以在 Go 中进行。 (我不是 Java 开发人员……)。你对两者之间的选择有什么建议吗?再次感谢。
    • 我真的很喜欢 spark 平台,而且看起来它将是一个值得了解的未来平台。现在,几乎所有的大数据世界都在大肆宣传 Spark。它对 C* 很有用,因为您可以以非常简单的方式进行许多复杂的转换。还有一个 Python 连接器,但它仅适用于 DSE atm。
    • 好吧,所以我今天早上确实尝试安装 Spark,但遗憾的是失败了……我将手动导入它,因为我确信这是一个解决方案。无论如何感谢您的帮助!
    【解决方案2】:

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

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

    【讨论】:

    • 嗨,戈登,我试过了,但没用。 Nodetool refresh 没有输出任何错误,但我在 stats 键空间中仍然没有我的数据。正如@RussS 所说,我将使用 CQL Batch 手动执行此操作,所以我确信我不会失败。
    猜你喜欢
    • 2019-08-16
    • 1970-01-01
    • 2020-01-01
    • 2017-03-22
    • 2016-08-01
    • 2015-01-14
    • 1970-01-01
    • 2017-01-01
    • 2014-04-18
    相关资源
    最近更新 更多