Использование SparkGraphComputer для обхода кластера титанов выдает ошибку

У меня есть кластер с tinkerpop-3.1.1, titan-1.1.0-SNAPSHOT, spark-1.5.2 и hadoop-2.7.1, и я запускаю этот скрипт, чтобы воспроизвести ошибку:

graph = GraphFactory.open("hadoop-gryo.properties")

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

graph.traversal(computer(SparkGraphComputer)).V().next()

graph = GraphFactory.open("titan-cassandra-test-spark.properties")

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

graph.traversal(computer(SparkGraphComputer)).V().next()

Последний вызов выдает эту ошибку:

You must set the initial output address to a Cassandra node with setInputInitialAddress
Display stack trace? [yN] y
java.lang.IllegalStateException: You must set the initial output address to a Cassandra node with setInputInitialAddress
    at org.apache.tinkerpop.gremlin.hadoop.structure.io.HadoopElementIterator.<init>(HadoopElementIterator.java:71)
    at org.apache.tinkerpop.gremlin.hadoop.structure.io.HadoopVertexIterator.<init>(HadoopVertexIterator.java:36)
    at org.apache.tinkerpop.gremlin.hadoop.structure.HadoopGraph.vertices(HadoopGraph.java:263)
    at org.apache.tinkerpop.gremlin.process.traversal.step.map.GraphStep.lambda$new$379(GraphStep.java:61)
    at org.apache.tinkerpop.gremlin.process.traversal.step.map.GraphStep.processNextStart(GraphStep.java:123)
    at org.apache.tinkerpop.gremlin.process.traversal.step.util.AbstractStep.next(AbstractStep.java:126)
    at org.apache.tinkerpop.gremlin.process.traversal.step.util.AbstractStep.next(AbstractStep.java:37)
    at org.apache.tinkerpop.gremlin.process.traversal.util.DefaultTraversal.next(DefaultTraversal.java:157)
    at java_util_Iterator$next.call(Unknown Source)
    at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:48)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:113)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:117)
    at groovysh_evaluate.run(groovysh_evaluate:3)
    at org.codehaus.groovy.vmplugin.v7.IndyInterface.selectMethod(IndyInterface.java:218)
    at org.codehaus.groovy.tools.shell.Interpreter.evaluate(Interpreter.groovy:70)
    at org.codehaus.groovy.tools.shell.Groovysh.execute(Groovysh.groovy:187)
    at org.codehaus.groovy.tools.shell.Shell.leftShift(Shell.groovy:122)
    at org.codehaus.groovy.tools.shell.ShellRunner.work(ShellRunner.groovy:95)
    at org.codehaus.groovy.tools.shell.InteractiveShellRunner.super$2$work(InteractiveShellRunner.groovy)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:93)
    at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:325)
    at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1210)
    at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.invokeMethodOnSuperN(ScriptBytecodeAdapter.java:132)
    at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.invokeMethodOnSuper0(ScriptBytecodeAdapter.java:152)
    at org.codehaus.groovy.tools.shell.InteractiveShellRunner.work(InteractiveShellRunner.groovy:124)
    at org.codehaus.groovy.tools.shell.ShellRunner.run(ShellRunner.groovy:59)
    at org.codehaus.groovy.tools.shell.InteractiveShellRunner.super$2$run(InteractiveShellRunner.groovy)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:93)
    at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:325)
    at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1210)
    at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.invokeMethodOnSuperN(ScriptBytecodeAdapter.java:132)
    at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.invokeMethodOnSuper0(ScriptBytecodeAdapter.java:152)
    at org.codehaus.groovy.tools.shell.InteractiveShellRunner.run(InteractiveShellRunner.groovy:83)
    at org.codehaus.groovy.vmplugin.v7.IndyInterface.selectMethod(IndyInterface.java:218)
    at org.apache.tinkerpop.gremlin.console.Console.<init>(Console.groovy:144)
    at org.codehaus.groovy.vmplugin.v7.IndyInterface.selectMethod(IndyInterface.java:218)
    at org.apache.tinkerpop.gremlin.console.Console.main(Console.groovy:305)
