2017-06-14 3 views
0

Ich arbeite an der Generalisierung der DynamoDB + JanusGraph Tutorial von AWS, so dass das Programm die Daten (als eine Triple) und erstellen Sie die Scheitelpunkte, Eigenschaften und Kanten. Normalerweise würde ich solch ein langwieriges Problem nicht posten, aber es scheint, dass diese alle zu 4-5 Zeilen innerhalb der gleichen Klasse, ObjectCreationCommand, die ich erstellt habe, verwandt sind.Generating DynamoDB + JanusGraph Factory: Sperren und Schema Probleme

Ein Beispiel Dreibettzimmer sieht wie folgt aus: "name:Jim Henson \t isCreatorOf \t televisionshow:The Muppets"

  1. Left Objekt: Jim Henson
  2. Left Objekt Eigenschaft: Name
  3. Beziehung: isCreatorOf
  4. Rechts Objekt: Die Muppets
  5. Rechts Objekt Eigentum: Fernsehshow

Obwohl das Programm kompiliert und ausgeführt wird, werden mehrere Ausnahmen ausgelöst, die verhindern, dass der Graph gefüllt wird. Wenn ich die Fabrik-Programm ausführen, liest er alle meine Tripel und setzt sie in einen Hash-Set, aber dann tritt der folgende Fehler (10-mal, aber das ist nur ein Beispiel):

57338 [pool-10-thread-2] ERROR org.janusgraph.graphdb.database.StandardJanusGraph - Could not commit transaction [10] due to exception 
org.janusgraph.diskstorage.locking.TemporaryLockingException: tx 0x181404008c7c already locked key-column (16-165-160-114-116- 30- 98-114- 97-110-100-116-121-112-229, 0) when tx 0x181408349015 tried to lock 
    at com.amazon.janusgraph.diskstorage.dynamodb.AbstractDynamoDBStore.acquireLock(AbstractDynamoDBStore.java:132) 
    at org.janusgraph.diskstorage.util.MetricInstrumentedStore$4.call(MetricInstrumentedStore.java:155) 
    at org.janusgraph.diskstorage.util.MetricInstrumentedStore$4.call(MetricInstrumentedStore.java:153) 
    at org.janusgraph.diskstorage.util.MetricInstrumentedStore.runWithMetrics(MetricInstrumentedStore.java:217) 
    at org.janusgraph.diskstorage.util.MetricInstrumentedStore.acquireLock(MetricInstrumentedStore.java:152) 
    at org.janusgraph.diskstorage.keycolumnvalue.KCVSProxy.acquireLock(KCVSProxy.java:52) 
    at org.janusgraph.diskstorage.BackendTransaction.acquireIndexLock(BackendTransaction.java:255) 
    at org.janusgraph.graphdb.database.StandardJanusGraph.prepareCommit(StandardJanusGraph.java:565) 
    at org.janusgraph.graphdb.database.StandardJanusGraph.commit(StandardJanusGraph.java:694) 
    at org.janusgraph.graphdb.transaction.StandardJanusGraphTx.commit(StandardJanusGraphTx.java:1363) 
    at org.janusgraph.graphdb.database.management.ManagementSystem.commit(ManagementSystem.java:235) 
    at com.amazon.janusgraph.creator.ObjectCreationCommand.run(ObjectCreationCommand.java:59) 
    at com.amazon.janusgraph.batch.BatchCommand.run(BatchCommand.java:34) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
    at java.lang.Thread.run(Thread.java:745) 

Als nächstes wird eine ähnliche Ausnahme ausgelöst:

57427 [pool-10-thread-10] ERROR com.amazon.janusgraph.example.MarvelGraphFactory - Error processing line Could not commit transaction due to exception during persistence tx 0x181404008c7c already locked key-column (16-165-160-114-116- 30- 98-114- 97-110-100-116-121-112-229, 0) when tx 0x181403f69b77 tried to lock 
org.janusgraph.core.JanusGraphException: Could not commit transaction due to exception during persistence 
    at org.janusgraph.graphdb.transaction.StandardJanusGraphTx.commit(StandardJanusGraphTx.java:1374) 
    at org.janusgraph.graphdb.database.management.ManagementSystem.commit(ManagementSystem.java:235) 
    at com.amazon.janusgraph.creator.ObjectCreationCommand.run(ObjectCreationCommand.java:59) 
    at com.amazon.janusgraph.batch.BatchCommand.run(BatchCommand.java:34) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
    at java.lang.Thread.run(Thread.java:745) 
