我尝试插入包含多列的1020000条记录 (列物理大小我的变化中有几个是blob)。
我的群集设置: 2个节点 使用:
create keyspace myks with replication = {'class':'SimpleStrategy','replication_factor':2};
尝试使用c#client插入此数据时:
我得到了Cassandra.WriteTimeoutException
-
一致性写入查询期间的Cassandra超时(0个副本确认需要写入1)
在尝试从控制台检索数据时,我遇到了错误:
errors = {},last_host = 192.168.180.93
有什么建议吗?
我的架构是:
create table my_table(
id bigint,
seqid int,
activeeventtime int,
eventtime int,
eventtype text,
width int,
height int,
x int,
y int,
buttonstatetype text,
eventtype text,
statetype text,
eid int,
directiontype text,
gdistance int,
griddeclaration boolean,
pathdeclaration boolean,
child blob,
mpath blob,
primary key(id, seqid ))
我试图插入数据的一些代码片段:
for (long i = 1; i <= 10000; i++)
{
for (int j = 0; j < enericEvents.Count;++)
{
GenericSessionEvent currEvent = genericEvents[j];
ser1.Serialize(stream1, currEvent.Child); ser2.Serialize(stream2,
currEvent.Element);
BoundStatement boundStatement = preparedStatement.Bind
(i, j, ....stream1.GetBuffer(), stream2.GetBuffer());
await session.ExecuteAsync(boundStatement);
}
}
我在日志中看到的看起来很奇怪的是:
WARN [CompactionExecuter:13]... BigTableWriter.java:184 - Writing large
partition ...tableNAme (107865330 bytes).
我还想提一下,当变量值大约为30时它崩溃了〜。 但是到那里也需要几分钟。 之后就崩溃了。
答案 0 :(得分:0)
<强> 1。你使用ExecuteAsync吗?
session.ExecuteAsync(statement);
异步是好的,因为Cassandra能够很好地处理并行查询。但是,一次执行可能会导致10.000个查询过多。
如果您这样做,请尝试使用“执行”。这对Cassandra有很大帮助。
<强> 2。你使用PreparedStatement吗?
var preparedStatement = session.Prepare("INSERT INTO table (key, column_name1, column_name2) VALUES (?, ?, ?);");
var boundStatement = preparedStatement.Bind(key, value1, value2);
session.Execute(boundStatement);
这再一次是个好主意。但要小心,准备一份声明需要付出代价。您必须尽可能重复使用已准备好的语句。这样你就会有时间。
如果不这样做,你应该尝试,但要正确使用它们。
第3。你有一些非常大的blob要插入吗?
从客户端记录数据的大小。您也可以给我们表格中的nodetool cfstats。
如果某些值大于1Mo,则可能导致延迟问题。您的网络可能是问题所在。但我宁愿认为Cassandra堆是问题所在。当Cassandra堆充满大值时,GC更频繁,更长。在Cassandra system.log文件中是否有任何长GC(超过200毫秒)的日志?
答案 1 :(得分:0)
您正在10,000个分区中插入10.000 x enericEvents.Count
行。
enericEvents.Count 多少钱?
对于单个 i ,所有 enericEvents.Count 都转到同一个分区。 107865330字节的分区(> 100 Mo)太大了。
在主键中,第一列名称是分区键,第二列是群集键。解决方案是不使用任何群集密钥。你可以这样做:
primary key((id, seqid))
您应该使用Execute()
代替ExecuteAsync()
。