我有一个针对学校的大数据项目,要求我们构建和查询8节点Cassandra系统。系统必须包含至少7 TB的数据。我必须自己生成所有这些数据。没有要求数据是相关的"分配 - 即每列可以只是一个随机的int。据说要求每个值是随机的或基于随机序列。
所以,我写了一个简单的java程序来生成随机ints
。我可以在~200 MB
中生成~120s
个随机测试数据。现在,除非我的数学已关闭,否则我认为我在泡菜中。
35000
中有200MB
7 terabytes
个单位。
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;
}
答案 0 :(得分:4)
答案 1 :(得分:3)
当您在循环中执行大量连接时,我强烈建议您查看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方法中做类似的事情。
答案 2 :(得分:-1)
通过第三方测试数据工具可以获得数量上的速度以及更多的数据真实性。这个(RowGen)创建可以复制到DataStax的平面文件;见: