在结束令牌之后启动密钥的令牌排序

时间:2013-07-22 16:43:44

标签: cassandra

我正在尝试使用Cassandra 1.2.6和ColumnFamilyInputFormat在Cassandra中运行一些进程。我正在获得堆栈跟踪。     我尝试切换到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 个答案:

答案 0 :(得分:1)

您正在使用的基础调用是get_range_slices,它返回一系列行。您可以输入开始和结束标记,也可以输入开始和结束标记。看起来您正在使用开始和结束键。

这个问题在于,使用RandomPartitioner(MurmurPartitioner),密钥以令牌顺序存储。令牌通过MD5散列(Murmur散列)获得密钥,因此令牌顺序通常与密钥排序不同。因此,您只能在结束令牌大于开始令牌的位置发出get_range_slices请求。如果您指定了一个键范围,那么如果hash(start)>您的请求将失败hash(end),即使start<也可能发生端。

我不知道你要做什么,但你可能想要使用令牌范围。或者,如果您正在翻阅结果,则将结束键设置为空白,并使用最后一个键作为下一个开始键。