Astyanax:简单写入抛出此异常:没有足够的字节读取组件的值。

9

我对Astyanax很新,并尝试一些示例程序,但出现了这个错误。这是一个简单的写入操作,看起来我做错了一些基本的东西。没有使用复合键。

Caused by: InvalidRequestException(why:Not enough bytes to read value of component 0)
    at org.apache.cassandra.thrift.Cassandra$batch_mutate_result.read(Cassandra.java:20833)
    at org.apache.thrift.TServiceClient.receiveBase(TServiceClient.java:78)
    at org.apache.cassandra.thrift.Cassandra$Client.recv_batch_mutate(Cassandra.java:964)
    at org.apache.cassandra.thrift.Cassandra$Client.batch_mutate(Cassandra.java:950)
    at com.netflix.astyanax.thrift.ThriftKeyspaceImpl$1$1.internalExecute(ThriftKeyspaceImpl.java:120)
    at com.netflix.astyanax.thrift.ThriftKeyspaceImpl$1$1.internalExecute(ThriftKeyspaceImpl.java:117)
    at com.netflix.astyanax.thrift.AbstractOperationImpl.execute(AbstractOperationImpl.java:56)

这里是代码:

    AstyanaxContext<Keyspace> context = new AstyanaxContext.Builder()
        .forCluster(CLUSTER_NAME)
        .forKeyspace(keySpaceName)
        .withAstyanaxConfiguration(new AstyanaxConfigurationImpl()      
            .setDiscoveryType(NodeDiscoveryType.RING_DESCRIBE)
            .setCqlVersion("3.0.0")
            .setTargetCassandraVersion("1.2")
        )
        .withConnectionPoolConfiguration(new ConnectionPoolConfigurationImpl("MyConnectionPool")
            .setPort(50825)
            .setMaxConnsPerHost(10)
            .setSeeds("nodename:50825")
            .setConnectTimeout(20000)
        )
        .withConnectionPoolMonitor(new CountingConnectionPoolMonitor())
        .buildKeyspace(ThriftFamilyFactory.getInstance());

    context.start();
    System.out.println("getting context.. done ");
    Keyspace keyspace = context.getEntity();
    MutationBatch m = keyspace.prepareMutationBatch();

    ColumnFamily<String, String> colFam = new ColumnFamily<String, String>("test",
            StringSerializer.get(), StringSerializer.get());

    m.withRow(colFam, "abc")
        .putColumn("col2", "test1", null);
    m.execute();

以下是表格描述:

CREATE TABLE test (
 col1 text PRIMARY KEY,
 col2 text,
 col3 text
) WITH
 bloom_filter_fp_chance=0.010000 AND
 caching='KEYS_ONLY' AND
 comment='' AND
 dclocal_read_repair_chance=0.000000 AND
 gc_grace_seconds=864000 AND
 read_repair_chance=0.100000 AND
 replicate_on_write='true' AND
 populate_io_cache_on_flush='false' AND
 compaction={'class': 'SizeTieredCompactionStrategy'} AND
 compression={'sstable_compression': 'SnappyCompressor'};

另一个更新: 该表是使用CQL3创建的,卡桑德拉版本为1.2.2此外,如果我使用cql3命令插入行,它能正常工作。ColumnFamily <String,String> TAG_CF = ColumnFamily.newColumnFamily(“grd.test”,StringSerializer.get(),StringSerializer.get());keyspace.prepareQuery(TAG_CF).withCql(“insert into grd.test(col1,col2,col3)” +“values('id2','sample1','sample1');”)。执行();因此,如果我使用MutationBatch,它仍然无法正常工作。非常感谢一些帮助。谢谢。 - srrepaka
提交了一个问题以获取想法.. https://github.com/Netflix/astyanax/issues/314 @Blair - 你是否通过使用COMPACT STORAGE - pre 1.2形式来解决了这个问题(我即将尝试..) - Jerish Sam David
@ Jerish Sam David:我的复合键作为主键。 我得到的是:使用复合主键的COMPACT STORAGE最多只允许一个不属于主键的列。除了更改模式,如何解决这个问题? - S Kr
2个回答

17

我也是 Astyanax 的新手,并遇到了相同的异常。该异常是由于 Astyanax 基于 Thrift 的对象认为列定义应该是什么样子,与使用 CQL 3 存储在 1.2+ 中的实际情况不符。我了解到,指定 COMPACT STORAGE 使表以 pre 1.2 格式创建,可以让我通过基于 Thrift 的对象来交互。顺便说一下:我正在从源代码构建 Astyanax,但在 Maven 中央库中看到了 1.56.34;我也会进行更新。

CREATE TABLE test (
 col1 text PRIMARY KEY,
 col2 text,
 col3 text
) WITH COMPACT STORAGE AND
...

请参见处理早于CQL 3的应用程序


有关Astyanax Thrift-based对象是否能理解CQL3列定义的工作,是否有进行?我在想我的新Cassandra架构是否应该在任何地方都使用CQL3,还是使用编程方法创建列族。 - Blair Zajac
我也在使用1.56.37版本并测试ColumnPrefixDistributedRowLock时遇到了类似的异常。 - Blair Zajac
链接已失效,它已经移动到使用预CQL 3应用程序 - Rob Seed

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接