TITAN- 并行查询 - org.apache.tinkerpop.gremlin.driver.Client.submit 的并发超时异常
TITAN- Parallel queries -Concurrent time out exception at org.apache.tinkerpop.gremlin.driver.Client.submit
作为容量和性能测试的一部分,我正在尝试使用 java 线程并行执行多个 gremlin 请求(图形遍历)。它工作正常的线程数量较少。
当我增加线程数(比如 500)时,出现以下错误
Exception in thread "Thread-34" java.lang.RuntimeException:
java.lang.RuntimeException: java.util.concurrent.TimeoutException:
Timed out waiting for an available host.
at org.apache.tinkerpop.gremlin.driver.Client.submit(Client.java:146)
at com.tests.java.titan.Vertices.exists(Vertices.java:37)
at com.tests.java.titan.Complex.searchNodesRelatedByRelation(Complex.java:110)
at com.tests.java.perfTests.TitanThread.run(ParallelGraphTraversal.java:112)
Caused by: java.lang.RuntimeException:
java.util.concurrent.TimeoutException: Timed out waiting for an
available host.
at org.apache.tinkerpop.gremlin.driver.Client.submitAsync(Client.java:194)
at org.apache.tinkerpop.gremlin.driver.Client.submitAsync(Client.java:174)
at org.apache.tinkerpop.gremlin.driver.Client.submit(Client.java:144)
... 3 more
我尝试将 threadPoolWorker 的值从 1 增加到 2,将 gremlinPool 的值从 8 增加到 16(在文件 gremlin-server.yaml 中)。但是我没发现有什么不同。
有人遇到过这个问题吗?你能告诉我同时连接的最大数量是否有限制吗?
Our environment: CDH 5.7.1, Titan 1.1.0-SNAPSHOT, Solr 4.10.3, HBase
1.2.0, titan-tp3-driver to create remote connection to gremlin server and for querying
服务器上的 gremlinPool
设置往往被限制为 Runtime.availableProcessors()
,因此将数字设置得更大通常没有意义。服务器将支持的请求数在某种程度上取决于您执行的遍历类型。我可以想象您发送一系列较长的 运行 请求的情况,这些请求可能会占用多个 gremlinPool
线程,从而降低服务器本身的脚本处理能力。 Gremlin Server 可能会继续接受请求,将它们存储在队列中以便在它们到达时进行处理,但它们的处理时间会更长。
这种情况本身不应强制出现此错误,但 driver 的默认设置可能不足以满足您的要求。 driver 有一个 load of settings,它控制到服务器的消息流。如果 driver 的状态对于特定主机而言超出了这些设置的范围,它将忽略该主机并寻找另一个主机。例如,如果超过了 connectionPool.maxInProcessPerConnection
并且因为它也已达到最大值而无法添加额外的连接,那么在 driver 选择下一个发送消息的主机的过程中将忽略该主机到。这样,特定主机就不会因为客户端的请求而过载。
在您的情况下,我假设您的配置中没有其他主机,因此由于没有其他地方可以发送这些请求,driver 会尝试等待连接释放自己。如果我们考虑我们的示例,那么它会等待处理中的请求数低于 connectionPool.maxInProcessPerConnection
。 driver 会等多久?它会等待 connectionPool.maxWaitForConnection
。如果超过该时间,您将收到您所看到的错误消息。
作为容量和性能测试的一部分,我正在尝试使用 java 线程并行执行多个 gremlin 请求(图形遍历)。它工作正常的线程数量较少。
当我增加线程数(比如 500)时,出现以下错误
Exception in thread "Thread-34" java.lang.RuntimeException: java.lang.RuntimeException: java.util.concurrent.TimeoutException: Timed out waiting for an available host. at org.apache.tinkerpop.gremlin.driver.Client.submit(Client.java:146) at com.tests.java.titan.Vertices.exists(Vertices.java:37) at com.tests.java.titan.Complex.searchNodesRelatedByRelation(Complex.java:110) at com.tests.java.perfTests.TitanThread.run(ParallelGraphTraversal.java:112) Caused by: java.lang.RuntimeException: java.util.concurrent.TimeoutException: Timed out waiting for an available host. at org.apache.tinkerpop.gremlin.driver.Client.submitAsync(Client.java:194) at org.apache.tinkerpop.gremlin.driver.Client.submitAsync(Client.java:174) at org.apache.tinkerpop.gremlin.driver.Client.submit(Client.java:144) ... 3 more
我尝试将 threadPoolWorker 的值从 1 增加到 2,将 gremlinPool 的值从 8 增加到 16(在文件 gremlin-server.yaml 中)。但是我没发现有什么不同。
有人遇到过这个问题吗?你能告诉我同时连接的最大数量是否有限制吗?
Our environment: CDH 5.7.1, Titan 1.1.0-SNAPSHOT, Solr 4.10.3, HBase 1.2.0, titan-tp3-driver to create remote connection to gremlin server and for querying
服务器上的 gremlinPool
设置往往被限制为 Runtime.availableProcessors()
,因此将数字设置得更大通常没有意义。服务器将支持的请求数在某种程度上取决于您执行的遍历类型。我可以想象您发送一系列较长的 运行 请求的情况,这些请求可能会占用多个 gremlinPool
线程,从而降低服务器本身的脚本处理能力。 Gremlin Server 可能会继续接受请求,将它们存储在队列中以便在它们到达时进行处理,但它们的处理时间会更长。
这种情况本身不应强制出现此错误,但 driver 的默认设置可能不足以满足您的要求。 driver 有一个 load of settings,它控制到服务器的消息流。如果 driver 的状态对于特定主机而言超出了这些设置的范围,它将忽略该主机并寻找另一个主机。例如,如果超过了 connectionPool.maxInProcessPerConnection
并且因为它也已达到最大值而无法添加额外的连接,那么在 driver 选择下一个发送消息的主机的过程中将忽略该主机到。这样,特定主机就不会因为客户端的请求而过载。
在您的情况下,我假设您的配置中没有其他主机,因此由于没有其他地方可以发送这些请求,driver 会尝试等待连接释放自己。如果我们考虑我们的示例,那么它会等待处理中的请求数低于 connectionPool.maxInProcessPerConnection
。 driver 会等多久?它会等待 connectionPool.maxWaitForConnection
。如果超过该时间,您将收到您所看到的错误消息。