2013-03-16 7 views
8

Sono nuovo ad astyanax e sto provando alcuni programmi di esempio e ottenendo questo errore. Questa è una semplice scrittura e sembra che stia facendo qualcosa di sbagliato di base. Non usare le chiavi composite.Astyanax: semplice scrittura di lancio di questa eccezione: Non abbastanza byte per leggere il valore del componente

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) 

Ecco il codice:

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

Ecco la tabella di descrivere:

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

Un altro aggiornamento: La tabella viene creata usando CQL3 e la versione utilizzata è Cassandra 1.2.2 Anche se io uso un comando cql3 per inserire una riga, relativo funzionamento benissimo. ColumnFamily TAG_CF = ColumnFamily.newColumnFamily ("grd.test", StringSerializer.get(), StringSerializer.get()); \t \t keyspace.prepareQuery (TAG_CF) .withCql ("insert into grd.test (col1, col2, col3)" + "valori ('ID2', 'sample1', 'sample1');") \t \t \t \t \t \t \t \t \t \t .execute(); Quindi se uso MutationBatch non funziona ancora. Apprezzo davvero un po 'di aiuto. grazie. – srrepaka

+0

Archiviato un problema per ottenere pensieri .. https://github.com/Netflix/astyanax/issues/314 @Blair - Avete lavorato attorno ad avere COMPACT STORAGE - pre 1.2 form (sto per sperimentarlo. .) –

+0

@ Jerish Sam David: ho una chiave composita come chiave primaria. Ottengo: MEMORIZZAZIONE COMPATTA con PRIMARY KEY composito non consente più di una colonna non parte del PRIMARY KEY Come risolvere questo diverso da modificare lo schema –

risposta

16

Sono anche una novità per Astianatte e incontrando la le stesse eccezioni. L'eccezione è dovuta a una mancata corrispondenza tra ciò che gli oggetti basati su Astyanax Thrift pensano che la definizione della colonna debba apparire e il modo in cui è memorizzata in 1.2+ usando CQL 3. Ho imparato a specificare COMPACT STORAGE in modo che la tabella sia creata nel formato pre 1.2 permettimi di interagire con esso tramite gli oggetti basati su Thrift. FWIW: Sto costruendo Astyanax dal sorgente, ma ho visto un 1.56.34 in Maven centrale; Vorrei aggiornare anche a questo.

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

Vedi Working with pre-CQL 3 applications

+0

Esiste qualche lavoro sull'avere Astyanax Gli oggetti basati su Thrift comprendono la definizione di colonna CQL3? Mi chiedo se il mio nuovo schema di Cassandra debba usare CQL3 ovunque o utilizzare il metodo programmatico per creare famiglie di colonne. –

+0

Ho anche ottenuto un'eccezione simile usando 1.56.37 e test ColumnPrefixDistributedRowLock. –

+0

Il collegamento è morto, è stato spostato in [Utilizzo di applicazioni pre-CQL 3] (http://docs.datastax.com/en/cql/3.0/cql/ddl/ddl_legacy_tables_c.html) –