2015-10-25 131 views
1

我使用批處理語句將數據插入到來自csv文件的Cassandra中。我的表看起來像這樣 創建表曝光(expoid BIGINT,FILEID BIGINT,studyid文本,projname文字,W文字,X文字,Y文本,Z文本)使用批處理語句插入Cassandra

System.out.println(colDataMap); 

String keyspace = "orchtablespaces"; 
String tabName = fileName; 
//String tableFile = "/home/blr-lt-202/empAccount.txt"; 
String tableFile = fname; 

Set<String> colNamesSet = colDataMap.keySet(); 
String[] colNames = colNamesSet.toArray(new String[colNamesSet.size()]); 
System.out.println("ColNames ::" +colNames); 

String makeStatement = makeSt(keyspace,tabName,colNames); 

System.out.println("makeStatement ::"+makeStatement); 

if(count==65534) 
{ 
    session.executeAsync(bs); 
    count = 0; 
    bs = new BatchStatement(); 
} 

PreparedStatement statement = session.prepare(makeStatement); 
//bcz expo id and seq_n 
String expoid =(String) colDataMap.get("expoid"); 
String Seq_No = (String) colDataMap.get("Seq_No"); 
colDataMap.put(expoid, Long.valueOf(expoid)); 
colDataMap.put("Seq_No", Long.valueOf(Seq_No)); 

BoundStatement query = statement.bind(colDataMap.values().toArray(new Object[colDataMap.size()])); 

//BoundStatement query = statement.bind(colDataMap.get("Seq_No"),colDataMap.get("fileId"),colDataMap.get("studyId"),colDataMap.get("projectName"),colDataMap.get("dosetxt"),colDataMap.get("sdurtunit"),colDataMap.get("durtunit")); 
System.out.println("query "+query); 
bs.add(query); 
count++; 
} 
session.executeAsync(bs); 

session.close(); 

MapColDataMap擁有所有卡桑德拉表山坳如下圖所示

{Seq_No=0, fileId=123, studyId=786, w=PreCLinic, x=Tasq 30mg/kg, y=12 days, z=12 days} 
Set<String> colNamesSet =colDataMap.keySet(); 
String[] colNames = colNamesSet.toArray(new String[colNamesSet.size()]); 
System.out.println("ColNames ::" +colNames); 

String makeStatement = makeSt(keyspace,tabName,colNames); 

System.out.println("makeStatement ::"+makeStatement); 

的方法,反將準備準備語句名作爲密鑰和它們的值在映射

makeStatement ::INSERT INTO orchtablespaces.EXPOSURES (Seq_No,fileId,studyId,w,x,y,z) values (?,?,?,?,?,?,?) 

這很好。然後,我做了以下

PreparedStatement statement = session.prepare(makeStatement); 
//bcz expoid and seq_no are of type bigint int the cassandra table 
String expoid =(String) colDataMap.get("expoid"); 
String Seq_No = (String) colDataMap.get("Seq_No"); 
colDataMap.put(expoid, Long.valueOf(expoid)); 
colDataMap.put("Seq_No", Long.valueOf(Seq_No)); 

BoundStatement query = statement.bind(colDataMap.values().toArray(new Object[colDataMap.size()])); 

當我運行我收到以下錯誤

com.datastax.driver.core.exceptions.NoHostAvailableException.copy(NoHostAvailableException.java:84) 
com.datastax.driver.core.DefaultResultSetFuture.extractCauseFromExecutionException(DefaultResultSetFuture.java:289)com.test.load.microarr.CopyOfLoadMicroArr.transformSourceFile(CopyOfLoadMicroArr.java:486)com.test.load.microarr.CopyOfLoadMicroArr.loadData(CopyOfLoadMicroArr.java:149) 
com.test.load.microarr.CopyOfLoadMicroArr.main(CopyOfLoadMicroArr.java:114) 
Caused by: com.datastax.driver.core.exceptions.NoHostAvailableException: All host(s) tried for query failed (no host was tried) 
com.datastax.driver.core.RequestHandler.sendRequest(RequestHandler.java:107) 
com.datastax.driver.core.SessionManager.execute(SessionManager.java:538) 
com.datastax.driver.core.SessionManager.prepareAsync(SessionManager.java:124) 
com.datastax.driver.core.AbstractSession.prepare(AbstractSession.java:77) 
    ... 3 more 
com.datastax.driver.core.AbstractSession.prepare(AbstractSession.java:79) 

該程序是打破確切的線是線486計劃,那就是在

PreparedStatement statement = session.prepare(makeStatement); 

我正在使用DataStax Cassandra 2.1.8 ..任何建議和解決方案將非常有幫助!謝謝 !

回答

0

你肯定有問題與cassandra的連接。

形式的Datastax Java driver documentation

NoHostAvailableException - 如果集羣中沒有主機可以聯繫成功編寫本聲明。

,並形成the error description

異常時,因爲沒有主機是 可無法進行查詢拋出。如果

  • 要麼不存在主機住在 在查詢時刻的集羣則拋出該異常

  • 曾出現過 未能由於連接問題

  • 所有主機

出於調試目的, 已經嘗試過的主機列表以及故障原因可能是 使用errors方法檢索到的。

嘗試捕獲此錯誤並嘗試主機的輸出列表 - 這可以幫助您檢測到有錯誤的主機或錯誤的端口。使用getErrors()方法 - http://docs.datastax.com/en/drivers/java/2.0/com/datastax/driver/core/exceptions/NoHostAvailableException.html#getErrors()

+0

嗨,但是當我嘗試使用一個簡單的插入語句到表的另一個程序時,它有任何問題插入或連接,具有相同的配置。 –

+0

如果您對簡單的插入沒有任何問題,但是存在問題,那麼我認爲您超載了您的節點。你需要更好地調整cassandra(它可以幫助,但我不確定在你的情況下究竟需要調整什麼),或者增加更多的節點或減少casandra的負載 - 做更少的請求。試着從一些很低的數字(比如10個左右)爲你做批處理語句來驗證這個低點。 –

+0

閱讀這個問題的批准答案下的討論:http://stackoverflow.com/questions/27902232/cassandra-cluster-with-bad-insert-performance-and-insert-stability –