Документация Кассандры Астьянакс

Я пытаюсь использовать Astyanax для Cassandra с Java. Я попробовал пример на https://github.com/Netflix/astyanax/wiki/Getting-Started. У меня есть код, который я только что скопировал по этой ссылке:

package def;

import com.netflix.astyanax.AstyanaxContext;
import com.netflix.astyanax.Keyspace;
import com.netflix.astyanax.MutationBatch;
import com.netflix.astyanax.connectionpool.NodeDiscoveryType;
import com.netflix.astyanax.connectionpool.OperationResult;
import com.netflix.astyanax.connectionpool.exceptions.ConnectionException;
import com.netflix.astyanax.connectionpool.impl.ConnectionPoolConfigurationImpl;
import com.netflix.astyanax.connectionpool.impl.CountingConnectionPoolMonitor;
import com.netflix.astyanax.impl.AstyanaxConfigurationImpl;
import com.netflix.astyanax.model.Column;
import com.netflix.astyanax.model.ColumnFamily;
import com.netflix.astyanax.model.ColumnList;
import com.netflix.astyanax.serializers.StringSerializer;
import com.netflix.astyanax.thrift.ThriftFamilyFactory;

public class sample {

    public static void main(String[] args) throws Exception{
    AstyanaxContext<Keyspace> context = new AstyanaxContext.Builder()
    .forCluster("Test Cluster")
    .forKeyspace("KeyspaceName")
    .withAstyanaxConfiguration(new AstyanaxConfigurationImpl()      
        .setDiscoveryType(NodeDiscoveryType.NONE)
    )
    .withConnectionPoolConfiguration(new ConnectionPoolConfigurationImpl("MyConnectionPool")
        .setPort(9160)
        .setMaxConnsPerHost(10)
        .setSeeds("127.0.0.1:9160")
    )
    .withConnectionPoolMonitor(new CountingConnectionPoolMonitor())
    .buildKeyspace(ThriftFamilyFactory.getInstance());

    context.start();
    Keyspace keyspace = context.getEntity();

    ColumnFamily<String, String> CF_USER_INFO =
              new ColumnFamily<String, String>(
                "Standard1",              // Column Family Name
                StringSerializer.get(),   // Key Serializer
                StringSerializer.get());  // Column Serializer

    // Inserting data
    MutationBatch m = keyspace.prepareMutationBatch();

    m.withRow(CF_USER_INFO, "acct1234")
      .putColumn("firstname", "john", null)
      .putColumn("lastname", "smith", null)
      .putColumn("address", "555 Elm St", null)
      .putColumn("age", 30, null);

    m.withRow(CF_USER_INFO, "acct1234")
      .incrementCounterColumn("loginCount", 1);

    try {
      OperationResult<Void> result = m.execute();
    } catch (ConnectionException e) {
    }

    System.out.println("completed the task!!!");

    OperationResult<ColumnList<String>> result =
              keyspace.prepareQuery(CF_USER_INFO)
                .getKey("Key1")
                .execute();
            ColumnList<String> columns = result.getResult();

            // Lookup columns in response by name 
            int age        = columns.getColumnByName("age").getIntegerValue();
            long counter   = columns.getColumnByName("loginCount").getLongValue();
            String address = columns.getColumnByName("address").getStringValue();

            // Or, iterate through the columns
            for (Column<String> c : result.getResult()) {
              System.out.println(c.getName());
            }
    }

}

Но когда я запускаю это, я получаю исключение:

log4j:WARN No appenders could be found for logger (com.netflix.astyanax.connectionpool.impl.ConnectionPoolMBeanManager).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
completed the task!!!
Exception in thread "main" com.netflix.astyanax.connectionpool.exceptions.BadRequestException: BadRequestException: [host=127.0.0.1(127.0.0.1):9160, latency=0(0), attempts=1] InvalidRequestException(why:Keyspace KeyspaceName does not exist)
    at com.netflix.astyanax.thrift.ThriftConverter.ToConnectionPoolException(ThriftConverter.java:159)
    at com.netflix.astyanax.thrift.ThriftSyncConnectionFactoryImpl$1.execute(ThriftSyncConnectionFactoryImpl.java:119)
    at com.netflix.astyanax.connectionpool.impl.AbstractExecuteWithFailoverImpl.tryOperation(AbstractExecuteWithFailoverImpl.java:52)
    at com.netflix.astyanax.connectionpool.impl.AbstractHostPartitionConnectionPool.executeWithFailover(AbstractHostPartitionConnectionPool.java:229)
    at com.netflix.astyanax.thrift.ThriftColumnFamilyQueryImpl$1.execute(ThriftColumnFamilyQueryImpl.java:180)
    at def.sample.main(sample.java:68)
Caused by: InvalidRequestException(why:Keyspace KeyspaceName does not exist)
    at org.apache.cassandra.thrift.Cassandra$set_keyspace_result.read(Cassandra.java:4874)
    at org.apache.thrift.TServiceClient.receiveBase(TServiceClient.java:78)
    at org.apache.cassandra.thrift.Cassandra$Client.recv_set_keyspace(Cassandra.java:489)
    at org.apache.cassandra.thrift.Cassandra$Client.set_keyspace(Cassandra.java:476)
    at com.netflix.astyanax.thrift.ThriftSyncConnectionFactoryImpl$1.execute(ThriftSyncConnectionFactoryImpl.java:109)
    ... 4 more

Кто-нибудь может сказать мне, что с этим не так? Для этого также нет надлежащей документации. Итак, вы можете просто помочь мне. И даже дайте мне несколько ссылок, где я могу получить больше примеров.


person shalki    schedule 20.06.2012    source источник


Ответы (2)


why:Keyspace KeyspaceName does not exist

Ошибка выше довольно понятна. Пространство ключей не существует, когда приложение подключается к локальному хосту. Поэтому убедитесь, что вы создали пространство ключей, а затем перезапустите приложение.


Судя по комментарию, я думаю, вы хотите изучить это . Выдержка из темы,

Пространство ключей служит только клиентом и не создает пространство ключей или семейство столбцов в cassandra. Вы можете использовать AsytanaxContext.Builder для создания интерфейса Cluster, с помощью которого вы можете создавать семейства ключей и столбцов.

Этот модульный тест в этом ссылка должна предоставить вам достаточную информацию о том, как создать пространство ключей в вашем кластере.

person Jasonw    schedule 21.06.2012
comment
хорошо .. Есть ли способ создать пространство ключей в самом коде? У меня нет никакого способа сделать это. Это будет работать, когда у меня уже есть пространство ключей и семейство столбцов. Но я не хочу создавать его раньше. Как это сделать через код? - person shalki; 21.06.2012
comment
@shalki я не очень хорошо разбираюсь в astyanax, но я думаю, вы можете создать пространство ключей. Смотрите обновленный ответ. - person Jasonw; 21.06.2012

Ваш пример кода написан для общения с запущенным экземпляром сервера Cassandra на вашем локальном хосте по адресу 127.0.0.1. Если у вас запущена Cassandra в другом месте или не запущена вообще, вам необходимо установить и настроить эту серверную среду перед выполнением кода.

person phatfingers    schedule 20.06.2012