5 Stimmen

UnavailableException() in Apache-Cassandra 0.8.2

Ich bin neu bei Apache-Cassandra 0.8.2. Ich versuche, einige Daten einzufügen, erhalte aber diese Ausnahme.

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)

Mein Code lautet:

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

}

Kann mir jemand sagen, warum das so ist?

6voto

Buhake Sindi Punkte 85274

Der Grund für die UnavailableException ist aufgrund der Tatsache, dass in Ihrem createKeySpace Methode haben Sie nie eine replication_factor für Ihre Keyspace-Definition, KsDef .

Die 2 Strategieklasse, NetworkTopologyStrategy y SimpleStrategy muss ein Replikationsfaktor festgelegt werden. In Cassandra 0.8 und höher gibt es keinen Replikationsfaktor mehr. replication_factor Feld in KsDef Sie müssen es also selbst hinzufügen, etwa so (ich habe Ihren Code aktualisiert, aber nicht getestet. Sehen Sie auch, dass ich Ihren Code geändert habe strategy_class a 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);

Para NetworkTopologyStrategy müssen Sie Ihren Replikationsfaktor für jedes von Ihnen erstellte Rechenzentrum angeben (siehe Erklärung aquí ).

Weitere Informationen finden Sie in meinem Schnittstelle zu Apache Cassandra 0.8 in Java Blog.

1voto

Alexis Wilke Punkte 16966

Beachten Sie, dass ich ein ähnliches Problem (viele Unavailable-Ausnahmen erhalten), weil ich eine KsDef durch Code erstellt und versehentlich 10 in dort setzen, wenn ich auf einem Cluster mit nur 3 Knoten getestet wurde lief.

Der Replikationsfaktor betrug also 10, so dass der Versuch, ein QUORUM zu lesen oder zu schreiben, immer scheitern würde, weil das QUORUM nie erreicht werden könnte (d. h. 10 / 2 + 1 = mindestens 6 Knoten).

Durch die Korrektur meines Replikationsfaktors wurden alle Probleme mit der Konsistenzstufe QUORUM behoben.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X