为 Cassandra DB 生成随机数据
Generate Random Data for Cassandra DB
我有一个学校的大数据项目,需要我们构建和查询一个 8 节点的 Cassandra 系统。该系统必须包含至少 7 TB 的数据。我必须自己生成所有这些数据。没有要求数据是 "relevant" 赋值——即每一列可以只是一个随机整数。也就是说,要求每个值都是随机的或基于随机序列。
所以,我写了一个简单的 java 程序来生成随机数 ints
。我可以在 ~120s
中生成 ~200 MB
的随机测试数据。现在,除非我的数学有问题,否则我想我陷入了困境。
在7 terabytes
中有35000
200MB
个单元。
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
以节省一些时间——节省的时间不多。这里是IntGenerator
class。
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 方法中做类似的事情。
然后 tool 生成您的 yaml。
您将在几分钟内获得 C* 中的随机数据,无需编码!
可以通过第三方测试数据工具获得处理速度以及更多的数据真实性。这个 (RowGen) 创建可以复制到 DataStax 中的平面文件;见:
我有一个学校的大数据项目,需要我们构建和查询一个 8 节点的 Cassandra 系统。该系统必须包含至少 7 TB 的数据。我必须自己生成所有这些数据。没有要求数据是 "relevant" 赋值——即每一列可以只是一个随机整数。也就是说,要求每个值都是随机的或基于随机序列。
所以,我写了一个简单的 java 程序来生成随机数 ints
。我可以在 ~120s
中生成 ~200 MB
的随机测试数据。现在,除非我的数学有问题,否则我想我陷入了困境。
在7 terabytes
中有35000
200MB
个单元。
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
以节省一些时间——节省的时间不多。这里是IntGenerator
class。
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 方法中做类似的事情。
然后 tool 生成您的 yaml。
您将在几分钟内获得 C* 中的随机数据,无需编码!
可以通过第三方测试数据工具获得处理速度以及更多的数据真实性。这个 (RowGen) 创建可以复制到 DataStax 中的平面文件;见: