2016-03-24 4 views
6

In meinem System habe ich die Anforderung, dass die Anzahl der Kanten auf dem Knoten als eine interne Eigenschaft auf dem Scheitelpunkt sowie ein Scheitelpunkt zentrischen Index auf einer bestimmten ausgehenden Kante gespeichert werden muss. Dies erfordert natürlich, dass ich die Anzahl der Kanten auf dem Knoten zähle, nachdem alle Daten vollständig geladen sind. Ich tue dies wie folgt:Zählen von Superknoten auf Titan

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

Allerdings, wenn ich meine Tests auf den Punkt vergrößern, wo einige meiner Knoten „super“ Knoten ich die folgende Ausnahme auf der oberen Zeile:

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] 

Was ist der beste Weg, um das zu beheben? Soll ich einfach die Framegröße erhöhen oder gibt es eine bessere Möglichkeit, die Anzahl der Kanten auf dem Knoten zu zählen?

Antwort

3

Ja, Sie müssen die Bildgröße erhöhen. Wenn Sie einen Superknoten haben, gibt es eine wirklich große Zeile, die aus dem Speicher-Backend ausgelesen werden muss, und dies gilt sogar im Fall von OLAP. Ich stimme zu, dass, wenn Sie planen, dies für jeden Eckpunkt in der Grafik zu berechnen, dies am besten als eine OLAP-Operation durchgeführt werden würde.

Dies und einige andere gute Tipps finden Sie in diesem Titan mailing list thread. Beachten Sie, dass der Link ziemlich alt ist, daher sind die Konzepte immer noch gültig, aber einige der Namen der Titan-Konfigurationseigenschaften können sich unterscheiden.

+0

Bedeutet das, dass ich anfangen muss, Gremlin-Hadoop zu integrieren? –

3

Eine solche Aufgabe, die von Natur aus OLAP ist, sollte mit einem verteilten System ausgeführt werden, das kein Traversal verwendet.

Es gibt ein Konzept namens GraphComputer in TinkerPop 3, das verwendet werden kann, um eine solche Aufgabe zu erfüllen.

Sie können grundsätzlich Gremlin-Abfragen ausführen, die auf mehreren Maschinen ausgewertet werden.

Zum Beispiel können Sie SparkGraphComputer verwenden, um Ihre Abfragen über Apache Spark auszuführen.