2013-07-22 74 views
0

我想在Cassandra中使用Cassandra 1.2.6和ColumnFamilyInputFormat運行一些進程。我得到了堆棧跟蹤波紋管。 我嘗試切換到RandomPartitionerMurmurPartitioner(我在兩種情況下都是從開始創建密鑰空間),但問題仍然存在。 如何判斷爲什麼會發生這種情況?結束令牌後開始密鑰的令牌排序

java.lang.RuntimeException: InvalidRequestException(why:Start key's token sorts after end token) 
at org.apache.cassandra.hadoop.ColumnFamilyRecordReader$WideRowIterator.maybeInit(ColumnFamilyRecordReader.java:453) 
at org.apache.cassandra.hadoop.ColumnFamilyRecordReader$WideRowIterator.computeNext(ColumnFamilyRecordReader.java:459) 
at org.apache.cassandra.hadoop.ColumnFamilyRecordReader$WideRowIterator.computeNext(ColumnFamilyRecordReader.java:406) 
at com.google.common.collect.AbstractIterator.tryToComputeNext(AbstractIterator.java:143) 
at com.google.common.collect.AbstractIterator.hasNext(AbstractIterator.java:138) 
at org.apache.cassandra.hadoop.ColumnFamilyRecordReader.getProgress(ColumnFamilyRecordReader.java:103) 
at org.apache.hadoop.mapred.MapTask$NewTrackingRecordReader.getProgress(MapTask.java:514) 
at org.apache.hadoop.mapred.MapTask$NewTrackingRecordReader.nextKeyValue(MapTask.java:539) 
at org.apache.hadoop.mapreduce.MapContext.nextKeyValue(MapContext.java:67) 
at org.apache.hadoop.mapreduce.Mapper.run(Mapper.java:143) 
at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:764) 
at org.apache.hadoop.mapred.MapTask.run(MapTask.java:370) 
at org.apache.hadoop.mapred.LocalJobRunner$Job.run(LocalJobRunner.java:212) 
Caused by: InvalidRequestException(why:Start key's token sorts after end token) 
at org.apache.cassandra.thrift.Cassandra$get_paged_slice_result.read(Cassandra.java:14168) 
at org.apache.thrift.TServiceClient.receiveBase(TServiceClient.java:78) 
at org.apache.cassandra.thrift.Cassandra$Client.recv_get_paged_slice(Cassandra.java:769) 
at org.apache.cassandra.thrift.Cassandra$Client.get_paged_slice(Cassandra.java:753) 
at org.apache.cassandra.hadoop.ColumnFamilyRecordReader$WideRowIterator.maybeInit(ColumnFamilyRecordReader.java:438) 
... 12 more 

回答

1

您使用的底層調用是get_range_slices,它返回一定範圍的行。您可以輸入開始和結束標記,也可以輸入開始和結束標記。看起來你正在使用開始和結束鍵。

問題在於,隨機RandomPartitioner(MurmurPartitioner)中,按照令牌順序存儲密鑰。該令牌是通過MD5哈希(Murmur hashing)密鑰獲得的,因此令牌順序通常與密鑰排序不同。因此,只能在結束標記大於開始標記的情況下發出get_range_slices請求。如果您指定了密鑰範圍,那麼即使開始<結束,如果散列(開始)>散列(結束),您的請求也會失敗。

我不知道你在做什麼,但你可能想使用令牌範圍。或者,如果您要通過結果進行分頁,請將結束鍵設置爲空白並將最後一個鍵用作下一個開始鍵。

相關問題