Caused by: java.lang.UnsupportedOperationException: You must set the initial output address to a Cassandra node with setInputInitialAddress
    at org.apache.cassandra.hadoop.AbstractColumnFamilyInputFormat.validateConfiguration(AbstractColumnFamilyInputFormat.java:84)
    at org.apache.cassandra.hadoop.ColumnFamilyInputFormat.validateConfiguration(ColumnFamilyInputFormat.java:74)
    at org.apache.cassandra.hadoop.AbstractColumnFamilyInputFormat.getSplits(AbstractColumnFamilyInputFormat.java:122)
    at com.thinkaurelius.titan.hadoop.formats.cassandra.CassandraBinaryInputFormat.getSplits(CassandraBinaryInputFormat.java:48)
    at com.thinkaurelius.titan.hadoop.formats.util.GiraphInputFormat.getSplits(GiraphInputFormat.java:48)
    at org.apache.tinkerpop.gremlin.hadoop.structure.io.HadoopElementIterator.<init>(HadoopElementIterator.java:66)
    ... 44 more

Как ни странно, граф hadoop-gryo.properties (который, по общему признанию, является локальным для машины, на которой я работаю) может выполнять необходимые обходы. Ошибка возникает только тогда, когда я пытаюсь выполнить ЛЮБОЙ обход, кроме подсчета, на графе хаупа, указывающем на кластер титанов (я прикрепил конфигурацию в конце). Это ошибка, или я пропустил настройку?

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.graphOutputFormat=org.apache.tinkerpop.gremlin.hadoop.structure.io.gryo.GryoOutputFormat
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=lxd-cluster2-cassandra1,lxd-cluster2-cassandra2,lxd-cluster2-cassandra3
titanmr.ioformat.cf-name=edgestore
####################################
# SparkGraphComputer Configuration #
####################################
spark.master=spark://lxd-cluster2-cassandra1:7077
#spark.master=local[6]
spark.executor.memory=4g
spark.serializer=org.apache.spark.serializer.KryoSerializer
#spark.eventLog.enabled=true
####################################
# 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
cassandra.thrift.framed.size_mb=1024
####################################
# Hadoop Cluster configuration     #
####################################
fs.defaultFS=hdfs://lxd-cluster2-cassandra1:9000

person Sheldon    schedule 05.08.2016    source источник
comment
Есть ли вложенная трассировка стека, которая показывает больше информации о том, что произошло в Титане, чтобы вызвать IllegalStateException?   -  person Jason Plurad    schedule 05.08.2016
comment
Привет, Джейсон, спасибо, что заглянул. Я изменил трассировку стека в исходном вопросе.   -  person Sheldon    schedule 05.08.2016
comment
Что, если вы попытаетесь использовать только один хост на titanmr.ioformat.conf.storage.hostname=lxd-cluster2-cassandra1? Я подозреваю, что эта строка неправильно обрабатывает значения, разделенные запятыми.   -  person Jason Plurad    schedule 05.08.2016
comment
Я попробовал один хост, но, к сожалению, это не сработало. Спасибо за подсказку, я посмотрю более подробно и посмотрю, что я могу найти.   -  person Sheldon    schedule 05.08.2016
comment
Я вижу, что он устанавливает для cassandra.input.thrift.address значение lxd-cluster2-cassandra1 в этой строке, но все равно выдает ошибку. Я попытаюсь определить, что он проверяет, что вызывает ошибку, которую я получаю, чтобы увидеть, смотрит ли он на другое свойство в конфигурации.   -  person Sheldon    schedule 05.08.2016
comment
Вместо g.V().next() вы можете сделать g.V().valueMap(true).next() или g.V().valueMap(true).limit(1).   -  person Jason Plurad    schedule 06.08.2016
comment
Привет, Джейсон, эти два запроса сработали, это ошибка или что-то, что мне не хватает в отношении обходов OLAP? Судя по обходу, вы заставляете извлекать valueMap для КАЖДОЙ вершины, а затем просто выбираете одну для отображения - это для того, чтобы заставить ее поместить вершины в искру от титана?   -  person Sheldon    schedule 08.08.2016
comment
Я смог воспроизвести поведение, которое вы видели. Я бы сказал, продолжайте и откройте вопрос для более глубокого изучения/объяснения. Проблема возникает только тогда, когда результатом обхода является список вершин (или ребер). Если вы вернете что-то отличное от вершины, например valueMap() или id(), те же шаги обхода вернутся без ошибок. Вы можете использовать тот же подход для отдельных вершин g.V(512L).valueMap(true) или многошаговых обходов g.V().out().out().valueMap(true).   -  person Jason Plurad    schedule 08.08.2016
comment
Сделанный. Вы можете увидеть проблему здесь   -  person Sheldon    schedule 08.08.2016