2017-01-13 19 views
1

由于体积和性能测试的一部分,我试图执行多个并行的gremlin请求(图遍历)使用java线程。它工作正常的线程数量较少。TITAN-并行查询-Concurrent超时例外在org.apache.tinkerpop.gremlin.driver.Client.submit

当我增加线程(说500),我收到以下错误线程 “主题-34” 了java.lang.RuntimeException

异常的数量: 了java.lang.RuntimeException:JAVA .util.concurrent.TimeoutException: 超时等待可用主机。 at com.tests.java.titan.Vertices.exists(Vertices.java:37) at com.tests.java org.apache.tinkerpop.gremlin.driver.Client.submit(Client.java:146) 。 titan.Complex.searchNodesRelatedByRelation(Complex.java:110) 在com.tests.java.perfTests.TitanThread.run(ParallelGraphTraversal.java:112) 引起:了java.lang.RuntimeException: java.util.concurrent.TimeoutException :超时等待可用主机的 。 在org.apache.tinkerpop.gremlin.driver.Client.submitAsync(Client.java:194) 在org.apache.tinkerpop.gremlin.driver.Client.submitAsync(Client.java:174) 在org.apache。 tinkerpop.gremlin.driver.Client.submit(Client.java:144) ... 3更

我试图从8从1增加threadPoolWorker的值,以2和gremlinPool至16(在该文件的gremlin -server.yaml)。但我没有注意到任何区别。

有没有人遇到过这个问题?您能否告诉我是否有可能同时连接的最大数量限制?

我们的环境:CDH 5.7.1,1.1.0泰坦-SNAPSHOT,Solr的4.10.3,HBase的 1.2.0,泰坦TP3驱动器创建远程连接到服务器的小鬼和查询

回答

3

服务器上的gremlinPool设置往往局限于Runtime.availableProcessors()所以它通常没有意义,使数比更大。服务器支持的请求数量在某种程度上取决于执行的遍历类型。我可以想象发送一系列长时间运行请求的情况,这些请求可能会绑定多个线程,从而降低服务器本身的脚本处理能力。 Gremlin服务器可能会继续接受请求,将它们存储到队列中进行处理,但它们只会花费更长的时间来处理。

这种情况本身不应该强制这个错误,但驱动程序的默认设置可能不适合您正在尝试做的事情。驱动程序有一个load of settings,它控制消息到服务器的流动。如果某个特定主机的驱动程序状态超出了这些设置的范围,它将忽略该主机并寻找另一个主机。例如,如果超过connectionPool.maxInProcessPerConnection并且没有其他连接可以添加,因为该连接也是最大的,那么在驱动程序选择下一个主机发送消息的过程中,该主机将被忽略。通过这种方式,特定的主机不会因客户端的请求而过载。

在你的情况,我想有你的配置中没有其他主机,所以,因为没有别的地方发送这些请求,司机试图等待中解放出来的连接。如果我们考虑我们的例子,那么它会等待处理请求的数量低于connectionPool.maxInProcessPerConnection。司机等待多久才会发生?它会一直等到connectionPool.maxWaitForConnection。如果超过这个时间,那么你会得到你所看到的错误信息。

+0

非常感谢Stephen的解释和指向[Gremlin Driver Configuration](http://tinkerpop.apache.org/docs/current/reference/#_configuration)的指针。我在driver-settings.yaml文件中将maxInProcessPerConnection配置为500,并解决了问题 – smang