2017-03-08 80 views
1

我想用批量向Cassandra插入40000行。但它始終停在數字32769,並給我一個例外「System.ArgumentOutOfRangeException」。我應該怎麼做才能將超過32769行插入到Cassandra中。C#批量插入40000行到Cassandra DB

這裏是我的代碼:

 //建立DCS 資料 
     DateTime ToDay = DateTime.Today; 
     string LotStr = ToDay.ToString("yyMMdd"); 
     DateTime NowTime = DateTime.Now;    
     List<DCS_Model> DCS_list = new List<DCS_Model>(); 
     Random rnd = new Random(); 
     for (int i = 1; i <= 40000; i++) 
     { 
      DCS_list.Add(new DCS_Model(LotStr, String.Format("Tag_{0}", i), rnd.Next(1000) + rnd.NextDouble(), NowTime, NowTime)); 
     } 

     //上傳至Cassandra 
     DateTime tt = DateTime.Now; 
     Cluster cluster = Cluster.Builder().AddContactPoint("192.168.52.182").Build(); 
     ISession session = cluster.Connect("testkeyspace"); 
     //List<PreparedStatement> StatementLs = new List<PreparedStatement>(); 
     var InsertDCS = session.Prepare("INSERT INTO DCS_Test (LOT, NAME, VALUE, CREATETIME, SERVERTIME) VALUES (?, ?, ?, ?, ?)"); 
     var batch = new BatchStatement(); 
     foreach (DCS_Model dcs in DCS_list) 
     { 

      batch.Add(InsertDCS.Bind(dcs.LOT,dcs.NAME,dcs.VALUE,dcs.CREATETIME,dcs.SERVERTIME)); 
     } 
     session.Execute(batch); 
     //Row result = session.Execute("select * from TestTable").First(); 
     TimeSpan CassandraTime = DateTime.Now - tt; 
     //Console.WriteLine(CassandraTime); 

它將在batch.Add(InsertDCS.Bind(dcs.LOT,dcs.NAME,dcs.VALUE,dcs.CREATETIME,dcs.SERVERTIME)) 停止時批量添加32768倍。

請幫幫我。謝謝!!

+1

40000 ...哇...通常建議的限制小於10 ... – xmas79

+0

值32768似乎對我很可疑。可以有最大數量的語句允許您添加到BatchStatement對象嗎? –

+0

我已經將batch_size_fail_threshold_in_kb參數設置爲100000,所以我認爲這不是允許的問題。 –

回答

1

RDBMS世界中的批處理功能甚至沒有將批處理功能與Cassandra進行遠程鏡像。他們可能被命名爲相同的,但他們是爲不同的目的而設計的。實際上,Cassandra的可能應該更名爲「原子」以避免混淆。

不要一次性將它們集中在一起,請嘗試發送40k個人請求,異步與可聽期貨(以便您知道何時完成)。我相信Java的ListenableFuture的C#相當於SettableFuture。你應該看看。

發送40k個人交易可能看起來違反直覺。但它肯定會擊敗一個Cassandra節點作爲協調器(以及該節點將生成的所有網絡流量)來處理並確保40k的upserts的原子性。

此外,請確保使用令牌感知負載平衡策略。這將引導你的upsert到它需要去的確切節點(節省你使用協調器的網絡跳數)。

Cluster cluster = Cluster.Builder().AddContactPoint("192.168.52.182").Build() 
    .WithLoadBalancingPolicy(new TokenAwarePolicy 
     (new DCAwareRoundRobinPolicy("westDC"))); 
0

我發現,當添加計數超過Int16.MaxValue時,函數「BatchStatement」的源代碼將拋出異常。所以我改變了源代碼,然後我解決了這個問題!