我有这个奇怪的问题 - 给出以下两个模型:
[Table(Name = "pretty_fast_table", Keyspace = "funky_stuff")]
internal class PrettyFastTable
{
[Column(name: "message_number")]
[PartitionKey]
public long MessageNumber { get; set; }
[Column(name: "time_stamp")]
[ClusteringKey]
public DateTime TimeStamp { get; set; }
[Column(name: "some_value")]
public decimal SomeValue { get; set; }
[Column(name: "is_a_cool_entry")]
public bool IsACoolEntry { get; set; }
}
[Table(Name = "pretty_slow_table", Keyspace = "funky_stuff")]
internal class PrettySlowTable
{
[Column(name: "message_number")]
[PartitionKey]
public long MessageNumber { get; set; }
[Column(name: "some_other_value")]
[ClusteringKey]
public decimal SomeOtherValue { get; set; }
[Column(name: "some_other_other_value")]
public decimal? SomeOtherOtherValue { get; set; }
[Column(name: "percentage")]
public decimal Percentage { get; set; }
[Column(name: "count")]
public int Count { get; set; }
[Column(name: "my_value")]
public decimal MyValue { get; set; }
}
将50万个条目写入PrettyFastTable
需要< 1分钟。将50万个条目写入PrettySlowTable
经常拍摄的> 8分钟。我用来写两种类型的条目的代码如下:
public async Task ExecuteAsync(IEnumerable<T> partition, long partitionKey)
{
var entitiesArr = partition.ToArray();
var size = calculatedBatchSize;
var groups = entitiesArr
.Select((item, idx) => new {item, idx})
.GroupBy(x => x.idx / BatchSize)
.Select(g => g.Select(x => x.item));
await BatchInsertAsync(groups, partitionKey);
break;
}
private async Task BatchInsertAsync(IEnumerable<IEnumerable<T>> groups, long partitionKey)
{
foreach (var group in groups)
{
var batch = new BatchStatement();
var groupArr = group.ToArray();
batch.SetBatchType(BatchType.Unlogged);
batch.SetRoutingValues(partitionKey);
foreach (var entry in groupArr)
{
batch.Add(_table.Insert(entry, false).SetTTL(TTL));
}
await _session.ExecuteAsync(batch);
}
}
唯一的区别是IEnumerable<PrettyFastTable>
分区通常比另一个分区大得多。我不明白 - 为什么这么慢?
我的Cassandra集群由3个节点组成,对于配置内容,它基本上是默认节点。
答案 0 :(得分:0)
不应将批次用于批量装载。
来自"Using and Misusing Matches" documentation:
经常错误地使用批次来尝试优化性能。未记录的批处理需要协调程序来管理插入,这会对协调程序节点造成沉重的负担。如果其他节点拥有分区密钥,则协调器节点需要处理网络跃点,导致传送效率低下。在对同一分区键进行更新时使用未记录的批次。
有关详细信息,请参阅DataStax C# driver FAQ。
Batch loading without the BATCH keyword还有一篇很好的文章。