2

我在将数据写入 cassandra 时遇到问题。

使用 ConnectionPoolType.BAG 时,我们观察到:

NoAvailableHostsException("No hosts to borrow from") exception being thrown.
Caused by: com.netflix.astyanax.connectionpool.exceptions.NoAvailableHostsException:       
NoAvailableHostsException: [host=None(0.0.0.0):0, latency=0(0), attempts=1]No hosts to borrow from
at com.netflix.astyanax.connectionpool.impl.BagOfConnectionsConnectionPoolImpl.borrowConnection(BagOfConnectionsConnectionPoolImpl.java:93) ~[astyanax-1.56.24-SNAPSHOT.jar:na]
at com.netflix.astyanax.connectionpool.impl.BagOfConnectionsConnectionPoolImpl.access$000(BagOfConnectionsConnectionPoolImpl.java:31) ~[astyanax-1.56.24-SNAPSHOT.jar:na]
at com.netflix.astyanax.connectionpool.impl.BagOfConnectionsConnectionPoolImpl$BagExecuteWithFailover.borrowConnection(BagOfConnectionsConnectionPoolImpl.java:158) ~[astyanax-1.56.24-SNAPSHOT.jar:na]
at com.netflix.astyanax.connectionpool.impl.AbstractExecuteWithFailoverImpl.tryOperation(AbstractExecuteWithFailoverImpl.java:67) ~[astyanax-1.56.24-SNAPSHOT.jar:na]
at com.netflix.astyanax.connectionpool.impl.AbstractHostPartitionConnectionPool.executeWithFailover(AbstractHostPartitionConnectionPool.java:253) ~[astyanax-1.56.24-SNAPSHOT.jar:na]
at com.netflix.astyanax.thrift.ThriftColumnFamilyQueryImpl$6$3.execute(ThriftColumnFamilyQueryImpl.java:739) ~[astyanax-1.56.24-SNAPSHOT.jar:na]

此外,我们尝试使用 ConnectionPoolType.ROUND_ROBIN 但我们再次观察到 ConnectionTimeOut 错误。

想知道我们的配置是否正常?

客户端配置。我们正在使用 Astyanax java 客户端。

        context = new AstyanaxContext.Builder()
                .forCluster("clustername")
                .forKeyspace("keyspace")
                .withAstyanaxConfiguration(new AstyanaxConfigurationImpl()
                        .setDiscoveryType(NodeDiscoveryType.NONE)
                        .setCqlVersion("3.0.0")
                        .setConnectionPoolType(ConnectionPoolType.BAG) // We also tried ConnectionPoolType.ROUND_ROBIN
                )
                .withConnectionPoolConfiguration(
                        new ConnectionPoolConfigurationImpl("poolname")
                                .setPort(9160)
                                .setMaxConnsPerHost(20)
                                .setInitConnsPerHost(10)
                                .setSeeds("host1:9160,host2:9160,host3:9160")
                                .setMaxTimeoutWhenExhausted(11000) // Default : 2000
                                .setConnectTimeout(10000) // Default : 2000
                )
                .withConnectionPoolMonitor(new Slf4jConnectionPoolMonitorImpl())
                .buildKeyspace(ThriftFamilyFactory.getInstance());context.start();

更新 :

我正面临从游戏框架连接到 cassandra 集群的问题。我们正在使用 astyanax java 客户端连接到集群。

当我们使用“play start”启动播放应用程序时,一切似乎都工作正常,但是当我们使用“play dist”命令创建一个 dist 并启动服务时,它会抛出以下异常。

play dist 和 play start 和有什么区别?

更新 2:我正在我的机器上进行测试,cassandra 的单个实例。我以“简单策略”为策略创建了键空间。

我的盒子上的 Cassandra:ReleaseVersion:1.1.7。版本 1.1.6 也失败了。

运行 nodetool -h localhost 给出以下输出。

地址 DC Rack Status State Load Effective-Ownership Token
127.0.0.1 datacenter1 rack1 Up Normal 130.44 KB 100.00% 129209944818829357072522096381370300409


关闭线程 我的问题是因为一些冲突的旧库。我为 hive 和 cassandra 添加了依赖项,可能存在一些不匹配。

谢谢您的帮助。

谢谢。

4

1 回答 1

0

我在尝试截断表时遇到了类似的问题(astyanax.version=1.0.6)。截断是一个很长的操作,因为首先 Cassandra 做了一个sync,即从内存中刷新所有数据。这是很多数据,所以会发生读取超时。解决此问题的一种方法是先调用cassandraClient.send_truncate(),然后再重复try{cassandraClient.recv_truncate();}。但是如果抛出超时异常我们仍然会得到一个“NoAvailableHostsException ...没有可以借用的主机”。该异常的原因是在thrift的深处,通过向某个执行程序提交异步作业来关闭连接。补救措施是增加重试之间的时间(1000 毫秒太小,5000 对我有用)。

于 2017-02-22T10:07:56.340 回答