3

SparkGraphComputer を使用してクラスター上のタイタン グラフの頂点数をカウントしようとすると、対処方法がわからないというエラーが表示されます。コードでtinkerpop 3.1.1-incubatingとTitan 1.1.0-SNAPSHOTを使用しており、クラスターにdatastax community edition 2.1.11とspark 1.5.2-bin-hadoop2.6をインストールしました

私の問題を再現するために、最小限の Java の例をまとめました。

private void strippedDown() {
    // a normal titan cluster
    String titanClusterConfig = "titan-cassandra-test-cluster.properties";

    // a hadoop graph with cassandra as input and gryo as output
    String sparkClusterConfig = "titan-cassandra-test-spark.properties";

    String edgeLabel = "blank";

    // add a graph
    int n = 100;
    Graph titanGraph = GraphFactory.open(titanClusterConfig);
    Vertex superNode = titanGraph.addVertex(T.label, String.valueOf(0));
    for (int i=1;i<n;i++) {
        Vertex currentNode = titanGraph.addVertex(T.label, String.valueOf(i));
        currentNode.addEdge(edgeLabel,superNode);
    }
    titanGraph.tx().commit();

    //count with titan
    Long count = titanGraph.traversal().V().count().next();
    System.out.println("The number of vertices in the graph is: "+count);

    // count the graph using titan graph computer
    count = titanGraph.traversal(GraphTraversalSource.computer(FulgoraGraphComputer.class)).V().count().next();
    System.out.println("The number of vertices in the graph is: "+count);

    // count the graph using spark graph computer
    Graph sparkGraph = GraphFactory.open(sparkClusterConfig);
    count = sparkGraph.traversal(GraphTraversalSource.computer(SparkGraphComputer.class)).V().count().next();
    System.out.println("The number of vertices in the graph is: "+count);
}

OLTP を使用したカウントと、FulgoraGraphComputer で OLAP を使用したカウントは、正しい答えを返します。ただし、SparkGraphComputer を使用した OLAP カウントは、org.apache.spark.SparkException: Job aborted due to stage failure: をスローします。

興味深いことに、Titan に同梱されている gremlin コンソールで同様のスクリプトを実行すると、同じアルゴリズムのように見える別のエラーが発生します。

graph = GraphFactory.open('titan-cassandra-test-cluster.properties')
graph.addVertex(T.label,"0")
graph.addVertex(T.label,"1")
graph.addVertex(T.label,"2")
graph.tx().commit()
sparkGraph = GraphFactory.open('titan-cassandra-test-spark.properties')
sparkGraph.traversal(computer(SparkGraphComputer)).V().count()

これは 2 回スローorg.apache.thrift.protocol.TProtocolException: Required field 'keyspace' was not present! Struct: set_keyspace_args(keyspace:null)しますが、完了して正しくない 0 を返します。

この記事がメーリング リストにあることは知っていますが、内容を理解できないか、問題を解決できません。何が起こっているのか、これを修正する方法を誰かに説明してもらえますか? 以下に設定を貼り付けました。

gremlin.graph=com.thinkaurelius.titan.core.TitanFactory
storage.backend=cassandrathrift
storage.hostname=node1
storage.cassandra.keyspace=mindmapstest
storage.cassandra.replication-factor=3
cache.db-cache = true
cache.db-cache-clean-wait = 20
cache.db-cache-time = 180000
cache.db-cache-size = 0.5

gremlin.graph=org.apache.tinkerpop.gremlin.hadoop.structure.HadoopGraph
gremlin.hadoop.graphInputFormat=com.thinkaurelius.titan.hadoop.formats.cassandra.CassandraInputFormat
gremlin.hadoop.graphOutputFormat=org.apache.hadoop.mapreduce.lib.output.NullOutputFormat
gremlin.hadoop.jarsInDistributedCache=true
gremlin.hadoop.inputLocation=none
gremlin.hadoop.outputLocation=none
####################################
# Cassandra Cluster Config         #
####################################
titanmr.ioformat.conf.storage.backend=cassandrathrift
titanmr.ioformat.conf.storage.cassandra.keyspace=mindmapstest
titanmr.ioformat.conf.storage.hostname=node1,node2,node3
####################################
# SparkGraphComputer Configuration #
####################################
spark.master=spark://node1:7077
spark.executor.memory=250m
spark.serializer=org.apache.spark.serializer.KryoSerializer
####################################
# Apache Cassandra InputFormat configuration
####################################
cassandra.input.partitioner.class=org.apache.cassandra.dht.Murmur3Partitioner

