2017-01-13 12 views
1

Как часть теста объема и производительности, я пытаюсь выполнить несколько запросов гремлина (обход графика) параллельно используя потоки java. он отлично работает с меньшим количеством потоков.TITAN- Параллельные запросы. Исключение исключаемого времени ожидания в org.apache.tinkerpop.gremlin.driver.Client.submit

Когда я увеличить количество потоков (скажем, 500), я получаю следующую ошибку

Исключение в нити "Thread-34" java.lang.RuntimeException: java.lang.RuntimeException: Java .util.concurrent.TimeoutException: Сроки ожидания доступного хоста. 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) на com.tests.java.perfTests.TitanThread.run (ParallelGraphTraversal.java:112) Вызванный: java.lang.RuntimeException: java.util.concurrent.TimeoutException : Вышло время ожидания для доступного хоста. 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 более

Я попытался увеличить значения threadPoolWorker от 1 до 2 и gremlinPool от 8 до 16 лет (в файле гном -server.yaml). Но я не заметил никакой разницы.

Кто-нибудь сталкивался с этой проблемой? Не могли бы вы рассказать мне, существует ли ограничение на максимальное количество одновременных подключений?

Наша окружающая среда: CDH 5.7.1, Titan 1.1.0-SNAPSHOT, Solr 4.10.3, HBase 1.2.0, титан-ТР3-драйвер, чтобы создать удаленное подключение к серверу Gremlin и запрашивая

ответ

3

Настройка gremlinPool на сервере имеет тенденцию ограничиваться Runtime.availableProcessors(), поэтому обычно не имеет смысла делать число, большее этого. Количество запросов, поддерживаемых сервером, несколько определяется типами обходов вашего исполнения. Я мог представить ситуации, когда вы отправляете серию более длинных запросов на запуск, которые потенциально могут связать несколько потоков gremlinPool с тем, что замедляет возможности обработки сценариев самого сервера. Сервер Gremlin, скорее всего, продолжит принимать запросы, сохраняя их в очереди для обработки по мере их поступления, но им потребуется больше времени для обработки.

Эта ситуация сама по себе не должна вызывать эту ошибку, но настройки драйвера по умолчанию могут быть неадекватными для того, что вы пытаетесь сделать. Водитель имеет load of settings, который управляет потоком сообщений на сервер. Если состояние драйвера для определенного хоста выходит за границы этих параметров, оно будет игнорировать этот узел и искать другое. Например, если превышено connectionPool.maxInProcessPerConnection, и никакие дополнительные соединения не могут быть добавлены, потому что это слишком макс, тогда этот хост будет проигнорирован во время процесса драйвера для выбора следующего хоста для отправки сообщения. Таким образом, конкретный хост не будет перегружен запросами клиента.

В вашей ситуации я предполагаю, что в вашей конфигурации нет других хостов, и, поскольку нет другого способа отправить эти запросы, драйвер пытается дождаться, когда соединение освободится.Если мы рассмотрим наш пример, то он ожидает, что количество запросов процесса упадет ниже connectionPool.maxInProcessPerConnection. Как долго водитель будет ждать, чтобы это произошло? Он будет ждать до connectionPool.maxWaitForConnection. Если это время превышено, вы получите сообщение об ошибке, которое вы видите.

+0

Большое спасибо Стивена за пояснение и указатель на [Конфигурация драйвера Gremlin] (http://tinkerpop.apache.org/docs/current/reference/#_configuration). Я сконфигурировал maxInProcessPerConnection как 500 в файле driver-settings.yaml, и он исправил проблему – smang