计算 Titan 上的超级节点

Counting Super Nodes On Titan

在我的系统中,我要求节点上的边数必须存储为顶点上的内部 属性 以及特定传出边上的以顶点为中心的索引。这自然需要我在所有数据加载完成后统计节点上的边数。我是这样做的:

long edgeCount = graph.getGraph().traversal().V(vertexId).bothE().count().next();

然而,当我将测试扩展到我的一些节点是 "super" 节点时,我在上面的行中得到以下异常:

Caused by: com.netflix.astyanax.connectionpool.exceptions.TransportException: TransportException: [host=127.0.0.1(127.0.0.1):9160, latency=4792(4792), attempts=1]org.apache.thrift.transport.TTransportException: Frame size (70936735) larger than max length (62914560)!
    at com.netflix.astyanax.thrift.ThriftConverter.ToConnectionPoolException(ThriftConverter.java:197) ~[astyanax-thrift-3.8.0.jar!/:3.8.0]
    at com.netflix.astyanax.thrift.AbstractOperationImpl.execute(AbstractOperationImpl.java:65) ~[astyanax-thrift-3.8.0.jar!/:3.8.0]
    at com.netflix.astyanax.thrift.AbstractOperationImpl.execute(AbstractOperationImpl.java:28) ~[astyanax-thrift-3.8.0.jar!/:3.8.0]
    at com.netflix.astyanax.thrift.ThriftSyncConnectionFactoryImpl$ThriftConnection.execute(ThriftSyncConnectionFactoryImpl.java:153) ~[astyanax-thrift-3.8.0.jar!/:3.8.0]
    at com.netflix.astyanax.connectionpool.impl.AbstractExecuteWithFailoverImpl.tryOperation(AbstractExecuteWithFailoverImpl.java:119) ~[astyanax-core-3.8.0.jar!/:3.8.0]
    at com.netflix.astyanax.connectionpool.impl.AbstractHostPartitionConnectionPool.executeWithFailover(AbstractHostPartitionConnectionPool.java:352) ~[astyanax-core-3.8.0.jar!/:3.8.0]
    at com.netflix.astyanax.thrift.ThriftColumnFamilyQueryImpl.execute(ThriftColumnFamilyQueryImpl.java:538) ~[astyanax-thrift-3.8.0.jar!/:3.8.0]
    at com.thinkaurelius.titan.diskstorage.cassandra.astyanax.AstyanaxKeyColumnValueStore.getNamesSlice(AstyanaxKeyColumnValueStore.java:112) ~[titan-cassandra-1.0.0.jar!/:na]

解决此问题的最佳方法是什么?我应该简单地增加帧大小还是有更好的方法来计算节点上的边数?

这样一个本质上是OLAP的任务,应该使用分布式系统来执行,而不是使用遍历。

TinkerPop 3中有一个叫做GraphComputer的概念,可以用来完成这样的任务。

它基本上允许您 运行 Gremlin 查询,这将在多台机器上进行评估。

例如,您可以在 Apache Spark 之上使用 SparkGraphComputer 来 运行 您的查询。

是的,您需要增加帧大小。当你有一个超级节点时,有一个非常大的行需要从存储后端读取,在 OLAP 情况下甚至如此。我同意,如果您计划在图中的每个顶点上进行计算,最好将其作为 OLAP 操作来完成。

可以在这个 Titan mailing list thread 中找到这个和其他几个好的技巧。请记住,link 已经很老了,所以概念仍然有效,但一些 Titan 配置属性名称可能不同。