2017-03-08 85 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”的源代码将抛出异常。所以我改变了源代码,然后我解决了这个问题!