【问题标题】:Loading Cassandra data with SStableloader from different Cassandra cluster使用 SStableloader 从不同的 Cassandra 集群加载 Cassandra 数据
【发布时间】:2016-05-04 23:32:00
【问题描述】:

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

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

然后我将数据移动到机器 2,并尝试使用 sstableloader 将其导入。

注意:机器 2 上的键位 (open_weather) 和表名 (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 上,与机器 2 上已有的 *.db 文件相比,我的 *.db 文件的名称相当“奇怪”。

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

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 行。

附:我不想创建过大的帖子,但如果您需要任何进一步的信息来帮助我,请告诉我。

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

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

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

【问题讨论】:

  • 第二台机器是没有其他数据的新节点吗?
  • 第二台机器具有与第一台机器相同的键空间和表。最初它也有一些价值。我首先尝试使用内部的其他数据,然后使用空表。两种情况下的结果相同。

标签: cassandra bulk-load


【解决方案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文件夹的内容复制到restore节点中每个对应的table文件夹中,然后启动cassandra。您可能想要运行 nodetool repair。

您实际上并不需要批量导入数据,如果您使用的是相同版本的 cassandra,它已经采用正确的格式,尽管您没有在原始问题中指定。

【讨论】:

  • 我之前实际上尝试过类似的东西但没有成功。这就是我后来尝试 SSTableloader 的原因。无论如何,我重试了,如果我在 cqlsh 中执行 SELECT 命令,则按照结果数据的描述表仍然是空的。我实际上注意到机器 1 的版本为 2.1.4,而我的目标机器的版本为 2.1.11。不确定这是否是原因?另外,我对第6步有点困惑。如果我删除.../data/的内容,那么我在第4步中创建的键空间将再次被删除,对吧?关于第 2 步。集群名称相同,我没有触及其他任何内容。
  • 是的,此时步骤 6 和 7 似乎没有必要,尽管我似乎记得在任何数据导入之前提交日志文件夹中可能已经存在文件。不要忘记将所有文件的所有权更改为 cassandra:cassandra - 当我忘记这样做时,我在 system.log 中发现了权限错误。不知道2.1.4和2.1.11的sstable格式有没有区别。确保将文件复制到新文件夹时停止 cassandra。查看此技术的另一个示例here
  • 我没有提到的一件事是令牌分配。在您的原始集群中,您可以使用nodetool ring 找到令牌分配。在第二个集群上,编辑 cassandra.yaml 并使用该值指定 initial_token。
  • 首先,感谢您的所有建议。关于权限,这应该不是问题,因为我以 root 身份执行 Cassandra。无论如何我都改变了它们,没有任何效果。另外,不确定它是否会改变任何东西,但我可能应该注意到,我将 Cassandra 作为独立进程(而不是服务)运行。关于 initial_token,我会在星期一尝试,因为我现在无法访问机器 1。我的直觉告诉我,我可能与2台机器之间的不同命名方案有关。但我没有足够的洞察力来真正了解这一点。
猜你喜欢
  • 2014-11-27
  • 2017-01-31
  • 1970-01-01
  • 2013-11-03
  • 2015-03-25
  • 1970-01-01
  • 2015-06-29
  • 2018-05-12
  • 1970-01-01
相关资源
最近更新 更多