2015-02-19 3 views
1

У меня есть большой проект данных для школы, который требует, чтобы мы строили и запрашивали 8-ю систему Cassandra. Система должна содержать не менее семи терабайт данных. Я должен сам генерировать все эти данные. Нет требования, чтобы данные были «релевантными» для присваивания, т. Е. Каждый столбец может быть просто случайным int. При этом требуется, чтобы каждое значение было случайным или основано на случайной последовательности.Генерировать случайные данные для Cassandra DB

Итак, я написал простую java-программу, чтобы просто генерировать случайные ints. Я могу генерировать ~200 MB случайных данных теста в ~120s. Теперь, если моя математика не выключена, тогда я думаю, что у меня рассол.

Есть 35000200MB единиц в 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

Пожалуйста, пост, как вы генерируете данные, и как вы храните его в БД. –

+0

Я не собираюсь загружать данные в db, но схема представляет собой «одну таблицу» с '400 столбцами', которые в этот момент будут все значениями' int'. – slmyers

+2

С количеством конкатенаций, продолжающимся в ваших циклах, подумали ли вы об использовании StringBuilder, чтобы выжать из него больше сока? –

ответ

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.

3

Использование cassandra stress 2.1

И это tool, чтобы сгенерировать YAML.

У вас будут случайные данные в C * в минутах, без кодирования!

+1

omg где вы были несколько недель назад! Я закончил тем, что писал SSTables и загружал их через JMX, но мой бог - это эта связь потрясающая! Думаю, я мог бы поделиться им с моим профессором, чтобы будущим студентам было легче. – slmyers

+0

Из любопытства, где вы берете курс c *? – phact

+2

Ну, я не говорю о курсе C * за каждый. Я делаю Базы данных II в Университете Альберты, а в качестве дополнительного проекта я должен создать простую систему NoSQL. Мы смогли выбрать любую систему NoSQL, и наша группа отправилась с C *, потому что был учебник о том, как настроить кластер, заданный в лаборатории. – slmyers

-1

Скорость в объеме, а также более реалистичность данных могут быть получены через сторонние инструменты тестовых данных. Этот (RowGen) создает плоские файлы, которые вы можете скопировать в DataStax; см:

Creating Test Data for Cassandra DataStax

Смежные вопросы