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策略类, 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(); } //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一致性级别的所有问题。
- 如何在Cassandra中列出列族中的所有列名?
- 获得Cassandra Writes背压的最佳方法是什么?
- 使用datastax java驱动程序连接到本地cassandra节点?
- Apache Spark需要5到6分钟才能从Cassandra中简单计算1亿行
- Apache Ignite – java.lang.ClassNotFoundException:未知对
- 为什么我的Cassandra准备声明数据采集速度如此之慢?
- Cassandra使用TokenAwarePolicy和shuffleReplicas进行负载均衡
- 如何从Cassandra增加Dataflow读取并行性
- 如何将Java Long转换为Cassandra的byte ?