繁体   English   中英

NoHostAvailableException使用Cassandra和DataStax Java驱动程序如果是大ResultSet

[英]NoHostAvailableException With Cassandra & DataStax Java Driver If Large ResultSet

设置:

  • 2节点Cassandra 1.2.6集群
  • 复制品= 2
  • 非常大的CQL3表,没有二级索引
  • Rowkey是一个UUID.randomUUID()。toString()
  • 读取一致性设置为ONE
  • 使用DataStax java驱动程序1.0

请求:

尝试通过“ 从schema.table LIMIT nnn中选择some-col; ”进行表扫描

失败:

一旦我超越了某个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)

鉴于:对于拥有数百万行的大型表,这可能不是最开明的事情,但这就是我学习不该做什么的方法,所以我非常感谢能够自愿调试这种错误的人。

例如,当发生这种情况时,没有迹象表明集群中的节点曾经遇到过请求的问题(任一节点上的日志中都没有指示任何超时或故障的内容)。 此外,我在驱动程序上启用了跟踪,只要查询成功,就会为您提供一些不错的autotrace(ala Oracle)信息。 但在这种情况下,驱动程序会导致NoHostAvailableException并且没有ExecutionInfo可用,因此在这种情况下,跟踪没有提供任何好处。

我也觉得有趣的是,这似乎没有记录为超时(我的JMX控制台告诉我没有发生超时)。 所以,我不理解故障实际发生的地方。 我有一个想法,那就是驱动程序有问题,但我不知道如何调试它(我真的很想)。

我已经阅读了几个人的帖子,他们声明查询结果集> 10000行可能不是一个好主意,我愿意接受这个,但我想了解导致异常的原因以及发生异常的地方。

FWIW,我也尝试在cassandra.yaml中碰撞超时属性,但这没有任何区别。

我欢迎任何建议,轶事,侮辱或金钱捐助,我在白痴开发商的房子里注册。

问候!!

我的猜测(也许还有其他人可以证实)是你通过导致超时的查询对集群施加过高的负载。 所以,是的,它有点难以调试,因为根本原因并不明显:我设置的限制是否过大或者群集实际上是否已经下降?

您希望避免在单个查询中对请求的数据量设置大的限制,通常是通过设置合理的限制并对结果进行分页,例如,

SELECT * FROM messages WHERE user_id = 101 LIMIT 1000;
SELECT * FROM messages WHERE user_id = 101 AND msg_id > [Last message ID received] LIMIT 1000;

添加的自动分页功能( 请参阅本文档 ,其中复制了本答案中的代码示例)是对数据流java驱动程序的重大改进,因为它不需要手动分页,并允许您执行以下操作:

Statement stmt = new SimpleStatement("SELECT * FROM images");
stmt.setFetchSize(100);
ResultSet rs = session.execute(stmt);

// Iterate over the ResultSet here

虽然这不一定能解决您的问题,但它会最大限度地减少查询“过大”的可能性。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM