TITAN-并行查询 - org.apache.tinkerpop.gremlin.driver.Client.submit中的并发超时异常

时间:2017-01-13 16:50:34

标签: titan gremlin tinkerpop gremlin-server

作为卷和性能测试的一部分,我试图使用java线程并行执行多个gremlin请求(图遍历)。它可以正常工作。[/ p>

当我增加线程数(比如500)时,我收到以下错误

  

线程“Thread-34”中的异常java.lang.RuntimeException:   java.lang.RuntimeException:java.util.concurrent.TimeoutException:   等待可用主机超时。           在org.apache.tinkerpop.gremlin.driver.Client.submit(Client.java:146)           在com.tests.java.titan.Vertices.exists(Vertices.java:37)           在com.tests.java.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个

我尝试将threadPoolWorker的值从1增加到2,将gremlinPool的值从8增加到16(在文件gremlin-server.yaml中)。但我没有发现任何差异。

有没有人面对这个问题?如果可能的最大并发连接数有限制,请告诉我?

  

我们的环境:CDH 5.7.1,Titan 1.1.0-SNAPSHOT,Solr 4.10.3,HBase   1.2.0,titan-tp3-driver创建与gremlin服务器的远程连接和查询

1 个答案:

答案 0 :(得分:4)

服务器上的gremlinPool设置往往限制为Runtime.availableProcessors(),因此将数字设置为大于此值通常没有意义。服务器支持的请求数量在某种程度上取决于您执行的遍历类型。我可以想象你发送一系列长时间运行请求的情况,这些请求可能会占用许多gremlinPool个线程,从而降低服务器本身的脚本处理能力。 Gremlin Server可能会继续接受请求,将它们存储在队列中以便在它们到达时进行处理,但它们只需要更长的时间来处理。

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

在您的情况下,我假设您的配置中没有其他主机,因此没有其他地方发送这些请求,驱动程序会尝试等待连接释放自己。如果我们考虑我们的示例,那么它会等待进程中请求的数量低于connectionPool.maxInProcessPerConnection。司机等多久会发生这种情况?它将等待connectionPool.maxWaitForConnection。如果超过该时间,您将收到您看到的错误消息。