c#如何向Cassandra表中插入大量数据

Posted

技术标签:

【中文标题】c#如何向Cassandra表中插入大量数据【英文标题】:c# How to insert huge amount of data into Cassandra table 【发布时间】:2020-03-05 01:53:57 【问题描述】:

亲爱的,

我正在尝试使用 C# 应用程序将大约 100 000 行插入 Cassandra 数据库。

为了实现这一点,我正在使用 nuget:

https://www.nuget.org/packages/CassandraCSharpDriver/

我已在笔记本电脑(i5、32GB RAM、Windows 10)上本地安装 Cassandra。

我的 Cassandra 的设置是默认的:

var cluster = Cluster.Builder()
                                 .AddContactPoints(CassandraContactPoint)
                                 .WithPort(CassandraPort)
                                 .WithLoadBalancingPolicy(new DCAwareRoundRobinPolicy("datacenter1"))
                                 .WithAuthProvider(new PlainTextAuthProvider(UserName, Password))
                                 .Build();

Cassandra 表如下所示:

            session.Execute("DROP KEYSPACE IF EXISTS eventstore");
            session.Execute("CREATE KEYSPACE eventstoreWITH REPLICATION =  'class' : 'NetworkTopologyStrategy', 'datacenter1' : 1 ;");

            session.Execute(@"
                                CREATE TABLE IF NOT EXISTS eventstore.Event(
                                Id uuid, 
                                Data text, 
                                Version int,
                                AgregateId uuid,
                                EventIdentity uuid,
                                Date timestamp,
                                  PRIMARY KEY (AgregateId,Version)
                                ) WITH CLUSTERING ORDER BY (Version ASC)");

要插入事件,我使用以下代码:

events 变量包含 2000 个在 3 秒内插入的事件。

            var tasks = events.Select(async @event =>
            
                await mapper.InsertAsync(@event);
            );

            await Task.WhenAll(tasks);

目前此解决方案的性能约为 2000 个事件的 3 秒。 可以更快地插入数据吗??

【问题讨论】:

【参考方案1】:

您可以使用多种技术来发送稳定的执行流,同时限制并发级别。

驱动程序库中有一个示例:https://github.com/datastax/csharp-driver/blob/master/examples/ConcurrentExecutions/ExecuteInLoop/Program.cs

DataStax 驱动的开发者指南中还有一个主题:https://docs.datastax.com/en/devapp/doc/devapp/driverManagingConcurrency.html

并行提交多个请求时,请求会在以下三个级别之一排队:驱动程序端、网络堆栈或服务器端。任何这些级别上的过多排队都会影响完成每个操作所需的总时间。调整并发级别或同时请求的数量,以减少排队数量并获得高吞吐量和低延迟。

【讨论】:

非常感谢您的回答,我已经测试了您的解决方案,但结果与以前相同。顺便说一句,我已经将我的测试应用程序和 cassandra DB 迁移到另一台计算机上,现在性能非常棒!目前,我的主题代码的写入性能约为 160 000 个事件/秒。

以上是关于c#如何向Cassandra表中插入大量数据的主要内容,如果未能解决你的问题,请参考以下文章

如何删除EXCEL表中的大量数据行,要删除的行数大概8万

如何将大量数据插入数据库[重复]

#导入Word文档图片#值得收藏:当向数据库导入大量数据时,mysql主键唯一键重复插入,如何丝滑操作并不导入重复数据呢

MySQL 快速删除大量数据

动态SQL从表中执行大量行

Cassandra 中的 ON CONFLICT 运算符