高IOPS运行5分钟后Cassandra抛出NoHostAvailableException

高IOPS运行5分钟后Cassandra抛出NoHostAvailableException,cassandra,datastax,cassandra-cli,Cassandra,Datastax,Cassandra Cli,我正在使用datastax cassandra 2.1驱动程序,以大约8000 IOPS的速率执行读/写操作。我已经使用了池选项来配置我的会话,并且正在使用单独的会话进行读写,每个会话都连接到集群中的不同节点作为联系点。 这可以在5分钟内正常工作,但在这之后,我会遇到很多异常,如: 失败原因:com.datasax.driver.core.exceptions.NoHostAvailableException:所有尝试查询的主机均失败(尝试:/10.0.1.123:9042(com.datasa

我正在使用datastax cassandra 2.1驱动程序,以大约8000 IOPS的速率执行读/写操作。我已经使用了池选项来配置我的会话,并且正在使用单独的会话进行读写,每个会话都连接到集群中的不同节点作为联系点。 这可以在5分钟内正常工作,但在这之后,我会遇到很多异常,如:

失败原因:com.datasax.driver.core.exceptions.NoHostAvailableException:所有尝试查询的主机均失败(尝试:/10.0.1.123:9042(com.datasax.driver.core.TransportException:[/10.0.1.123:9042]连接已关闭),/10.0.1.56:9042(com.datastax.driver.core.exceptions.DriverException:尝试获取可用连接时超时(您可能希望增加每个主机连接的驱动程序数)))

有人能帮我解决什么问题吗

异常要求我增加每个主机的连接数,但我可以为此参数设置多高的值? 此外,我无法将
CoreConnectionsPerHost
设置为超过2,因为它会引发异常,说2是最大值

这就是我创建每个读/写会话的方式

   PoolingOptions poolingOpts = new PoolingOptions();
           poolingOpts.setCoreConnectionsPerHost(HostDistance.REMOTE, 2);
           poolingOpts.setMaxConnectionsPerHost(HostDistance.REMOTE, 200);
           poolingOpts.setMaxSimultaneousRequestsPerConnectionThreshold(HostDistance.REMOTE, 128);
           poolingOpts.setMinSimultaneousRequestsPerConnectionThreshold(HostDistance.REMOTE, 2);
           cluster = Cluster
             .builder()
             .withPoolingOptions( poolingOpts )
             .addContactPoint(ip)
             .withRetryPolicy( DowngradingConsistencyRetryPolicy.INSTANCE )
             .withReconnectionPolicy( new ConstantReconnectionPolicy( 100L ) ).build();
           Session s =  cluster.connect(keySpace);

您的问题实际上可能不在您的代码或连接方式中。如果您说问题在几分钟后发生,则可能只是您的群集在尝试处理数据摄取时变得过载,无法跟上。典型的迹象是当您开始看到JVM垃圾收集“GC”时cassandra system.log文件中的消息,太多的小事件单独批处理在一起可能意味着传入的客户端没有响应导致这种情况。在开始查看代码之前,请先验证日志中没有显示太多此类事件。下面是一个大型GC e排气口:

信息[ScheduledTasks:1]2014-05-15 23:19:49678 GCInspector.java(第116行)ConcurrentMarkSweep的GC:2896 ms用于两次收集,使用310563800;最大值为8375238656

当连接到一个集群时,有一些建议,其中之一是每个真正的集群只有一个集群对象。根据我在下面链接的文章(如果您已经研究过,请道歉):

  • 每个(物理)群集(每个应用程序生存期)使用一个群集实例
  • 每个键空间最多使用一个会话实例,或者使用单个会话并在查询中显式指定键空间
  • 如果执行一次以上语句,请考虑使用准备好的语句
  • 通过使用批处理,您可以减少网络往返次数,还可以进行原子操作

由于您正在进行大量的读取,如果它适用于您的代码,我非常推荐使用
setFetchSize

这里有一些连接选项供参考,以防您觉得有用


希望这能有所帮助。

我也有同样的问题,但我无法访问代码。我使用Hadoop而不是Cassandra,我不知道如何传递fetchSzie以供驱动程序使用(这是Hadoop的Cassandra实现所使用的。您知道我是否可以使用某个属性来设置fetchSize,而不是通过代码来设置它吗?)不,不幸的是,它需要在代码中设置,或者在编写代码时从可以在运行时配置的属性文件中提取此fetchSize。我发现这是2.0的一个问题。10释放卡桑德拉