Reputation: 5110
I new to Apache-Cassandra 0.8.2. I am trying to insert some data but getting this exception.
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)
My Code is:
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(); } }
Can anybody help me why this is so?
Upvotes: 5
Views: 3322
Reputation: 20730
Note that I ran in a similar problem (receiving many Unavailable exceptions) because I created a KsDef by code and inadvertently put 10 in there when I was testing on a cluster with only 3 nodes.
So the replication factor said 10 and thus attempting to do a QUORUM read or a QUORUM write would always fail because the QUORUM could never be reached (i.e. 10 / 2 + 1 = at least 6 nodes.)
Fixing my replication factor fixed all the problems with the QUORUM consistency level.
Upvotes: 1
Reputation: 89169
The reason for the UnavailableException
is due to the fact of in your createKeySpace
method, you have never specified a replication_factor
for your keyspace definition, KsDef
.
The 2 Strategy class, NetworkTopologyStrategy
and SimpleStrategy
requires a replication factor to be set. In Cassandra 0.8 and higher, there is no more a replication_factor
field in KsDef
so you will have to add it yourself, like so (I've updated your code, but not tested. Also, see that I've changed your strategy_class
to 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);
For NetworkTopologyStrategy
, you will need to specify your replication factor to each datacentre you've created (See explanation here).
For more information, view my Interfacing with Apache Cassandra 0.8 in Java blog.
Upvotes: 6