我想在cassandra中插入約5000萬行(〜30列),目前只有1個節點。向cassandra插入大量數據
我從另一個數據源查詢我的數據並存儲在一個表對象中。我迭代通過分別解析每一行然後將其添加到增變器。目前,我一次插入100行,100萬行需要40分鐘!我如何加快這個過程? (我也嘗試過client.batch_mutate(),但它似乎有重置連接錯誤塊數大小的插入數千)2)。
通過搜索我看到多線程可能有所幫助。但我找不到任何例子,有人可以鏈接我嗎?謝謝 !!
我當前的代碼:
List<String> colNames = new ArrayList<String>();
List<String> colValues = new ArrayList<String>();
SomeTable result = Query(...); // this contains my result set of 1M rows initially
for (Iterator itr = result.getRecordIterator(); itr.hasNext();) {
String colName =.....
String colValue = .....
int colCount = colNames.size(); // 100 * 30
for (int i = 0; i < colCount; i++) {
//add row keys and columns to mutator
mutator.addInsertion(String.valueOf(rowCounter), "data", HFactory.createStringColumn(colNames.get(i), colValues.get(i)));
}
rowCounter++;
//insert rows of block size 100
if (rowCounter % 100==0) {
mutator.execute();
//clear data
colNames = new ArrayList<String>();
colValues = new ArrayList<String>();
mutator = HFactory.createMutator(keyspace, stringSerializer);
}
}
感謝您的回答!所以我需要多個節點,如果我想讓我的客戶端多線程?我不知道多線程,我不知道你是否知道在線的任何好的多線程cassandra例子? 是的,我現在正在測試,稍後會擴展到更多節點。 @Richard – 2013-04-04 13:09:55
不,您可以爲每個節點建立多個連接,這就是讓您的客戶端成爲多線程所需的全部內容。我不知道Cassandra的例子,但ThreadPoolExecutor的javadoc是很好的http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ThreadPoolExecutor.html,並且有關於Java的教程在此處進行線程化http://docs.oracle.com/javase/tutorial/essential/concurrency/index.html – Richard 2013-04-04 13:15:19
再次感謝@Richard。對不起另一個新手問題 - 看起來我會將我的代碼封裝在Runnable中,並創建許多線程併發送不同的「表」對象。我的問題是,我是否應該爲每個線程或同一個線程創建一個新的Cluster/Mutator/Keyspace對象? – 2013-04-04 15:28:55