NoHostAvailableException从Cassandra

时间:2015-07-08 10:29:33

标签: cassandra cql

我正在使用Cassandra 2.1.5和Cassandra-java-driver 2.0.10。当我从Cassandra Table获取数据时,我面临异常。

com.datastax.driver.core.exceptions.NoHostAvailableException:尝试查询的所有主机都失败了(尝试:/127.0.0.1:9042(com.datastax.driver.core.TransportException:[/ 127.0.0.1: 9042]连接已关闭))     at com.datastax.driver.core.exceptions.NoHostAvailableException.copy(NoHostAvailableException.java:84)     at com.datastax.driver.core.DefaultResultSetFuture.extractCauseFromExecutionException(DefaultResultSetFuture.java:265)     at com.datastax.driver.core.DefaultResultSetFuture.getUninterruptibly(DefaultResultSetFuture.java:179)     在com.datastax.driver.core.AbstractSession.execute(AbstractSession.java:52)     在com.datastax.driver.core.AbstractSession.execute(AbstractSession.java:36)     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)     at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)     at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)     at java.lang.reflect.Method.invoke(Unknown Source)     在com.datastax.spark.connector.cql.SessionProxy.invoke(SessionProxy.scala:33)     在com.sun.proxy。$ Proxy8.execute(未知来源)     在com.exportstagging.SparkTest.ProductDataLoader.dbQuery(ProductDataLoader.java:418)     在com.exportstagging.SparkTest.ProductDataLoader.main(ProductDataLoader.java:442) 引起:com.datastax.driver.core.exceptions.NoHostAvailableException:所有尝试查询的主机都失败了(尝试:/127.0.0.1:9042(com.datastax.driver.core.TransportException:[/ 127.0.0.1: 9042]连接已关闭))     在com.datastax.driver.core.RequestHandler.reportNoMoreHosts(RequestHandler.java:216)     在com.datastax.driver.core.RequestHandler.access $ 900(RequestHandler.java:45)     at com.datastax.driver.core.RequestHandler $ SpeculativeExecution.sendRequest(RequestHandler.java:276)     at com.datastax.driver.core.RequestHandler $ SpeculativeExecution $ 1.run(RequestHandler.java:374)     at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)     at java.util.concurrent.ThreadPoolExecutor $ Worker.run(Unknown Source)     在java.lang.Thread.run(未知来源)

在我的cassandra表中有50000列和380000行。当我解雇这个问题时,我遇到了错误。

从mykeyspace.productdata中选择*其中id In(1,...,6000)。

我已经使用令牌来创建从Cassandra获取数据的批处理。

1 个答案:

答案 0 :(得分:1)

尝试一次性处理6000个分区,在380000行和一个50000列的表上似乎完全有点过分。

应使用异步查询完成多分区选择,每个分区使用一个查询。 在表中有50000列看起来像数据建模问题。你的用例是什么? 不需要一次取出380000行(并且需要很长时间),它看起来像一个分析查询,应该通过Spark更好地处理。

尝试一次获得如此多的数据,你最有可能在你的cassandra节点上获得一个OOM,这可以解释为什么你收到消息" Connection已经关闭"

我的建议是检查您的模型,并尝试按照您应该的方式分割负载(异步查询)并使用正确的分页。 如果你想同时处理如此多的数据,你必须通过批量处理使用Spark,在另一个cassandra表中输出结果,并通过更小,更快的交互式查询访问结果表。