为 Cassandra DB 生成随机数据

Generate Random Data for Cassandra DB

我有一个学校的大数据项目,需要我们构建和查询一个 8 节点的 Cassandra 系统。该系统必须包含至少 7 TB 的数据。我必须自己生成所有这些数据。没有要求数据是 "relevant" 赋值——即每一列可以只是一个随机整数。也就是说,要求每个值都是随机的或基于随机序列。

所以,我写了一个简单的 java 程序来生成随机数 ints。我可以在 ~120s 中生成 ~200 MB 的随机测试数据。现在,除非我的数学有问题,否则我想我陷入了困境。

7 terabytes中有35000200MB个单元。

35000 * 120 = 4 200 000 seconds

4 200 000 / 3600 ~ 1167hours

1167 / 24 = 49 days

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

我已经 considered/considering:

setting replication factor to 8 to reduce the amount of data needed to be generated, and also running the data generation program on all 8 nodes.

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

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 以节省一些时间——节省的时间不多。这里是IntGeneratorclass。

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;
}

由于您在循环中执行大量连接,我强烈建议您查看 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 方法中做类似的事情。

使用cassandra stress 2.1

然后 tool 生成您的 yaml。

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

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

Creating Test Data for Cassandra DataStax