【问题标题】:Error using sstableloader on cassandra在 cassandra 上使用 sstableloader 时出错
【发布时间】:2017-08-16 10:47:54
【问题描述】:

我是 cassandra 新手。我看到 Cassandra cqlsh 5.0.1 出现以下错误 |卡桑德拉 2.1.2 | CQL 规范 3.2.0

这是我在使用 sstableloader 时看到的错误:

./sstableloader -d <hostname> -u <user> -pw <pass> <filename>
Could not retrieve endpoint ranges: 
java.lang.IllegalArgumentException
java.lang.RuntimeException: Could not retrieve endpoint ranges: 
    at org.apache.cassandra.tools.BulkLoader$ExternalClient.init(BulkLoader.java:337)
    at org.apache.cassandra.io.sstable.SSTableLoader.stream(SSTableLoader.java:157)
    at org.apache.cassandra.tools.BulkLoader.main(BulkLoader.java:105)
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:122)
    at org.apache.cassandra.serializers.MapSerializer.deserializeForNativeProtocol(MapSerializer.java:99)
    at org.apache.cassandra.serializers.MapSerializer.deserializeForNativeProtocol(MapSerializer.java:28)
    at org.apache.cassandra.serializers.CollectionSerializer.deserialize(CollectionSerializer.java:48)
    at org.apache.cassandra.db.marshal.AbstractType.compose(AbstractType.java:66)
    at org.apache.cassandra.cql3.UntypedResultSet$Row.getMap(UntypedResultSet.java:282)
    at org.apache.cassandra.config.CFMetaData.fromSchemaNoTriggers(CFMetaData.java:1793)
    at org.apache.cassandra.config.CFMetaData.fromThriftCqlRow(CFMetaData.java:1101)
    at org.apache.cassandra.tools.BulkLoader$ExternalClient.init(BulkLoader.java:329)
    ... 2 more

奇怪的是,我只在特定的键空间中收到此错误。当我创建一个新的键空间(使用与问题键空间相同的命令并尝试 sstableloader 时,我没有看到相同的问题。当我设置 DEBUG 日志级别时,我看到以下内容:

DEBUG [Thrift:1] 2015-02-20 00:32:38,006 CustomTThreadPoolServer.java:212 - Thrift transport error occurred during processing of message.
org.apache.thrift.transport.TTransportException: null
    at org.apache.thrift.transport.TIOStreamTransport.read(TIOStreamTransport.java:132) ~[libthrift-0.9.1.jar:0.9.1]
    at org.apache.thrift.transport.TTransport.readAll(TTransport.java:84) ~[libthrift-0.9.1.jar:0.9.1]
    at org.apache.thrift.transport.TFramedTransport.readFrame(TFramedTransport.java:129) ~[libthrift-0.9.1.jar:0.9.1]
    at org.apache.thrift.transport.TFramedTransport.read(TFramedTransport.java:101) ~[libthrift-0.9.1.jar:0.9.1]
    at org.apache.thrift.transport.TTransport.readAll(TTransport.java:84) ~[libthrift-0.9.1.jar:0.9.1]
    at org.apache.thrift.protocol.TBinaryProtocol.readAll(TBinaryProtocol.java:362) ~[libthrift-0.9.1.jar:0.9.1]
    at org.apache.thrift.protocol.TBinaryProtocol.readI32(TBinaryProtocol.java:284) ~[libthrift-0.9.1.jar:0.9.1]
    at org.apache.thrift.protocol.TBinaryProtocol.readMessageBegin(TBinaryProtocol.java:191) ~[libthrift-0.9.1.jar:0.9.1]
    at org.apache.thrift.TBaseProcessor.process(TBaseProcessor.java:27) ~[libthrift-0.9.1.jar:0.9.1]
    at org.apache.cassandra.thrift.CustomTThreadPoolServer$WorkerProcess.run(CustomTThreadPoolServer.java:202) ~[apache-cassandra-2.1.2.jar:2.1.2]
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) [na:1.7.0_65]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) [na:1.7.0_65]
    at java.lang.Thread.run(Thread.java:745) [na:1.7.0_65]

不确定这是否真的是一个错误,因为根据一些在线链接,我看到无论设置调试日志级别时都会出现此消息

