Как установить счетчик с помощью Гектора/Кассандры?

Я должен использовать счетчик с Гектором для Кассандры. Я копирую/вставляю этот тестовый пример из тестового кода от hector :

    Mutator<String> m = createMutator(keyspace, se);
    MutationResult mr = m.insertCounter( // exception here.
     "k", "Counter1", createCounterColumn("name", 5)); 
    assertTrue("Execution time on single counter insert should be > 0", mr.getExecutionTimeMicro() > 0);
    assertTrue("Should have operated on a host", mr.getHostUsed() != null);
    CounterQuery<String, String> counter = new ThriftCounterColumnQuery<String,String>(keyspace, se, se);
    counter.setColumnFamily("Counter1").setKey("k").setName("name");
    assertEquals(new Long(5), counter.execute().get().getValue());

Но я получаю это исключение в строке insertCounter, потому что Counter1 не настроен, он говорит:

me.prettyprint.hector.api.exceptions.HInvalidRequestException: InvalidRequestException(why:unconfigured columnfamily Counter1)
    at me.prettyprint.cassandra.service.ExceptionsTranslatorImpl.translate(ExceptionsTranslatorImpl.java:45) ~[hector-core-1.0-5.jar:na]
    at me.prettyprint.cassandra.connection.HConnectionManager.operateWithFailover(HConnectionManager.java:264) ~[hector-core-1.0-5.jar:na]
    at me.prettyprint.cassandra.model.ExecutingKeyspace.doExecuteOperation(ExecutingKeyspace.java:97) ~[hector-core-1.0-5.jar:na]
    at me.prettyprint.cassandra.model.MutatorImpl.execute(MutatorImpl.java:243) ~[hector-core-1.0-5.jar:na]
    at me.prettyprint.cassandra.model.MutatorImpl.insertCounter(MutatorImpl.java:285) ~[hector-core-1.0-5.jar:na]

Хорошо, но тестовый пример не настраивает Counter1? Как мне это настроить?

Спасибо.


person Istao    schedule 28.05.2012    source источник


Ответы (1)


Вы создаете семейство столбцов на своем сервере Cassandra. Одним из распространенных способов является использование инструмента cqlsh.

cqlsh

USE Keyspace1;
CREATE COLUMNFAMILY counter1 (example text PRIMARY KEY) 
  WITH comparator=text and default_validation=counter;

В Гекторе вы могли бы использовать класс ColumnFamilyDefinition примерно так:

    ColumnFamilyDefinition cfDef = HFactory.createColumnFamilyDefinition(KEYSPACE, "counter1");
    cfDef.setKeyValidationClass(ComparatorType.UTF8TYPE.getClassName());
    cfDef.setComparatorType(ComparatorType.UTF8TYPE);
    cfDef.setDefaultValidationClass(ComparatorType.COUNTERTYPE.getClassName());
    cfDef.setColumnType(ColumnType.STANDARD);
    List<ColumnFamilyDefinition> columnFamilies = new ArrayList<ColumnFamilyDefinition>();
    columnFamilies.add(cfDef);
    KeyspaceDefinition ksdef = HFactory.createKeyspaceDefinition(KEYSPACE, "org.apache.cassandra.locator.SimpleStrategy", 1,
            columnFamilies);
    cluster.addKeyspace(ksdef);
person phatfingers    schedule 28.05.2012
comment
Спасибо, phatfingers, но я хотел бы сделать все свои вещи с кодом, с Гектором. Можно ли создать семейство столбцов с помощью hector? - person Istao; 28.05.2012
comment
Кроме того, вы можете взглянуть на третий вариант — запуск CQL из своего приложения: github.com/jsevellec/cassandra-unit/blob/master/src/test/java/ - person phatfingers; 29.05.2012
comment
to phatfingers: спасибо; но если я это сделаю, я получу me.prettyprint.hector.api.exceptions.HInvalidRequestException: InvalidRequestException(why:CounterColumnType is not a valid comparator) в строке cluster.addColumnFamily(cfDef);! - person Istao; 29.05.2012
comment
Я сначала протестировал, потом добавил новую версию. - person phatfingers; 29.05.2012
comment
ОК, это работа, спасибо! Но для новичка это немного сложно понять. - person Istao; 29.05.2012