Тайм-ауты при переходе от узла с миллионами ребер

У меня есть граф с несколькими узлами с миллионами инцидентных ребер, использующий Titan 0.5.2 поверх Cassandra DB. Например. это воспроизводит такой график:

mgmt = g.getManagementSystem()
vidp = mgmt.makePropertyKey('vid').dataType(Integer.class).make()
mgmt.buildIndex('by_vid',Vertex.class).addKey(vidp).buildCompositeIndex()
mgmt.commit()

def v0 = g.addVertex([vid: 0, type: 'start'])
def random = new Random()
for(i in 1..10000000) {
  def v = g.addVertex([vid: i, type: 'claim'])
  v.addEdge('is-a', v0)
  def n = random.nextInt(i)
  def vr = g.V('vid', n).next()
  v.addEdge('test', vr) 
  if (i%10000 == 0) { g.commit(); }
}

Итак, у нас есть 10 миллионов вершин, которые все связаны с v0 и с некоторыми случайными связями между вершинами. Этот запрос: g.V('vid', 0).in('is-a')[0] - работает нормально, так же как и g.V('vid', 0).in('is-a')[100] или g.V('vid', 0).in('is-a')[1000]. Однако, если я попытаюсь пройти дальше, то есть g.V('vid', 0).in('is-a').out('test')[0], поиск застрянет, и в конечном итоге я получу исключение тайм-аута чтения от Cassandra:

com.thinkaurelius.titan.core.TitanException: Could not execute operation due to backend exception

Caused by: com.thinkaurelius.titan.diskstorage.TemporaryBackendException: Could not successfully complete backend operation due to repeated temporary exceptions after Duration[4000 ms]
at com.thinkaurelius.titan.diskstorage.util.BackendOperation.executeDirect(BackendOperation.java:86)
at com.thinkaurelius.titan.diskstorage.util.BackendOperation.execute(BackendOperation.java:42)

Caused by: com.netflix.astyanax.connectionpool.exceptions.TimeoutException: TimeoutException: [host=127.0.0.1(127.0.0.1):9160, latency=10000(10001), attempts=1]org.apache.thrift.transport.TTransportException: java.net.SocketTimeoutException: Read timed out
at com.netflix.astyanax.thrift.ThriftConverter.ToConnectionPoolException(ThriftConverter.java:188)
at com.netflix.astyanax.thrift.ThriftSyncConnectionFactoryImpl$ThriftConnection.execute(ThriftSyncConnectionFactoryImpl.java:

Я также получаю высокую нагрузку на процесс Cassandra, и он перестает отвечать на запросы (т. е. попытка подключения к нему возвращает тайм-аут). Итак, мой вопрос: почему невозможно пройти дальше от этого узла, хотя шаг, который на самом деле имеет много узлов, в порядке - и как я могу заставить его работать?


person StasM    schedule 12.12.2014    source источник


Ответы (1)


Похоже, вы эффективно смоделировали суперузел. Когда вы вызываете функцию

g.V('vid', 0).in('is-a')[0]

Вы запрашиваете только один объект, который является быстрым поиском. Так же:

g.V('vid', 0).in('is-a')[100]

Также запрашивает только один объект, который по-прежнему быстр. Когда вы делаете запрос:

g.V('vid', 0).in('is-a').out('test')[0]

Вы только что сделали запрос «найди мне все вершины, соединенные исходящим ребром из миллиона вершин, и верни первую». Первый шаг, который он сделает, - это пересечет все миллион этих ребер, прежде чем он сможет вернуть "первую" вершину, которую вы запрашиваете. Попробуйте сделать это:

g.V('vid', 0).in('is-a')[0].out('test')[0]

Это не будет перебирать все миллион вершин.

person pkohan    schedule 26.02.2015