Caused by: org.janusgraph.core.JanusGraphException: Unexpected exception 
    at org.janusgraph.graphdb.database.StandardJanusGraph.commit(StandardJanusGraph.java:798) 
    at org.janusgraph.graphdb.transaction.StandardJanusGraphTx.commit(StandardJanusGraphTx.java:1363) 
    ... 6 more 
Caused by: org.janusgraph.diskstorage.locking.TemporaryLockingException: tx 0x181404008c7c already locked key-column (16-165-160-114-116- 30- 98-114- 97-110-100-116-121-112-229, 0) when tx 0x181403f69b77 tried to lock 
    at com.amazon.janusgraph.diskstorage.dynamodb.AbstractDynamoDBStore.acquireLock(AbstractDynamoDBStore.java:132) 
    at org.janusgraph.diskstorage.util.MetricInstrumentedStore$4.call(MetricInstrumentedStore.java:155) 
    at org.janusgraph.diskstorage.util.MetricInstrumentedStore$4.call(MetricInstrumentedStore.java:153) 
    at org.janusgraph.diskstorage.util.MetricInstrumentedStore.runWithMetrics(MetricInstrumentedStore.java:217) 
    at org.janusgraph.diskstorage.util.MetricInstrumentedStore.acquireLock(MetricInstrumentedStore.java:152) 
    at org.janusgraph.diskstorage.keycolumnvalue.KCVSProxy.acquireLock(KCVSProxy.java:52) 
    at org.janusgraph.diskstorage.BackendTransaction.acquireIndexLock(BackendTransaction.java:255) 
    at org.janusgraph.graphdb.database.StandardJanusGraph.prepareCommit(StandardJanusGraph.java:565) 
    at org.janusgraph.graphdb.database.StandardJanusGraph.commit(StandardJanusGraph.java:694) 
    ... 7 more 

Und dann ein Schema bezogene Ausnahme ausgelöst wird:

58030 [pool-10-thread-4] ERROR com.amazon.janusgraph.example.MarvelGraphFactory - Error processing line Adding this property for key [~T$SchemaName] and value [rtbrandtype] violates a uniqueness constraint [SystemIndex#~T$SchemaName] 
org.janusgraph.core.SchemaViolationException: Adding this property for key [~T$SchemaName] and value [rtbrandtype] violates a uniqueness constraint [SystemIndex#~T$SchemaName] 
    at org.janusgraph.graphdb.transaction.StandardJanusGraphTx.addProperty(StandardJanusGraphTx.java:791) 
    at org.janusgraph.graphdb.transaction.StandardJanusGraphTx.addProperty(StandardJanusGraphTx.java:720) 
    at org.janusgraph.graphdb.transaction.StandardJanusGraphTx.makeSchemaVertex(StandardJanusGraphTx.java:847) 
    at org.janusgraph.graphdb.transaction.StandardJanusGraphTx.makePropertyKey(StandardJanusGraphTx.java:867) 
    at org.janusgraph.graphdb.types.StandardPropertyKeyMaker.make(StandardPropertyKeyMaker.java:100) 
    at com.amazon.janusgraph.creator.ObjectCreationCommand.run(ObjectCreationCommand.java:47) 
    at com.amazon.janusgraph.batch.BatchCommand.run(BatchCommand.java:34) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
    at java.lang.Thread.run(Thread.java:745) 

Und schließlich, eine Ausnahme, die ich nicht wirklich verstehen, geworfen wird:

Da die letzte Transaktion Null ist, wird eine NullPointerException ausgelöst, und die Transaktion wird nie ausgeführt. Daher ist mein Diagramm initialisiert, aber leer.

Normalerweise würde ich nicht so ein langes Problem posten, aber es scheint, dass diese alle zu 4-5 Zeilen innerhalb der gleichen Klasse, ObjectCreationCommand, die ich erstellt habe, verwandt sind.

ObjectCreationCommand.java

package com.amazon.janusgraph.creator; 

import com.amazon.janusgraph.example.TravelGraphFactory; 
import com.codahale.metrics.MetricRegistry; 
import org.apache.commons.lang.exception.ExceptionUtils; 
import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource; 
import org.apache.tinkerpop.gremlin.structure.Vertex; 
import org.janusgraph.core.JanusGraph; 
import com.amazon.janusgraph.triple.Triple; 
import org.janusgraph.core.Multiplicity; 
import org.janusgraph.core.PropertyKey; 
import org.janusgraph.core.schema.JanusGraphManagement; 
import org.slf4j.Logger; 

import java.io.BufferedReader; 
import java.io.FileReader; 
import java.io.IOException; 
import java.util.Iterator; 
import java.util.concurrent.TimeUnit; 

public class ObjectCreationCommand implements Runnable { 

    public static JanusGraph graph; 
    private static Triple triple; 
    private static MetricRegistry REGISTRY; 
    public static Logger LOG; 
    private static final String TIMER_LINE = "TravelGraphFactory.line"; 
    private static final String TIMER_CREATE = "TravelGraphFactory.create_"; 
    private static final String COUNTER_GET = "TravelGraphFactory.get_"; 

    public ObjectCreationCommand(JanusGraph graph, Triple triple, MetricRegistry REGISTRY, Logger LOG) { 
     this.graph = graph; 
     this.triple = triple; 
     this.REGISTRY = REGISTRY; 
     this.LOG = LOG; 
    } 

    @Override 
    public void run() { 

     JanusGraphManagement mgmt = graph.openManagement(); 
     if (mgmt.getGraphIndex(triple.getRightObjectProperty()) == null) { 
      final PropertyKey hotelKey = mgmt.makePropertyKey(triple.getRightObjectProperty()).dataType(String.class).make(); 
      mgmt.buildIndex(triple.getRightObjectProperty(), Vertex.class).addKey(hotelKey).unique().buildCompositeIndex(); 
     } 

     if (mgmt.getEdgeLabel(triple.getRelationship()) == null) { 
      mgmt.makeEdgeLabel(triple.getRelationship()).multiplicity(Multiplicity.MANY2ONE).make(); 
     } 

     if (mgmt.getGraphIndex(triple.getLeftObjectProperty()) == null) { 
      final PropertyKey brandTypeKey = mgmt.makePropertyKey(triple.getLeftObjectProperty()).dataType(String.class).make(); 
      mgmt.buildIndex(triple.getLeftObjectProperty(), Vertex.class).addKey(brandTypeKey).unique().buildCompositeIndex(); 
     } 
     mgmt.commit(); 

     long start = System.currentTimeMillis(); 

     String RIGHT_OBJECT_PROPERTY = triple.getRightObjectProperty(); 
     Vertex rightObject = graph.addVertex(); 
     rightObject.property(RIGHT_OBJECT_PROPERTY, triple.getRightObject()); 
     REGISTRY.counter(COUNTER_GET + RIGHT_OBJECT_PROPERTY).inc(); 

     String LEFT_OBJECT_PROPERTY = triple.getLeftObjectProperty(); 
     Vertex leftObject = graph.addVertex(); 
     rightObject.property(LEFT_OBJECT_PROPERTY, triple.getLeftObject()); 
     REGISTRY.counter(COUNTER_GET + LEFT_OBJECT_PROPERTY).inc(); 

     try { 
      processRelationship(graph, triple); 
     } catch (Throwable e) { 
      Throwable rootCause = ExceptionUtils.getRootCause(e); 
      String rootCauseMessage = null == rootCause ? "" : rootCause.getMessage(); 
      LOG.error("Error processing line {} {}", e.getMessage(), rootCauseMessage, e); 
     } 

     long end = System.currentTimeMillis(); 
     long time = end - start; 
     REGISTRY.timer(TIMER_CREATE + RIGHT_OBJECT_PROPERTY).update(time, TimeUnit.MILLISECONDS); 
    } 

    private static void processRelationship(JanusGraph graph, Triple triple) { 
     Vertex left = get(graph, triple.getLeftObjectProperty(), triple.getLeftObject()); 
     if (null == left) { 
      REGISTRY.counter("error.missingLeftObject." + triple.getLeftObject()).inc(); 
      left = graph.addVertex(); 
      left.property(triple.getLeftObjectProperty(), triple.getLeftObject()); 
     } 
     Vertex right = get(graph, triple.getRightObjectProperty(), triple.getRightObject()); 
     if (null == right) { 
      REGISTRY.counter("error.missingRightObject." + triple.getRightObject()).inc(); 
      right = graph.addVertex(); 
      right.property(triple.getRightObjectProperty(), triple.getRightObject()); 
     } 
     left.addEdge(triple.getRelationship(), right); 
    } 

    private static Vertex get(final JanusGraph graph, final String key, final String value) { 
     final GraphTraversalSource g = graph.traversal(); 
     final Iterator<Vertex> it = g.V().has(key, value); 
     return it.hasNext() ? it.next() : null; 
    } 

} 

Die Ausnahmen oben zeigen, dass alle Fehler kommen aus Linien 47, 55 oder 59 dieser Klasse:

JanusGraphManagement mgmt = graph.openManagement(); 
if (mgmt.getGraphIndex(triple.getRightObjectProperty()) == null) { 
    [47] final PropertyKey hotelKey = mgmt.makePropertyKey(triple.getRightObjectProperty()).dataType(String.class).make(); 
    mgmt.buildIndex(triple.getRightObjectProperty(), Vertex.class).addKey(hotelKey).unique().buildCompositeIndex(); 
} 

if (mgmt.getEdgeLabel(triple.getRelationship()) == null) { 
    mgmt.makeEdgeLabel(triple.getRelationship()).multiplicity(Multiplicity.MANY2ONE).make(); 
} 

[55] if (mgmt.getGraphIndex(triple.getLeftObjectProperty()) == null) { 
    final PropertyKey brandTypeKey = mgmt.makePropertyKey(triple.getLeftObjectProperty()).dataType(String.class).make(); 
    mgmt.buildIndex(triple.getLeftObjectProperty(), Vertex.class).addKey(brandTypeKey).unique().buildCompositeIndex(); 
} 
[59] mgmt.commit(); 

Kann mir jemand helfen, zu identifizieren, was ich tue falsch in dieser Klasse? Was ich gerade mache, ist das Sperren von Tabellen und das Erstellen von Schema-Problemen.

Antwort

2

Zuerst wird Ihre ursprüngliche run() -Methode für jede Zeile in der Textdatei ausgeführt. Wenn die first thing you do is roll back, die Scheitelpunkte und Kanten, die Sie in der vorherigen Iteration erstellt haben, weggeblasen werden.

Zweitens, in der nächsten Zeile haben Sie versucht, setup the schema for each and every line, obwohl Sie das Schema nur einmal für das Diagramm direkt nach der Instanziierung festlegen müssen.Dies war die Ursache für Ihre Schema-Ausnahmen, da Indexnamen eindeutig sein müssen (und nicht notwendigerweise nach den Eigenschaften benannt werden müssen, die sie indexieren).

Drittens, in den Zeilen 78 und 83 haben Sie angenommen, dass Sie creating the vertices anew for every line der von Ihnen verarbeiteten Textdatei waren. Die Eindeutigkeitsbeschränkung gilt dort genauso wie unter , wo Sie die Eindeutigkeitsbedingung bei der Verarbeitung der Beziehungen berücksichtigt haben.

Schließlich ist es für ein Diagramm mit einer Ordnung von ~ 100 Scheitelpunkten und ~ 100 Kanten ein wenig übertrieben, Batching und einen Executor einzurichten. Ich legte a PR that fixes all of these issues and proposes two different ways vor, um sich der Datenlast zu nähern.

0

Wie in der documentation angegeben, sollten Sie eine aktive Transaktion zurücksetzen, bevor Sie versuchen, einen Index zu erstellen. Hast du das probiert?

+0

Während dies korrekt ist, bringt das Zurückrollen andere Probleme mit sich, da Kanten, die der Benutzer dachte, hinzugefügt wurden, auch im Rollback weggeblasen werden. –