【问题标题】:Generate Random Data for Cassandra DB为 Cassandra DB 生成随机数据
【发布时间】:2015-02-19 03:10:50
【问题描述】:

我有一个学校的大数据项目,需要我们构建和查询一个 8 节点 Cassandra 系统。系统必须包含至少 7 TB 的数据。我必须自己生成所有这些数据。不要求数据与分配“相关”——即每列可以只是一个随机整数。话虽如此,要求每个值都是随机的或基于随机序列。

所以,我编写了一个简单的 java 程序来生成随机的ints。我可以在~120s 中生成~200 MB 的随机测试数据。现在除非我的数学是关闭的,否则我认为我在泡菜。

7 terabytes中有35000200MB单位。

35000 * 120 = 4 200 000 seconds

4 200 000 / 3600 ~ 1167hours

1167 / 24 = 49 days

因此,生成所需的所有测试数据似乎需要 49 天。显然,这是不切实际的。我正在寻找可以提高我生成数据的速度的建议。

我已经考虑/考虑:

将复制因子设置为 8 以减少需要生成的数据量,并在所有 8 个节点上运行数据生成程序。

编辑:我是如何生成数据的

private void initializeCols(){
    cols = new ArrayList<Generator>();
    cols.add(new IntGenerator(400));
}

public ArrayList<String> generatePage(){
    ArrayList<String> page = new ArrayList<String>();
    String line = "";
    for(int i = 0; i < PAGE_SIZE; i++){
        line = "";
        for(Generator column : cols){
            line += column.gen();
        }
        page.add(line);
    }
    return page;
}

最初我生成了更多的test specific 数据,例如phone numbers 等,但后来我决定只生成随机的ints 以节省一些时间——节省不了多少。这是IntGenerator 类。

public IntGenerator(int series){
    this.series = series;
}

public String gen(){
    String output = "";

    for(int i = 0; i < series; i++){
        output += Integer.toString(randomInt(1,1000));
        output += SEPERATOR; 
    }
    return output;
}

【问题讨论】:

  • 请发布您如何生成数据以及如何将其存储在数据库中。
  • 我还没来得及将数据加载到数据库中,但架构是 single table400 columns,此时它们都将是 int 值。跨度>
  • 随着循环中的串联数量不断增加,您是否考虑过使用 StringBuilder 从中榨取更多汁液?
  • 不敢这么大数量地连接字符串! :) 使用 StringBuilder 作为@OblivionCreations 提到的。

标签: java random cassandra


【解决方案1】:

使用cassandra stress 2.1

还有这个tool 来生成你的yaml。

您将在几分钟内获得 C* 中的随机数据,无需编码!

【讨论】:

  • 天啊,几周前你在哪里!我最终编写了 SSTables 并通过 JMX 加载它们,但我的上帝是你的这个链接太棒了!我想我可以把它分享给我的教授,这样未来的学生会更轻松。
  • 出于好奇,您在哪里学习 c* 课程?
  • 好吧,我说的不是 C* 课程。我在阿尔伯塔大学做 Databases II,作为一个可选项目,我应该构建一个简单的 NoSQL 系统。我们可以选择任何 NoSQL 系统,我们小组选择了 C*,因为在实验室中有一个关于如何设置集群的教程。
【解决方案2】:

由于您在循环中执行大量连接,我强烈建议您查看StringBuilder。它将显着提高循环的速度。例如,

public String gen(){
    StringBuilder sb = new StringBuilder();
    for(int i = 0; i < series; i++){
        sb.append(Integer.toString(randomInt(1,1000)));
        sb.append(SEPERATOR); 
    }
    return sb.toString();
}

你也应该在你的 generatePage 方法中做类似的事情。

【讨论】:

    【解决方案3】:

    通过第三方测试数据工具可以提高数据量的速度以及更多的数据真实性。这个(RowGen)创建可以复制到 DataStax 中的平面文件;见:

    Creating Test Data for Cassandra DataStax

    【讨论】:

      猜你喜欢
      • 2011-01-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-15
      • 2013-04-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多