【问题讨论】:

    标签: cassandra


    【解决方案1】:

    我正在使用 Cassandra 2.1.8 进行尝试。您看到的错误是这个 Cassandra 代码块的产物:

    try
    {
        // Query endpoint to ranges map and schemas from thrift
        InetAddress host = hostiter.next();
        Cassandra.Client client = createThriftClient(host.getHostAddress(), rpcPort, this.user, this.passwd, this.transportFactory);
    
        setPartitioner(client.describe_partitioner());
        Token.TokenFactory tkFactory = getPartitioner().getTokenFactory();
    
        for (TokenRange tr : client.describe_ring(keyspace))
        {
            Range<Token> range = new Range<>(tkFactory.fromString(tr.start_token), tkFactory.fromString(tr.end_token), getPartitioner());
            for (String ep : tr.endpoints)
            {
                addRangeForEndpoint(range, InetAddress.getByName(ep));
            }
        }
    
        String cfQuery = String.format("SELECT * FROM %s.%s WHERE keyspace_name = '%s'",
                                     Keyspace.SYSTEM_KS,
                                     SystemKeyspace.SCHEMA_COLUMNFAMILIES_CF,
                                     keyspace);
        CqlResult cfRes = client.execute_cql3_query(ByteBufferUtil.bytes(cfQuery), Compression.NONE, ConsistencyLevel.ONE);
    
    
        for (CqlRow row : cfRes.rows)
        {
            String columnFamily = UTF8Type.instance.getString(row.columns.get(1).bufferForName());
            String columnsQuery = String.format("SELECT * FROM %s.%s WHERE keyspace_name = '%s' AND columnfamily_name = '%s'",
                                                Keyspace.SYSTEM_KS,
                                                SystemKeyspace.SCHEMA_COLUMNS_CF,
                                                keyspace,
                                                columnFamily);
            CqlResult columnsRes = client.execute_cql3_query(ByteBufferUtil.bytes(columnsQuery), Compression.NONE, ConsistencyLevel.ONE);
    
            CFMetaData metadata = CFMetaData.fromThriftCqlRow(row, columnsRes);
            knownCfs.put(metadata.cfName, metadata);
        }
        break;
    }
    catch (Exception e)
    {
        if (!hostiter.hasNext())
            throw new RuntimeException("Could not retrieve endpoint ranges: ", e);
    }
    

    因此,您遇到的各种错误都汇总在消息“无法检索端点范围”中。如果不下载 Cassandra 源代码并通过它进行调试,您将无法判断您的具体错误是什么。这就是我所做的。

    我的架构是使用https://github.com/DonBranson/cql_schema_versioning 在多步骤过程中构建的。一步完成:

    ALTER TABLE user_reputation DROP ban_votes;
    

    DROP 会触发 Cassandra BulkLoader 错误,该错误会打印您看到的错误消息。但是,无数其他错误情况显示相同的消息。错误消息完全没有帮助我们实际解决问题。

    我还发现,如果您像这样加密节点间通信,BulkLoader 将无法工作:

    internode_encryption: all
    

    因此,在我运行的 DigitalOcean 云中,我必须加密节点间通信,它会失败,但至少它会显示一条指示连接失败的消息:

    ../apache-cassandra-2.1.8/bin/sstableloader -d 192.168.56.101 makeyourcase/arenas
    Established connection to initial hosts
    Opening sstables and calculating sections to stream
    Skipping file makeyourcase-arenas.arenas_name_idx-jb-2-Data.db: column family makeyourcase.arenas.arenas_name_idx doesn't exist
    Skipping file makeyourcase-arenas.arenas_name_idx-jb-1-Data.db: column family makeyourcase.arenas.arenas_name_idx doesn't exist
    Streaming relevant part of makeyourcase/arenas/makeyourcase-arenas-jb-2-Data.db makeyourcase/arenas/makeyourcase-arenas-jb-1-Data.db to [/192.168.56.102, /192.168.56.101]
    ERROR 01:46:39 [Stream #a7e5fb80-3593-11e5-9b52-cdde6a46fde5] Streaming error occurred
    java.net.ConnectException: Connection refused
        at sun.nio.ch.Net.connect0(Native Method) ~[na:1.7.0_71]
    

    【讨论】:

      猜你喜欢
      • 2015-08-27
      • 2019-07-16
      • 2015-06-29
      • 1970-01-01
      • 2011-10-13
      • 2019-03-16
      • 2014-11-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多