Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Apache Cassandra 0.8.2中的UnavailableException()_Java_Cassandra - Fatal编程技术网

Java Apache Cassandra 0.8.2中的UnavailableException()

Java Apache Cassandra 0.8.2中的UnavailableException(),java,cassandra,Java,Cassandra,我是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(Cassa

我是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) 线程“main”中的异常不可用异常() 位于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) 我的代码是:

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(); } } 公共类TestCassandra{ 公共静态void createKeySpace(Cassandra.Client-Client,字符串ksname) 引发TexException、InvalidRequestException、UnavailableException、UnsupportedEncodingException、NotFoundException、TimeDouTexException、SchemaDisagreementException{ KsDef KsDef=新的KsDef(); ksdef.name=ksname; ksdef.strategy_class=“NetworkTopologyStrategy”; 列表l=新的ArrayList(); ksdef.cf_defs=l; client.system_add_keyspace(ksdef); System.out.println(“创建的键空间”); } 公共静态void createColumnFamily(Cassandra.Client客户端,字符串ksname,字符串cfname) 引发TexException、InvalidRequestException、UnavailableException、UnsupportedEncodingException、NotFoundException、TimeDouTexException、SchemaDisagreementException{ CfDef cfd=新的CfDef(ksname,cfname); 客户端。系统添加列族(cfd); System.out.println(“创建的ColumnFamily”); } 公共静态void main(字符串[]args) 引发TexException、InvalidRequestException、UnavailableException、UnsupportedEncodingException、NotFoundException、TimeDouTexException、SchemaDisagreementException{ TTTransport tr=新的TFramedTransport(新的TSocket(“localhost”,9160)); TProtocol proto=新的TBinaryProtocol(tr); Cassandra.Client Client=新的Cassandra.Client(proto); tr.open(); 字符串keySpace=“Keyspace1”; String columnFamily=“用户”; //删除键空间 client.system\u drop\u键空间(keyspace); //创建键空间 KsDef KsDef=新的KsDef(); ksdef.name=keySpace; ksdef.strategy_class=“NetworkTopologyStrategy”; 列表l=新的ArrayList(); ksdef.cf_defs=l; client.system_add_keyspace(ksdef); System.out.println(“创建的键空间”); //createKeySpace(客户端,keySpace); client.set_键空间(keyspace); //创建柱族 CfDef cfd=新的CfDef(键空间、列族); 客户端。系统添加列族(cfd); System.out.println(“创建的ColumnFamily”); //createColumnFamily(客户端、键空间、columnFamily); ColumnParent parent=新ColumnParent(columnFamily); 列描述=新列(); description.setName(“description.getBytes()); description.setValue(“我是个好人”.getBytes()); description.setTimestamp(System.currentTimeMillis()); 稠度等级稠度等级=稠度等级1; ByteBuffer rowid=ByteBuffer.wrap(“0.getBytes()); //第166行 插入(rowid、父项、描述、一致性级别); System.out.println(“插入的记录…”); tr.flush(); tr.close(); } }
有人能告诉我为什么会这样吗?

出现
不可用异常的原因是,在
createKeySpace
方法中,您从未为键空间定义指定
replication\u factor

两个策略类,
NetworkTopologyStrategy
SimpleStrategy
需要设置复制系数。在Cassandra 0.8及更高版本中,
KsDef
中不再有一个
replication\u factor
字段,因此您必须自己添加它,就像这样(我已经更新了您的代码,但没有经过测试。另外,请注意,我已经将您的
策略类
更改为
SimpleStrategy
):

KsDef KsDef=new KsDef();
ksdef.name=ksname;
ksdef.strategy_class=SimpleStrategy.class.getName();
//设置复制因子
if(ksdef.strategy_options==null){
ksdef.strategy_options=新建LinkedHashMap();
}
//设置复制因子时,该值必须为整数
ksdef.战略期权看跌期权(“复制因子”,“1”);
//Cassandra现在必须基于我们的KsDef创建密钥空间
client.system_add_keyspace(ksdef);
对于
NetworkTopologyStrategy
,您需要指定您创建的每个数据中心的复制系数(请参见说明)


有关更多信息,请查看我的博客。

注意,我遇到了类似的问题(接收到许多不可用的异常),因为我通过代码创建了一个KsDef,当我在一个只有3个节点的集群上测试时,无意中在其中放入了10个

因此,复制因子表示为10,因此尝试执行仲裁读取或仲裁写入操作将始终失败,因为无法达到仲裁(即10/2+1=至少6个节点)


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

堆栈跟踪显示问题在第166行。您的代码段没有行号。因此,您需要告诉我们第166行是什么,因为我确信您的代码片段不是整个文件。哦!很抱歉代码client.insert(rowid、parent、description、consistentylevel)上存在异常;建议:使用客户端而不是直接使用Thrift API。您的代码将更干净,更不容易出错。顺便说一句,
UnavailableException
意味着
无法创建和/或读取所需的所有副本。
对于NTS,您必须指定每个数据中心的副本计数(即NTS点)。因此,除非您有一个名为replication\u factor的数据中心,否则这并不能满足您的需要。这是一个非常常见的错误,因此我们在0.8.3:ConfigurationException(配置异常)中添加了一个特殊检查(“复制因子”是SimpleStregy的一个选项)
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);