2016-01-13 51 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