2017-06-14 9 views
0

私はDynamoDB + JanusGraphチュートリアルをAWSから一般化しようとしています。標準的な慣習で標準の.txtファイルがあれば、プログラムはデータをトリプル)、頂点、プロパティ、およびエッジを作成します。通常、私はこのような長い問題を投稿しませんが、これらはすべて私が作成した同じクラスObjectCreationCommand内の4-5行に関連しているようです。 "name:Jim Henson \t isCreatorOf \t televisionshow:The Muppets"DynamoDB + JanusGraph Factoryの一般化:ロックとスキーマの問題

  1. 左オブジェクト::ジム・ヘンソン
  2. 左Objectプロパティ:
  3. 関係に名前を付ける:
  4. 権利オブジェクトisCreatorOf:マペット
  5. 権利オブジェクト

    は、例えば、トリプルは、このようになりますプロパティ:テレビ番組

プログラムはコンパイルされて実行されますが、グラフが塗りつぶされないようにいくつかの例外がスローされます。私は工場出荷時のプログラムを実行すると、それは私のトリプルのすべてを読み取り、ハッシュセットにそれらを置くが、その後、次のエラーが発生した(10回、これは唯一の1例です):

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) 

次に、同様の

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 

をそして、スキーマ関連の例外がスローされます:例外がスローされ

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) 

そして最後に、私は本当に理解していないという例外がスローされます。

58512 [pool-10-thread-8] ERROR com.amazon.janusgraph.example.MarvelGraphFactory - Error processing line Could not find type for id: 11529 
java.lang.IllegalStateException: Could not find type for id: 11529 
    at com.google.common.base.Preconditions.checkState(Preconditions.java:197) 
    at org.janusgraph.graphdb.types.vertices.JanusGraphSchemaVertex.name(JanusGraphSchemaVertex.java:59) 
    at org.janusgraph.graphdb.types.vertices.JanusGraphSchemaVertex.asIndexType(JanusGraphSchemaVertex.java:177) 
    at org.janusgraph.graphdb.database.management.ManagementSystem.getGraphIndexDirect(ManagementSystem.java:412) 
    at org.janusgraph.graphdb.database.management.ManagementSystem.getGraphIndex(ManagementSystem.java:422) 
    at com.amazon.janusgraph.creator.ObjectCreationCommand.run(ObjectCreationCommand.java:55) 
    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) 

最終取引がNullであるため、NullPointerExceptionがスローされ、トランザクションがコミットされることはありません。したがって、私のグラフは初期化されますが空です。

通常、私はこのような長い問題は投稿しませんが、これらはすべて私が作成した同じクラスObjectCreationCommand内の4-5行に関連しているようです。すべてのエラーがライン47、55から来たか、そのクラスの59ショー上記

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

} 

例外:

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

誰もが私がやっている特定するのに役立ちますこのクラスで間違っていますか?私がやっていることは、テーブルをロックしてスキーマの問題を作り出すことです。

答えて

2

まず、オリジナルのrun()メソッドがテキストファイルの各行に対して実行されます。 first thing you do is roll backの場合、以前の繰り返しで作成した頂点とエッジが吹き飛ばされます。

第2に、次の行で、setup the schema for each and every lineを試しましたが、インスタンス化直後にグラフのスキーマを一度設定する必要があります。これは、インデックス名が一意でなければならないので(インデックス作成のプロパティの名前に必ずしも名前を付ける必要はありません)、スキーマ例外のソースでした。

第78行目と第83行目では、処理したテキストファイルのうち、creating the vertices anew for every lineとしました。一意性制約は、の場合と同じくらい適用されます。ここでは、関係を処理する際に一意制約を尊重します。

最後に、〜100個の頂点と~100個のエッジを持つグラフの場合は、バッチ処理とエグゼキュータを設定するためのビットです。私はa PR that fixes all of these issues and proposes two different waysを提出し、手元のデータロードに近づいた。

0

documentationに記載されているように、インデックスを作成する前にアクティブなトランザクションをロールバックする必要があります。あなたはそれを試しましたか?

+0

これは間違いありませんが、ロールバックによって追加されたと思われるエッジがロールバックで吹き飛ばされるため、ロールバックによって他の問題が発生します。 –

関連する問題