Во-первых: Я знаю, что это не очень хорошая идея, но полная проверка в Кассандре, однако, в данный момент - это то, что мне нужно.
Когда я начал искать что-то подобное, я прочитал, что люди говорят, что невозможно сделать полное сканирование в Кассандре, и он не был создан для этого.
Не удовлетворен, я продолжаю искать, пока не найду эту статью: http://www.myhowto.org/bigdata/2013/11/04/scanning-the-entire-cassandra-column-family-with-cql/
Похоже, это довольно разумно, и я попробовал. Поскольку я сделаю это полное сканирование только один раз, а время и производительность не проблема, я написал запрос и поместил это в простой Job, чтобы найти все записи, которые я хочу. Из 2 миллиардов строк записей что-то вроде 1000 было моим ожидаемым выходом, однако у меня было всего 100 записей.
Моя работа:
public void run() {
Cluster cluster = getConnection();
Session session = cluster.connect("db");
LOGGER.info("Starting ...");
boolean run = true;
int print = 0;
while ( run ) {
if (maxTokenReached(actualToken)) {
LOGGER.info("Max Token Reached!");
break;
}
ResultSet resultSet = session.execute(queryBuilder(actualToken));
Iterator<Row> rows = resultSet.iterator();
if ( !rows.hasNext()){
break;
}
List<String> rowIds = new ArrayList<String>();
while (rows.hasNext()) {
Row row = rows.next();
Long leadTime = row.getLong("my_column");
if (myCondition(myCollumn)) {
String rowId = row.getString("key");
rowIds.add(rowId);
}
if (!rows.hasNext()) {
Long token = row.getLong("token(rowid)");
if (!rowIds.isEmpty()) {
LOGGER.info(String.format("Keys found! RowId's: %s ", rowIds));
}
actualToken = nextToken(token);
}
}
}
LOGGER.info("Done!");
cluster.shutdown();
}
public boolean maxTokenReached(Long actualToken){
return actualToken >= maxToken;
}
public String queryBuilder(Long nextRange) {
return String.format("select token(key), key, my_column from mytable where token(key) >= %s limit 10000;", nextRange.toString());
}
public Long nextToken(Long token){
return token + 1;
}
В основном то, что я делаю, это поиск разрешенного минимального токена и постепенного перехода до последнего.
Я не знаю, но похоже, что работа полностью не выполнялась полностью, или мой запрос имел доступ только к одному node или к чему-то еще. Я не знаю, делаю ли я что-то неправильно, или действительно невозможно выполнить полное сканирование.
Сегодня у меня есть почти 2 ТБ данных, только одна таблица в одном кластере из семи узлов.
Кто-то уже был в этой ситуации или имеет некоторые рекомендации?