关于Cassandra启动加载索引是报AssertionError的问题及解决

       

       系统环境:

        linux5.4  64位

        jdk1.6.45 64位

        Cassandra1.2.5

        最近在使用Cassandra做一个通讯录的存储工作,通讯录表共建了三个二级索引,有三个复合主键,有一个功能就是根据某二级索引查询出相关的所有联系人,该二级索引的长度大约为32,可以看做是主键的一个子集。

建表语句如下:

CREATE TABLE contactsmimic (
	owneruserid text,
	contactid text,
	phone text,
	label text,//use as timestamp for protoObj
	friendid text,
	ismutual int,
	phoneindex text,
	isdeleted int,
	Json blob,
	PRIMARY KEY (owneruserid, contactid, phone)
) ;
CREATE INDEX relation_friendid ON contactsmimic (friendid);
CREATE INDEX index_isdelete ON contactsmimic (isdeleted);
CREATE INDEX relation_phoneindex ON contactsmimic (phoneindex);

   数据量大概10万条左右,每次启动报如下错误:

  INFO [SSTableBatchOpen:1] 2013-09-03 09:27:36,573 SSTableReader.java (line 169) Opening /var/lib/cassandra/data/contactks/cpmimic/contactks-cpmimic.cpmimic_friendid_idx-ic-1 (485779 bytes)
ERROR [SSTableBatchOpen:1] 2013-09-03 09:27:36,573 CassandraDaemon.java (line 175) Exception in thread Thread[SSTableBatchOpen:1,5,main]
java.lang.AssertionError
	at org.apache.cassandra.utils.ByteBufferUtil.readBytes(ByteBufferUtil.java:401)
	at org.apache.cassandra.io.sstable.IndexSummary$IndexSummarySerializer.deserialize(IndexSummary.java:124)
	at org.apache.cassandra.io.sstable.SSTableReader.loadSummary(SSTableReader.java:426)
	at org.apache.cassandra.io.sstable.SSTableReader.load(SSTableReader.java:360)
	at org.apache.cassandra.io.sstable.SSTableReader.open(SSTableReader.java:201)
	at org.apache.cassandra.io.sstable.SSTableReader.open(SSTableReader.java:154)
	at org.apache.cassandra.io.sstable.SSTableReader$1.run(SSTableReader.java:241)
	at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
	at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)
	at java.util.concurrent.FutureTask.run(FutureTask.java:166)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
	at java.lang.Thread.run(Thread.java:724)

  

     而比较奇怪的是同样的数据放到32位机器上确没有任何错误。

     解决过程也算费劲脑汁,升级JDK,升级Cassandra,升级glibc,升级操作系统,结果一无所获,要么索引直接失效,无法查询,要么加载失败。

     就在快要放弃的时候,发现官网发布了Cassandra2.0.0,死马当活马医,权且一试,启动Cassandra,drop index,create index,还有nodetool rebuild_index,再重启,发现错误消失了,真是庆幸,但还不明确是哪一步使索引重建的。

      还发现一个事情,Cassandra1.2*的索引文件是以ic为标识了,到了Cassandra2.0,是以ja为标识的。

    

      最后,没有问题的部署环境如下:

      Linux6.3   64位

      JDK1.7.25 64位

      Cassandra2.0.0

  

    

PS:当然以上不是解决问题的好方式,并没有找到根本问题,哪位大牛找到问题症结,请不吝赐教

     

猜你喜欢

转载自yunnick.iteye.com/blog/1936523
今日推荐