计算土卫六上的超级节点

时间:2016-03-24 08:15:16

标签: titan tinkerpop

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

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

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

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$4.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]

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

2 个答案:

答案 0 :(得分:3)

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

TinkerPop 3中有一个名为GraphComputer的概念,可用于执行此类任务。

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

例如,您可以使用SparkGraphComputerApache Spark之上运行查询。

答案 1 :(得分:3)

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

这个以及其他一些好的提示可以在Titan mailing list thread中找到。请记住链接很旧,所以概念仍然有效,但是一些Titan配置属性名称可能不同。