从具有数百万边缘的节点遍历的超时

时间:2014-12-12 23:59:33

标签: cassandra graph-databases titan gremlin

我有一个图表,其中有一些节点有数百万个入射边缘,在Cassandra DB上使用Titan 0.5.2。例如。这再现了这样的图表:

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(); }
}

所以我们有10M顶点都链接到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进程上获得高负载并且它变得没有响应(即,尝试连接到它返回超时)。所以,我的问题是为什么不可能从这个节点进一步遍历,即使实际上有很多节点的步骤很好 - 我怎么能让它工作呢?

1 个答案:

答案 0 :(得分:3)

看来你已经有效地模拟了一个超级节点。当你调用函数

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]

这不会遍历所有一百万个顶点。