2012-04-12 14 views
5

He seguido numerosos ejemplos sobre la inserción de datos en una base de datos de Cassandra y cada vez que obtengo una excepción sobre familias de columnas no configuradas.¿La forma más sencilla de insertar datos en una nueva base de datos de Cassandra utilizando la API de Hector?

Exception in thread "main" me.prettyprint.hector.api.exceptions.HInvalidRequestException: InvalidRequestException(why:unconfigured columnfamily TestColumnFamily) 
    at me.prettyprint.cassandra.service.ExceptionsTranslatorImpl.translate(ExceptionsTranslatorImpl.java:45) 
    at me.prettyprint.cassandra.connection.HConnectionManager.operateWithFailover(HConnectionManager.java:252) 
    at me.prettyprint.cassandra.model.ExecutingKeyspace.doExecuteOperation(ExecutingKeyspace.java:97) 
    at me.prettyprint.cassandra.model.MutatorImpl.execute(MutatorImpl.java:243) 
    at me.prettyprint.cassandra.model.MutatorImpl.insert(MutatorImpl.java:69) 
    at CassandraInterface.main(CassandraInterface.java:101) 
Caused by: InvalidRequestException(why:unconfigured columnfamily TestColumnFamily) 
    at org.apache.cassandra.thrift.Cassandra$batch_mutate_result.read(Cassandra.java:19477) 
    at org.apache.cassandra.thrift.Cassandra$Client.recv_batch_mutate(Cassandra.java:1035) 
    at org.apache.cassandra.thrift.Cassandra$Client.batch_mutate(Cassandra.java:1009) 
    at me.prettyprint.cassandra.model.MutatorImpl$3.execute(MutatorImpl.java:246) 
    at me.prettyprint.cassandra.model.MutatorImpl$3.execute(MutatorImpl.java:243) 
    at me.prettyprint.cassandra.service.Operation.executeAndSetResult(Operation.java:103) 
    at me.prettyprint.cassandra.connection.HConnectionManager.operateWithFailover(HConnectionManager.java:246) 
    ... 4 more 

así que busqué la forma de configurar y hallaron

BasicColumnFamilyDefinition cfdef = new BasicColumnFamilyDefinition(); 
    cfdef.setKeyspaceName(keyspaceName); 
    cfdef.setName(columnFamilyName); 
    cfdef.setKeyValidationClass(ComparatorType.UTF8TYPE.getClassName()); 
    cfdef.setComparatorType(ComparatorType.UTF8TYPE); 

Eso no configurar la familia de columnas.

Todos los ejemplos que he encontrado son fragmentos sin contexto, por lo que no sé qué importar o configurar. Además, algunos ejemplos parecen mezclar el Hector API v2 y el Hector API original, así que cuando los utilizo, obtengo errores de compilador de "clase no encontrada" o "función no encontrada".

Respuesta

3

Hector CassandraClusterTest.java

@Test 
public void testAddDropColumnFamily() throws Exception { 
     ColumnFamilyDefinition cfDef = HFactory.createColumnFamilyDefinition("Keyspace1", "DynCf"); 
     cassandraCluster.addColumnFamily(cfDef); 
     String cfid2 = cassandraCluster.dropColumnFamily("Keyspace1", "DynCf"); 
     assertNotNull(cfid2); 

     // Let's wait for agreement 
     cassandraCluster.addColumnFamily(cfDef, true); 
     cfid2 = cassandraCluster.dropColumnFamily("Keyspace1", "DynCf", true); 
     assertNotNull(cfid2); 
} 

Para resumir, espacio de claves y la familia de columnas deben existir antes de tratar de insertar datos en ellos. Usted puede manejar esto en su código, comprobar para ver si es que existen, usando el ejemplo anterior como una buena referencia - o modificar a través de la interfaz de línea de comandos (cassandra-cli)

Hector Unit Tests

1

Esperemos que haya He podido hacer esto ahora, pero así es como lo hice.

Tengo un cassandra instalar (usando 1.1.4) y suponiendo que haya todos los directorios necesarios creado:

/var/lib/cassandra 
/var/lib/casandra/data 
/var/lib/cassnadra/commitlogs 
/var/lib/cassandra/saved_caches 

INICIO usando:

bin/cassandra -f 

puedo crear un script sencillo llamado schema_create.txt:

CREATE KEYSPACE TEST
CON strategy_class = 'org.apache.cassandra.locator.SimpleStrategy' AND strategy_options: replication_factor = '1'; use TEST; CREAR COLUMNFAMILY TestColumnFamily ( userid varchar, primer nombre varchar, apellido varchar, PRIMARY KEY (userid));

Entonces, desde la línea de comandos se puede ejecutar este script utilizando la nueva herramienta CQL que viene con Cassandra de la siguiente manera:

bin/cqlsh --cql3 < schema_createt.txt 

Esto instalará un espacio de claves denominado test con una familia columna llamada testcolumnfamily en cassandra .

Ahora desde dentro de la aplicación Java puede simplemente crear una clase de prueba que tiene un método main (asumiré su entorno de desarrollo tiene todas las dependencias necesarias si el uso de Maven):

try { mutador mutador = HFactory.createMutator (kweyspace, stringSerializer.get()); mutator.addInsertion ("iamauser", "tescolumnfamily", HFactory.createStringColumn ("primer nombre", "Juan")); mutator.addInsertion ("iamauser", "testcolumnfamily", HFactory.createStringColumn ("lastname", "Smith")); mutator.execute(); } catch (HectorException Hex) {Hex.printStackTrace(); } finalmente {cluster.getConnectionManger(). Shutdown(); }

Ahora vuelve a la línea de comandos y escriba en Cassandra usando:

$bin/cqlsh --cql3 
use test; 
select * from testcolumnfamily; 

Esto insertará una fila de datos en su base de datos Cassandra con el iamauser clave, y el nombre de John Smith y que puede verificar como se muestra arriba usando la herramienta cqlsh.

Espero que esto ayude.

Cuestiones relacionadas