【发布时间】: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