使用来自不同Cassandra集群的SStableloader加载Cassandra数据

时间:2016-01-27 20:12:22

标签: cassandra bulk-load

我有两台运行Cassandra的独立机器,我想将数据从一台机器迁移到另一台机器。

因此,我首先根据datastax documentation在机器1上拍摄了我的Cassandra集群的快照。

然后我将数据移到了机器2,我试图用sstableloader导入它。

注意:机器2上的keypsace(open_weather)和tablename(raw_weather_data)已创建,与机器1上的相同。

我使用的命令如下所示:

bin/sstableloader -d localhost "path_to_snapshot"/open_weather/raw_weather_data

然后出现以下错误:

Established connection to initial hosts
Opening sstables and calculating sections to stream
For input string: "CompressionInfo.db"
java.lang.NumberFormatException: For input string: "CompressionInfo.db"
    at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
    at java.lang.Integer.parseInt(Integer.java:580)
    at java.lang.Integer.parseInt(Integer.java:615)
    at org.apache.cassandra.io.sstable.Descriptor.fromFilename(Descriptor.java:276)
    at org.apache.cassandra.io.sstable.Descriptor.fromFilename(Descriptor.java:235)
    at org.apache.cassandra.io.sstable.Component.fromFilename(Component.java:120)
    at org.apache.cassandra.io.sstable.SSTable.tryComponentFromFilename(SSTable.java:160)
    at org.apache.cassandra.io.sstable.SSTableLoader$1.accept(SSTableLoader.java:84)
    at java.io.File.list(File.java:1161)
    at org.apache.cassandra.io.sstable.SSTableLoader.openSSTables(SSTableLoader.java:78)
    at org.apache.cassandra.io.sstable.SSTableLoader.stream(SSTableLoader.java:162)
    at org.apache.cassandra.tools.BulkLoader.main(BulkLoader.java:106)

不幸的是我不明白为什么?

我不确定它是否与问题有关,但不知何故在机器1上我的* .db文件是名字而不是#34;奇怪"与我在机器2上已有的* .db文件相比。

*。来自机器1的db文件:

la-53-big-CompressionInfo.db
la-53-big-Data.db
...
la-54-big-CompressionInfo.db
...

*。来自机器2的db文件:

open_weather-raw_weather_data-ka-5-CompressionInfo.db
open_weather-raw_weather_data-ka-5-Data.db

我错过了什么?任何帮助将受到高度赞赏。我也对任何其他建议持开放态度。 COPY命令很可能不起作用,因为据我所知,它仅限于99999999行。

P.S。我不想创建一个过于庞大的帖子,但如果您需要任何进一步的信息来帮助我,请告诉我。

编辑: 请注意,我在独立模式下使用Cassandra。

EDIT2: 在我的目标机器(机器2)上安装相同的版本2.1.4后,我仍然得到所有相同的错误。使用SSTableLoader我仍然得到上面提到的错误并手动复制文件(如LHWizard所述),我再次启动Cassandra并执行SELECT命令后仍然会得到空表。

关于初始令牌,如果我在机器1上执行节点响铃,我会得到一个巨大的令牌列表。我不知道如何处理这些令牌?

1 个答案:

答案 0 :(得分:1)

您的数据已经是快照(或备份)的形式。我过去所做的是以下几点:

  1. 在还原节点上安装相同版本的cassandra
  2. 在还原节点上编辑cassandra.yaml - 确保cluster_name和snitch是相同的。
  3. 编辑种子:列表以及在原始节点中更改的任何其他属性。
  4. 使用cqlsh DESC KEYSPACE从原始节点获取架构。
  5. 在还原节点上启动cassandra并导入架构。 (步骤6和7可能不是完全必要的,但这就是我所做的。)
  6. 停止cassandra,删除/ var / lib / cassandra / data / ,commitlog / 和saved_caches / *文件夹的内容。
  7. 在还原节点上重新启动cassandra以重新创建正确的文件夹,然后将其停止
  8. 将snapshots文件夹的内容复制到还原节点中的每个对应的表文件夹,然后启动cassandra。您可能希望运行nodetool repair。
  9. 如果你使用相同版本的cassandra,你真的不需要批量导入数据,它已经是正确的格式,尽管你没有在原始问题中指明