UnavailableException () в Apache-Cassandra 0.8.2 - PullRequest
5 голосов
/ 10 августа 2011

Я новичок в Apache-Cassandra 0.8.2.Я пытаюсь вставить некоторые данные, но получаю это исключение.

Exception in thread "main" UnavailableException()
    at org.apache.cassandra.thrift.Cassandra$insert_result.read(Cassandra.java:14902)
    at org.apache.cassandra.thrift.Cassandra$Client.recv_insert(Cassandra.java:858)
    at org.apache.cassandra.thrift.Cassandra$Client.insert(Cassandra.java:830)
    at TestCassandra.main(TestCassandra.java:166)

Мой код:


public class TestCassandra {

    public static void createKeySpace( Cassandra.Client client,String ksname)
        throws TException, InvalidRequestException, UnavailableException, UnsupportedEncodingException, NotFoundException, TimedOutException, SchemaDisagreementException {

        KsDef ksdef = new KsDef();
        ksdef.name = ksname;
        ksdef.strategy_class = "NetworkTopologyStrategy";    
        List l = new ArrayList();        
        ksdef.cf_defs =l;   

        client.system_add_keyspace(ksdef); 
        System.out.println("KeySpace Created");


    }

    public static void createColumnFamily(Cassandra.Client client,String ksname,String cfname)
        throws TException, InvalidRequestException, UnavailableException, UnsupportedEncodingException, NotFoundException, TimedOutException, SchemaDisagreementException {

        CfDef cfd = new CfDef(ksname, cfname);
        client.system_add_column_family(cfd);
        System.out.println("ColumnFamily Created");

    }

    public static void main(String[] args)
            throws TException, InvalidRequestException, UnavailableException, UnsupportedEncodingException, NotFoundException, TimedOutException, SchemaDisagreementException {

        TTransport tr = new TFramedTransport(new TSocket("localhost", 9160));
        TProtocol proto = new TBinaryProtocol(tr);
        Cassandra.Client client = new Cassandra.Client(proto);
        tr.open();

       String keySpace = "Keyspace1";
       String columnFamily = "Users";

       //Drop the Keyspace 

       client.system_drop_keyspace(keySpace);

       //Creating keyspace


       KsDef ksdef = new KsDef();
       ksdef.name = keySpace;
       ksdef.strategy_class = "NetworkTopologyStrategy";    
       List l = new ArrayList();        
       ksdef.cf_defs =l;

       client.system_add_keyspace(ksdef); 
       System.out.println("KeySpace Created");

       //createKeySpace(client,keySpace);

       client.set_keyspace(keySpace);

       //Creating column Family

       CfDef cfd = new CfDef(keySpace, columnFamily);
       client.system_add_column_family(cfd);
       System.out.println("ColumnFamily Created");

       //createColumnFamily(client,keySpace,columnFamily);

       ColumnParent parent = new ColumnParent(columnFamily);

       Column description = new Column();
       description.setName("description".getBytes());
       description.setValue("I’m a nice guy".getBytes());
       description.setTimestamp(System.currentTimeMillis());

       ConsistencyLevel consistencyLevel = ConsistencyLevel.ONE;
       ByteBuffer rowid = ByteBuffer.wrap("0".getBytes());

//Line No. 166
       client.insert(rowid, parent, description, consistencyLevel);
       System.out.println("Record Inserted...");

       tr.flush();       
       tr.close();
    }


}

Кто-нибудь может мне помочь, почему это так?

Ответы [ 2 ]

6 голосов
/ 11 августа 2011

Причина UnavailableException заключается в том, что в вашем методе createKeySpace вы никогда не указывали replication_factor для определения пространства клавиш KsDef.

Для класса 2 Стратегии NetworkTopologyStrategy и SimpleStrategy требуется установить коэффициент репликации.В Cassandra 0.8 и выше, в KsDef больше нет поля replication_factor, поэтому вам придется добавить его самостоятельно, вот так (я обновил ваш код, но не тестировал. Также обратите внимание, что я изменилсяваш strategy_class до SimpleStrategy):

KsDef ksdef = new KsDef();
ksdef.name = ksname;
ksdef.strategy_class = SimpleStrategy.class.getName(); 

//Set replication factor
if (ksdef.strategy_options == null) {
    ksdef.strategy_options = new LinkedHashMap<String, String>();
}

//Set replication factor, the value MUST be an integer
ksdef.strategy_options.put("replication_factor", "1");

//Cassandra must now create the Keyspace based on our KsDef
client.system_add_keyspace(ksdef);

Для NetworkTopologyStrategy вам потребуется указать коэффициент репликации для каждого созданного вами центра обработки данных (см. объяснение здесь ).

Для получения дополнительной информации см. Мой Интерфейс с Apache Cassandra 0.8 в Java blog.

1 голос
/ 14 января 2013

Обратите внимание, что я столкнулся с подобной проблемой (получая много недоступных исключений), потому что я создал KsDef по коду и непреднамеренно вставил туда 10, когда я тестировал в кластере только с 3 узлами.

Таким образом, коэффициент репликации сказал 10 и, таким образом, попытка выполнить чтение QUORUM или запись QUORUM всегда будет неудачной, потому что QUORUM никогда не будет достигнут (т. Е. 10/2 + 1 = как минимум 6 узлов).

Исправление моего коэффициента репликации устранило все проблемы с уровнем согласованности QUORUM.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...