【问题标题】:Best way to import data into Cassandra Cluster in c#在 c# 中将数据导入 Cassandra 集群的最佳方法
【发布时间】:2015-08-16 08:31:47
【问题描述】:

我在 sql server 中有数十亿行数据。我们现在切换到 Cassandra 作为数据仓库来执行分析工作。 SQL 服务器将充当 OLTP,Cassandra 将充当 OLAP。数据导入 cassandra 是通过 datastax c# 驱动程序执行的。我一直在尝试通过datastax c#驱动程序插入cassandra的各种方法。插入大量数据的最佳方法是什么?
我创建了各种 PCO(普通 cassandra 对象),它们是 Cassandra Column 系列的映射器。列族有 30 多列。

[Table("CF_Data")]
internal class CF_Data
{
    [PartitionKey]
    public Guid Date{ get; set; }
    public DateTimeOffset Name { get; set; }
    .................
}

第一种方法: 我正在创建上述类的实例并将其绑定到批处理语句。最后每 1000 行执行一批。

 var batch  =session.CreateBatch();;
        foreach (cf_Data val in lsData)
        {
            try
            {
                if (((count) % 1000) == 1)
                {
                   batch = session.CreateBatch();
                }
                batch.Append(table.Insert(val)); 
                if (count % 1000 == 0)
                {
                    batch.Execute();   
                }
            }
            catch (Exception)
            {
                throw;
            }
            count++;
        }

第二种方法: 通过 Mapper 每行插入数据。

        try
        {
            IMapper mapper = new Mapper(session);
            foreach (CF_Data val in listData)
            {
                try
                {
                    mapper.Insert(val);
                }
                catch (Exception)
                {
                    //throw;
                }
            }
        }
        catch (Exception)
        {
            throw;
        }

我还通过使用 BatchStatement 绑定 CF_Data 实例的每个属性通过 PreparedStatement 插入数据,但是我如何将 CF_Data 实例(要插入的一行)绑定到 PreparedStatement。

PreparedStatement ps = session.Prepare(@"INSERT INTO CF_Data
                (
                    Date,
                    Name, ....
                ) " +
                "VALUES (now(),?, ?, ?, ?,?,?,?,?,?,?,?,?,?,?,?,?)");

什么是最好的网络拓扑(replication_factor、snitch、..etc),可以通过足够的数据副本获得最佳性能以避免单点故障?现在我使用的是最简单的策略和复制因子 3。如 Cassandra 团队所述,读取速度如何加快?

【问题讨论】:

  • 您有太多未解决的问题和相互矛盾的要求。问题是你“不能总是得到你想要的”。您需要非常清楚地了解需求,才能对您的问题做出有意义的回答。我建议阅读 CAP 定理,这说明在 3 件事中你可以得到 2 的平衡。顺便说一句,Cassandra 批处理可能会减慢你的插入。
  • 我的问题是如何在 Cassandra 中获得良好的读写性能。
  • 您的问题没有答案。您可以从以下方面获得 2:良好的读取、良好的写入、容错。这不是二元选择,而是渐变。如果您提高容错能力,则可能会降低写入性能。当您提高读取性能时,您可能会降低写入性能。会有帖子说明要考虑什么以及如何针对不同的事情进行优化(谷歌为此)。我从 Cassandra 中学到的教训是,一个人不会获得 SQL 数据库的所有好处,例如动态更改查询或使用批处理来提高导入速度,但是会有其他方法来实现相同的效果。跨度>
  • 这些场景的最佳工具是 Cassandra 批量加载程序:docs.datastax.com/en/cassandra/2.1/cassandra/tools/…
  • 我对Cassandra一无所知,但是只看你上面的批处理代码,最后一批对象(计数

标签: c# cassandra batch-processing


【解决方案1】:

最好不要使用Insert(***)进行海量数据迁移,cassandra提供"Copy ** from **"从csv导入数据可能会导致超过6M的数据记录超时,更好的方法是@jorgebg 说是 sstableloader 来加载大量数据,这肯定会满足您的需求。

【讨论】:

  • 是否可以使用 sstableloader 将数据从 c# 复制到 Cassandra?
  • 我认为你可以这样做,这里是java实现的参考:planetcassandra.org/blog/…
  • COPY 不是只有在cqlsh 命令行工具中可用吗?
  • @AlexisWilke 是的,COPY是cqlsh提供的命令,需要输入'cqlsh ***'进入会话并使用命令。
  • 是的,看起来 OP 是在询问 C# 解决方案...不过我猜你总是可以运行 system() 调用。
猜你喜欢
  • 2012-10-29
  • 1970-01-01
  • 2016-02-06
  • 2020-04-30
  • 2013-06-27
  • 1970-01-01
  • 2016-02-28
  • 2020-07-28
  • 2018-05-21
相关资源
最近更新 更多