设置:
- 2 节点 Cassandra 1.2.6 集群
- 副本=2
- 没有二级索引的非常大的 CQL3 表
- Rowkey 是一个 UUID.randomUUID().toString()
- 读取一致性设置为 ONE
- 使用 DataStax java 驱动程序 1.0
请求:
尝试通过“ SELECT some-col from schema.table LIMIT nnn; ”进行表扫描
失败:
一旦超过某个 nnn LIMIT,我就会开始从驱动程序中获取 NoHostAvailableExceptions。
它的内容如下:
com.datastax.driver.core.exceptions.NoHostAvailableException: All host(s) tried for query failed (tried: /10.181.13.239 ([/10.181.13.239] Unexpected exception triggered))
at com.datastax.driver.core.exceptions.NoHostAvailableException.copy(NoHostAvailableException.java:64)
at com.datastax.driver.core.ResultSetFuture.extractCauseFromExecutionException(ResultSetFuture.java:214)
at com.datastax.driver.core.ResultSetFuture.getUninterruptibly(ResultSetFuture.java:169)
at com.jpmc.es.rtm.storage.impl.EventExtract.main(EventExtract.java:36)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)
Caused by: com.datastax.driver.core.exceptions.NoHostAvailableException: All host(s) tried for query failed (tried: /10.181.13.239 ([/10.181.13.239] Unexpected exception triggered))
at com.datastax.driver.core.RequestHandler.sendRequest(RequestHandler.java:98)
at com.datastax.driver.core.RequestHandler$1.run(RequestHandler.java:165)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
鉴于:对于具有数百万行的大表,这可能不是最开明的事情,但这是我学习不该做什么的方式,所以我非常感谢能够自愿调试这种错误的人。
例如,当这种情况发生时,没有迹象表明集群中的节点曾经遇到过请求问题(任何一个节点上的日志中都没有任何内容表明任何超时或失败)。此外,我在驱动程序上启用了跟踪,只要查询成功,它就会为您提供一些很好的自动跟踪(ala Oracle)信息。但是在这种情况下,驱动程序会抛出 NoHostAvailableException 并且没有可用的 ExecutionInfo,因此在这种情况下跟踪没有提供任何好处。
我还发现有趣的是,这似乎没有被记录为超时(我的 JMX 控制台告诉我没有发生超时)。所以,我不明白故障实际发生在哪里。我的想法是驱动程序有问题,但我不知道如何调试它(我真的很想)。
我已经阅读了几篇来自人们的帖子,其中指出 query'g for resultSets > 10000 rows 可能不是一个好主意,我愿意接受这一点,但我想了解导致异常的原因以及异常发生的位置.
FWIW,我还尝试在 cassandra.yaml 中调整超时属性,但这没有任何区别。
我欢迎任何建议、轶事、侮辱或对我在白痴开发商之家注册的金钱捐助。
问候!!