首页 文章

C#Batch将40000行插入Cassandra DB

提问于
浏览
1

我想批量插入40000行到Cassandra . 但它始终停在数字32769并给我一个例外“System.ArgumentOutOfRangeException” . 我应该怎么做才能向Cassandra插入超过32769行 .

这是我的代码:

//建立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);

当批量添加32768次时,它将停在 batch.Add(InsertDCS.Bind(dcs.LOT,dcs.NAME,dcs.VALUE,dcs.CREATETIME,dcs.SERVERTIME)) .

请帮我 . 谢谢!!

2 回答

  • 1

    RDBMS世界中的批处理功能甚至无法使用Cassandra远程镜像批处理功能 . 它们的名称可能相同,但它们的设计目的不同 . 事实上,Cassandra应该被重命名为“原子”以避免混淆 .

    不要一次性地将它们一起批量处理,而是尝试发送40k个别请求,与可听的未来同步(以便您知道它们何时完成) . 我相信Java的 ListenableFuture 的C#等价物是 SettableFuture . 你应该研究一下 .

    发送40k个别交易可能看起来违反直觉 . 但它确实击败了一个Cassandra节点作为协调器(连同节点将生成的所有网络流量)来处理并确保40k upsert的原子性 .

    此外,请确保使用令牌识别负载 balancer 策略 . 这将把你的upsert引导到它需要去的确切节点(使用协调器节省网络跃点) .

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

    我发现当添加计数超过Int16.MaxValue时,函数“BatchStatement”的源代码将抛出异常 . 所以我改变了源代码,然后我解决了这个问题!!

相关问题