Apache-Cassandra 0.8.2中的UnavailableException()

我是Apache-Cassandra 0.8.2的新手。 我试图插入一些数据,但得到这个例外。

线程“main”中的exceptionUnavailableException()
    在org.apache.cassandra.thrift.Cassandra $ insert_result.read(Cassandra.java:14902)
    在org.apache.cassandra.thrift.Cassandra $ Client.recv_insert(Cassandra.java:858)
    在org.apache.cassandra.thrift.Cassandra $ Client.insert(Cassandra.java:830)
    在TestCassandra.main(TestCassandra.java:166)

我的代码是:


公共类TestCassandra {public static void createKeySpace(Cassandra.Client client,String ksname)抛出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)抛出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)抛出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”;  //删除Keyspace client.system_drop_keyspace(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.set_keyspace(密钥空间);  //创建列族CfDef cfd = new CfDef(keySpace,columnFamily);  client.system_add_column_family(CFD);  System.out.println(“ColumnFamily Created”);  // createColumnFamily(客户端,密钥空间,的ColumnFamily);  ColumnParent parent = new ColumnParent(columnFamily); 列描述= new Column();  description.setName( “描述” .getBytes());  description.setValue(“我是一个好人”.getBytes());  description.setTimestamp(System.currentTimeMillis的());  ConsistencyLevel consistencyLevel = ConsistencyLevel.ONE;  ByteBuffer rowid = ByteBuffer.wrap(“0”。getBytes());  //第166行client.insert(rowid,parent,description,consistencyLevel);  System.out.println(“Record Inserted ...”);  tr.flush();  tr.close();  }} 

任何人都可以帮助我为什么会这样?

UnavailableException的原因是由于在createKeySpace方法中,您从未为键空间定义KsDef指定了replication_factor

2策略类, NetworkTopologyStrategySimpleStrategy需要设置复制因子。 在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(); } //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 ,您需要为您创建的每个数据中心指定复制因子(请参阅此处的说明)。

有关更多信息,请在Java博客中查看我与Apache Cassandra 0.8的接口 。

请注意,我遇到了类似的问题(接收到许多不可用的exception),因为我在代码中创建了一个KsDef,当我在只有3个节点的集群上进行测试时,无意中将10个放在那里。

因此复制因子表示10因此尝试进行QUORUM读取或QUORUM写入总是会失败,因为永远无法达到QUORUM(即10/2 + 1 =至少6个节点)。

修复我的复制因子修复了QUORUM一致性级别的所有问题。