編集:このスクリプトはエラーを再現します

graph = TitanFactory.open('titan-cassandra-test-cluster.properties')
superNode = graph.addVertex(T.label,"0")
for(i in 1..100) {
  currentNode = graph.addVertex(T.label,i.toString())
  currentNode.addEdge("blank",superNode)
}
graph.tx().commit()

graph.traversal().V().count()

graph.traversal(computer()).V().count()

sparkGraph = GraphFactory.open('titan-cassandra-test-spark.properties')
sparkGraph.traversal(computer(SparkGraphComputer)).V().count()
4

2 に答える 2

1

私が与える理由が正しいかどうかは 100% 確信が持てませんが、問題を解決することができました。私の問題は 3 つの根本的な問題に起因しており、それらはすべて構成に関係しています。

1) 最初の問題は Jason によって親切に解決されました。これは、Cassandra に接続するための正しい構成オプションを持つことに関連していました。

2) Java コードを正常に実行できなかった理由は、HADOOP_GREMLIN_LIBS 環境変数を正しく設定していなかったためです。このため、jar はグラフ コンピューターで使用するためにクラスターにデプロイされていませんでした。これが設定されると、gremlin コンソールと Java の例で同じ問題が発生し、ゼロのカウントが返されました。

3) ゼロのカウントは、解決するのが最も困難でした。やはりマニュアルを理解していないケース。クラスターに Hadoop をインストールすることについては多くの言及がありましたが、クラスターで Hadoop に接続する方法についてはどこにも記載されていませんでした。これを行うfs.defaultFSには、クラスター上の Hadoop ファイルシステムの場所を gremlin に指示する追加の構成オプションが必要でした。これが正しく設定されると、頂点の数は正しくなりました。

私の理論では、計算は正しく実行されましたが、spark ワーカーからのカウントを減らすときが来たとき、それらはクラスターのどこかに永続化され、コンソールに応答を返すときにローカル ファイルシステムが調べられ、何も見つからなかったというものです。ゼロを返します。これはおそらくバグですか?

とにかく、私が必要とした最終的な構成ファイルは次のとおりです。

gremlin.graph=org.apache.tinkerpop.gremlin.hadoop.structure.HadoopGraph
gremlin.hadoop.graphInputFormat=com.thinkaurelius.titan.hadoop.formats.cassandra.CassandraInputFormat
gremlin.hadoop.graphOutputFormat=org.apache.hadoop.mapreduce.lib.output.NullOutputFormat
gremlin.hadoop.jarsInDistributedCache=true
gremlin.hadoop.inputLocation=none
gremlin.hadoop.outputLocation=/test/output
####################################
# Cassandra Cluster Config         #
####################################
titanmr.ioformat.conf.storage.backend=cassandrathrift
titanmr.ioformat.conf.storage.cassandra.keyspace=mindmapstest
titanmr.ioformat.conf.storage.hostname=node1,node2,node3
titanmr.ioformat.cf-name=edgestore
####################################
# SparkGraphComputer Configuration #
####################################
spark.master=spark://node1:7077
spark.executor.memory=1g
spark.serializer=org.apache.spark.serializer.KryoSerializer
####################################
# Apache Cassandra InputFormat configuration
####################################
cassandra.input.partitioner.class=org.apache.cassandra.dht.Murmur3Partitioner
cassandra.input.keyspace=mindmapstest
cassandra.input.predicate=0c00020b0001000000000b000200000000020003000800047fffffff0000
cassandra.input.columnfamily=edgestore
cassandra.range.batch.size=2147483647
spark.eventLog.enabled=true
####################################
# Hadoop Cluster configuration     #
####################################
fs.defaultFS=hdfs://node1:9000
于 2016-07-27T16:04:12.110 に答える