0

我正在尝试使用 Cassandra 1.2.6 和 ColumnFamilyInputFormat 在 Cassandra 中运行一些进程。我得到下面的堆栈跟踪。我尝试切换到两者RandomPartitioner并且MurmurPartitioner(我在两种情况下都从开始创建了键空间),但问题仍然存在。如何弄清楚为什么会发生这种情况?

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
4

1 回答 1

1

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

这样做的问题是,对于 RandomPartitioner (MurmurPartitioner),密钥是按令牌顺序存储的。令牌是通过对密钥进行 MD5 哈希(Murmur 哈希)获得的,因此令牌顺序通常与密钥排序不同。因此,您只能在结束令牌大于开始令牌的情况下发出 get_range_slices 请求。如果您指定一个键范围,如果 hash(start) > hash(end),您的请求将失败,即使 start < end 也会发生这种情况。

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

于 2013-07-23T08:49:30.413 回答