我正在使用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获取数据的批处理。
答案 0 :(得分:1)
尝试一次性处理6000个分区,在380000行和一个50000列的表上似乎完全有点过分。
应使用异步查询完成多分区选择,每个分区使用一个查询。 在表中有50000列看起来像数据建模问题。你的用例是什么? 不需要一次取出380000行(并且需要很长时间),它看起来像一个分析查询,应该通过Spark更好地处理。
尝试一次获得如此多的数据,你最有可能在你的cassandra节点上获得一个OOM,这可以解释为什么你收到消息" Connection已经关闭"
我的建议是检查您的模型,并尝试按照您应该的方式分割负载(异步查询)并使用正确的分页。 如果你想同时处理如此多的数据,你必须通过批量处理使用Spark,在另一个cassandra表中输出结果,并通过更小,更快的交互式查询访问结果表。