2016-01-13 47 views
0

我正在使用sstableloader实用程序将sstables加载到cassandra。但是我收到以下错误。无法检索端点范围:java.lang.IllegalArgumentException

> java.lang.IllegalArgumentException 
java.lang.RuntimeException: Could not retrieve endpoint ranges: 
    at org.apache.cassandra.tools.BulkLoader$ExternalClient.init(BulkLoader.java:338) 
    at org.apache.cassandra.io.sstable.SSTableLoader.stream(SSTableLoader.java:156) 
    at org.apache.cassandra.tools.BulkLoader.main(BulkLoader.java:106) 
Caused by: java.lang.IllegalArgumentException 
    at java.nio.Buffer.limit(Buffer.java:275) 
    at org.apache.cassandra.utils.ByteBufferUtil.readBytes(ByteBufferUtil.java:543) 
    at org.apache.cassandra.serializers.CollectionSerializer.readValue(CollectionSerializer.java:124) 
    at org.apache.cassandra.serializers.MapSerializer.deserializeForNativeProtocol(MapSerializer.java:101) 
    at org.apache.cassandra.serializers.MapSerializer.deserializeForNativeProtocol(MapSerializer.java:30) 
    at org.apache.cassandra.serializers.CollectionSerializer.deserialize(CollectionSerializer.java:50) 
    at org.apache.cassandra.db.marshal.AbstractType.compose(AbstractType.java:68) 
    at org.apache.cassandra.cql3.UntypedResultSet$Row.getMap(UntypedResultSet.java:287) 
    at org.apache.cassandra.config.CFMetaData.fromSchemaNoTriggers(CFMetaData.java:1824) 
    at org.apache.cassandra.config.CFMetaData.fromThriftCqlRow(CFMetaData.java:1117) 
    at org.apache.cassandra.tools.BulkLoader$ExternalClient.init(BulkLoader.java:330) 
    ... 2 mor 

我使用加载的SSTable的命令是

$bin/sstableloader -d nodename -u username -pw password path/to/sstable/keyspacename/tablename 

这是工作几天就回来。我是不知道什么改变和如何调试呢? 我正在使用datastax。 我从cluster.i.e中的同一节点加载sstable,我的源节点和目标节点相同。 有人看过这个错误吗? Cassandra版本:2.1 任何帮助表示赞赏。

回答

0

我又遇到了这个问题,所以为了根本原因调试了一下。问题在于,如果在任何时候通过删除某列来更改cassandra表。它会触发sstableLoader的错误。这就是为什么放下桌子并重新创建它的原因。

+0

你找到/提交一个Cassandra JIRA吗? – Ztyx

+0

是的,我做到了。这里是link.https://issues.apache.org/jira/browse/CASSANDRA-11572,看起来它将在cassandra 2.1.13中修复 – root545

1

在堆栈跟踪的异常来源于这段代码:

if (version >= Server.VERSION_3) 
    { 
     int size = input.getInt(); 
     if (size < 0) 
      return null; 

     return ByteBufferUtil.readBytes(input, size); // HERE ! 
    } 

我想知道,如果你装的是已经由卡桑德拉2.1或更早版本生成sstables ....因为这个问题似乎是在字节编码层面。

您的SSTables也有可能损坏。

你是如何获得这些sstables的?从另一个Cassandra实例的副本?由CQLSSTableWriter生成?

+0

我生成这些使用CQLSSTableWriter。 – root545

+0

终于解决了。不知何故,我的旧密钥空间不接受sstable加载程序。我创造了一个新的,它的工作。 – root545