2013-03-16 18 views
8

Jestem nowicjuszem astyanax i wypróbowuję niektóre przykładowe programy i otrzymuję ten błąd. To jest prosty zapis i wygląda na to, że robię coś podstawowego. Nie używa się kluczy złożonych.Astyanax: prosty zapis rzucający ten wyjątek: za mało bajtów, aby odczytać wartość komponentu

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) 

Oto kod:

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(); 

Oto tabela opisują:

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'}; 
+0

jeden inny aktualizacji: tabela jest tworzona przy użyciu CQL3 i stosowany jest wersja Cassandra 1.2.2 Także jeśli mogę użyć polecenia cql3 wstawić wiersz, jego pracy grzywny. ColumnFamily TAG_CF = ColumnFamily.newColumnFamily ("grd.test", StringSerializer.get(), StringSerializer.get()); \t \t keyspace.prepareQuery (TAG_CF) .withCql ("wstawić grd.test (kol1, kolumna2, Col3)" + "wartości ('ID2', 'sample1', 'sample1');") \t \t \t \t \t \t \t \t \t .execute(); Więc jeśli używam MutationBatch, to nadal nie działa. Naprawdę doceniam pomoc. dzięki. – srrepaka

+0

Zgłosiłem problem, aby uzyskać przemyślenia .. https://github.com/Netflix/astyanax/issues/314 @Blair - Czy pracowaliście przy użyciu COMPACT STORAGE - formularz pre 1.2 (mam zamiar to eksperymentować. .) –

+0

@ Jerish Sam David: Mam klucz złożony jako klucz podstawowy. Otrzymuję: KOMPATYWNY PRZECHOWYWANIE ze złożonym kluczem podstawowym pozwala na nie więcej niż jedną kolumnę, która nie jest częścią klucza PRIMARY Jak rozwiązać ten problem, zamiast zmieniać schemat –

Odpowiedz

16

Jestem również nowy w Astyanax i zbliżą się do tych samych wyjątków. Wyjątek wynika z niedopasowania między tym, co Astyanax - obiekty oparte na Thrift uważają, że definicja kolumny powinna wyglądać i jak to jest przechowywać w wersji 1.2+ przy użyciu CQL 3. Nauczyłem się określając COMPACT STORAGE, aby tabela została utworzona w formacie pre 1.2 pozwól mi współdziałać z nim za pośrednictwem obiektów opartych na oszczędzaniu. FWIW: Buduję Astyanax ze źródła, ale widziałem 1.56.34 w centrum maven; Chciałbym również zaktualizować to.

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

Zobacz Working with pre-CQL 3 applications

+0

Czy jest jakaś praca nad tym, aby obiekty Astyanax oparte na oszczędzaniu rozumiały definicję kolumny CQL3? Zastanawiam się, czy mój nowy schemat Cassandry powinien używać CQL3 wszędzie, czy używać programistycznej metody tworzenia rodzin kolumn. –

+0

Też mam podobny wyjątek przy użyciu 1.56.37 i testowanie ColumnPrefixDistributedRowLock. –

+0

Łącze nie działa, zostało przeniesione do [Praca z aplikacjami pre-CQL 3] (http://docs.datastax.com/en/cql/3.0/cql/ddl/ddl_legacy_tables_c.html) –

Powiązane problemy