Cassandra插入1020000条记录需要花费大量时间 - 然后在写入查询期间在一致性为1时崩溃写入超时(0副本

时间:2015-10-26 11:47:32

标签: cassandra cql cassandra-2.0 cassandra-cli

我尝试插入包含多列的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时它崩溃了〜。 但是到那里也需要几分钟。 之后就崩溃了。

2 个答案:

答案 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()