Primo: so che non è una buona idea eseguire una scansione completa in Cassandra, tuttavia, al momento, è ciò di cui ho bisogno.Problema nella scansione completa della tabella in cassandra
Quando ho iniziato a cercare di fare qualcosa di simile, leggo persone che dicono che non era possibile fare una scansione completa in Cassandra e lui non è stato fatto per fare questo tipo di cose.
Non soddisfatto, Continuo a guardare fino a quando ho trovato questo articolo: http://www.myhowto.org/bigdata/2013/11/04/scanning-the-entire-cassandra-column-family-with-cql/
assomigliare abbastanza ragionevole e ho dato una prova. Poiché eseguirò questa scansione completa solo una volta e l'ora e le prestazioni non sono un problema, ho scritto la query e l'ho messa in un lavoro semplice per cercare tutti i record che voglio. Da 2 miliardi di file di record, qualcosa come 1000 era il mio output atteso, tuttavia, avevo solo 100 record.
Il mio lavoro:
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;
}
Fondamentalmente quello che faccio è cercare il minimo consentito e Token incrementale andare fino all'ultimo.
Non so, ma è come se il lavoro non avesse eseguito completamente la scansione completa o la mia query avesse avuto accesso solo a un nodo o qualcosa del genere. Non so se sto facendo qualcosa di sbagliato, o non è davvero possibile fare una scansione completa.
Oggi ho quasi 2 TB di dati, solo una tabella in un cluster di sette nodi.
Qualcuno è già stato in questa situazione o ha qualche raccomandazione?
qual è lo schema delle chiavi per "mytable"? la query viene eseguita più volte (a causa del ciclo while) e l'ultima query potrebbe restituire 100 anziché 1000 – turbo
Schema: http://pastebin.com/DyWAc1wa. E sì, la query è in esecuzione più volte e restituisce tutte le righe impostate sulla clausola LIMIT. – bcfurtado