如何使用Cassandra工具sstableloader?

如何使用Cassandra工具sstableloader?,cassandra,Cassandra,我正在尝试使用sstableloader将数据加载到现有的Cassandra环中,但不知道如何实际使其工作。我试图在一台有正在运行的cassandra节点的机器上运行它,但是当我运行它时,我得到一个错误,说端口7000已经在使用中,这是正在运行的cassandra节点用于流言的端口 那么,这是否意味着我只能在与目标cassandra环位于同一网络的机器上使用sstableloader,但实际上没有运行cassandra节点 任何详细信息都会很有用,谢谢。使用sstableloader,阅读源代码

我正在尝试使用sstableloader将数据加载到现有的Cassandra环中,但不知道如何实际使其工作。我试图在一台有正在运行的cassandra节点的机器上运行它,但是当我运行它时,我得到一个错误,说端口7000已经在使用中,这是正在运行的cassandra节点用于流言的端口

那么,这是否意味着我只能在与目标cassandra环位于同一网络的机器上使用sstableloader,但实际上没有运行cassandra节点


任何详细信息都会很有用,谢谢。

使用sstableloader,阅读源代码,并最终了解如何在承载正在运行的cassandra节点的同一台机器上运行sstableloader。有两个关键点可以让它运行。首先,您需要为sstableloader创建cassandra安装文件夹的副本。这是因为sstableloader读取yaml文件以确定用于八卦的IP地址,而Cassandra正在使用现有的yaml文件。第二点是,您需要在计算机上创建一个新的环回IP地址(类似于127.0.0.2)。完成此操作后,将复制的Cassandra安装文件夹中的yaml文件更改为侦听此ipaddress


我在这里写了一篇教程,详细介绍了如何做到这一点:

奥斯汀·卡桑德拉用户小组刚刚就这一点做了介绍:

我使用cassandra-0.8.4中提供的sstableloader实用程序成功地将sstables加载到cassandra中。从我遇到的一些问题中,我有以下提示

  • 如果在单机上运行,则必须创建cassandra安装文件夹的副本,并从该文件夹运行sstable loader。同时更改侦听地址,rpc地址还提供此复制的cassandra.yaml文件中运行cassandra作为种子的ip地址。请检查两个cassandra.yaml文件中的群集名称是否相同

  • 这些sstables必须位于一个名为键空间名称的目录中

  • 它需要在类路径中包含cassandra.yaml配置文件的目录

  • 请注意,应事先定义要加载的柱族的架构


  • 参考请参见:

    参考请参见:使用Cassandra SStableloader将数据批量加载到Cassandra

    如果您希望在Java中执行此操作,请参见下面的实用程序类:

    List argList=new ArrayList();
    argList.add(“-v”);
    argList.add(“-d”);
    argList.add(params.hosts);
    argList.add(“-f”);
    argList.add(params.cassyml);
    argList.add(参数完整路径);
    LoaderOptions选项=LoaderOptions.builder()
    .parseArgs(argList.stream().toArray(字符串[]:::新建))
    .build();
    尝试
    {
    散装装载机。装载(选项);
    }
    捕获(散装装载例外)
    {
    e、 printStackTrace();
    }
    ...
    

    代码还将使用CqlstableWriter类生成sstable文件。

    情况有所改善,使用sstableloader的整个过程更加简单,包括使用CqlstableWriter生成sstable的更简单方法

    详情如下:

    正如您在回答(和教程)中指出的,您可以在同一个节点上,只需提供备用IP地址即可。但是,有一个更简单的方法;您可以使用JMX->StorageService->bulkload()调用。非常适合测试和偶尔使用断开的链接。在此处添加任何其他缺失的位?@Turbo断开链接:(这与此类似,可能会有所帮助:-这正是为什么根据堆栈交换准则,指向答案的链接不是答案!sstableloader是否只加载部分数据?我的cluster1有3个节点,cluster2有3个节点。我需要将数据从cluster1复制到cluster2。我必须在每个cluster1节点或多个节点上运行sstableloader吗stableloader是否为我从其他主机获取了表的所有部分?
        List<String> argList = new ArrayList<>();
        argList.add("-v");
        argList.add("-d");
        argList.add(params.hosts);
        argList.add("-f");
        argList.add(params.cassYaml);
        argList.add(params.fullpath);
        LoaderOptions options = LoaderOptions.builder()
                .parseArgs(argList.stream().toArray(String[]::new))
                .build();
        try
        {
            BulkLoader.load(options);
        }
        catch (BulkLoadException e)
        {
            e.printStackTrace();
        }
        ...