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

因此,我编写了一个简单的Java程序来生成随机ints。我可以在~200 MB中生成随机测试数据的~120s。现在除非我的数学不上课,否则我想我会很烦。

35000中有200MB 7 terabytes个单位。

35000 * 120 = 4 200 000 seconds

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

最佳答案

由于您要在循环中执行许多串联操作,因此我强烈建议您检出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方法中执行类似的操作。

10-08 09:18
查看更多