Janusgraph火花番石榴版

时间:2017-06-06 10:08:11

标签: hadoop apache-spark graph guava janusgraph

这是我的问题:

我们正在使用cloudera 5.7.0和java 1.8.0_74,我们有spark 1.6.0,janusgraph 0.1.1,hbase 1.2.0。

我在gremlin shell中运行以下代码:

:load data/call-janusgraph-schema-groovy
writeGraphPath='conf/my-janusgraph-hbase.properties'
writeGraph=JanusGraphFactory.open(writeGraphPath)
defineCallSchema(writeGraph)
writeGraph.close()

readGraph=GraphFactory.open('conf/hadoop-graph/hadoop-call-script.properties')
gRead=readGraph.traversal()
gRead.V().valueMap()

//so far so good everything works perfectly

blvp=BulkLoaderVertexProgram.build().keepOriginalIds(true).writeGraph(writeGraphPath).create(readGraph)
readGraph.compute(SparkGraphComputer).workers(1).program(blvp).submit().get()

明星执行火花工作,第一阶段顺利运行,但在第二阶段,我得到一个例外:

java.lang.NoSuchMethodError: com.google.common.base.Stopwatch.createStarted()Lcom/google/common/base/Stopwatch;
at org.janusgraph.graphdb.database.idassigner.StandarIdPool.waitForIDBlockGetter(StandartIDPool.java:136).......

我认为这是一个番石榴版本问题

以下是我启动gremlin shell的方法

#!/bin/bash

export JAVA_HOME=/mnt/hdfs/jdk.1.8.0_74

export HADOOP_HOME=/opt/cloudera/parcels/CDH-5.7.0-1.cdh5.7.0.p0.45/lib/hadoop
export HADOOP_CONF_DIR= /etc/hadoop/conf.cloudera.yarn
export YARN_HOME=/opt/cloudera/parcels/CDH-5.7.0-1.cdh5.7.0.p0.45/lib/hadoop-yarn
export YARN_CONF_DIR=$HADOOP_CONF_DIR
export SPARK_HOME=/opt/cloudera/parcels/CDH-5.7.0-1.cdh5.7.0.p0.45/lib/spark
export SPARK_CONF_DIR=$SPARK_HOME/conf
export HBASE_HOME=/opt/cloudera/parcels/CDH-5.7.0-1.cdh5.7.0.p0.45/lib/hbase
export HBASE_CONF_DIR=$HBASE_HOME/conf

source "$HADOOP_CONF_DIR"/hadoop-env.sh
source "$SPARK_HOME"/bin/load-spark-env.sh
source "$HBASE_CONF_DIR"/hbase-env.sh

export JAVA_OPTIONS="$JAVA_OPTIONS -Djava.library.path=/opt/cloudera/parcels/CDH-5.7.0-1.cdh5.7.0.p0.45/lib/hadoop/lib/native -Dtinkerpop.ext=ext -Dlog4j.configuration=conf/log4j-console.properties -Dgremlin.log4j.level=$GREMLIN_LOG_LEVEL -javaagent:/mnt/hdfs/janusgraph-0.1.1-hadoop2/lib/jamm-0.3.0.jar -Dhdp.version=$HDP_VERSION"

GREMLINHOME=/mnt/hdfs/janusgraph-0.1.1-hadoop2
export HADOOP_GREMLIN_LIBS=$GREMLINHOME/lib

export CLASSPATH=$HADOOP_HOME/etc/hadoop

export CLASSPATH=$CLASSPATH:$HBASE_HOME/conf

export CLASSPATH=$GREMLINHOME/lib/*:$YARN_HOME/*:$YARN_CONF_DIR:$SPARK_HOME/lib/*:$SPARK_CONF_DIR:$CLASSPATH

cd $GREMLINHOME
export GREMLIN_LOG_LEVEL=info
exec $GREMLINHOME/bin/gremlin.sh $*

这是我的conf / hadoop-graph / hadoop-call-script.properties文件:

gremlin.graph=org.apache.tinkerpop.gremlin.hadoop.structure.HadoopGraph
gremlin.hadoop.GraphInputFormat=org.apache.tinkerpop.gremlin.hadoop.structure.io.script.ScriptInputFormat
gremlin.hadoop.inputLocation=/user/hive/warehouse/tablex/000000_0
gremlin.hadoop.scriptInputFormat.script=/user/me/janus/script-input-call.groovy
gremlin.hadoop.outputLocation=output
gremlin.hadoop.jarsInDistributedCache=true

spark.driver.maxResultSize=8192
spark.yarn.executor.memoryOverhead=5000
spark.executor.cores=1
spark.executor.instances=1000
spark.master=yarn-client
spark.executor.memory=10g
spark.driver.memory=10g
spark.serializer=org.apache.spark.serializer.JavaSerializer

如果我将“spark.master = yarn-client”行更改为“spark.master = local [*]”,那么它会完美运行并将数据加载到janusgraph中,不会抛出任何异常。但是我需要使用纱线,这对我来说是必须的。因此,我将guava-18.0.jar添加到hdfs并将“spark.executor.extraClassPath = hdfs:///user/me/guava-18.0.jar”行添加到hadoop-call-script.properties。 它没有解决问题。

目前我缺乏想法和无助,感谢任何帮助。

不是:我知道mvn着色与此问题有关,但是在这种情况下,由于我使用janusgraph代码创建一个spark作业,我无法干预和遮蔽番石榴包。

提前, 阿里

2 个答案:

答案 0 :(得分:2)

当您提交将使用Janusgraph从/向HBase读取/写入的Spark作业时,会出现此问题。问题的真正原因是每个组件都需要不同版本的番石榴,它具有非常快节奏的提交,并且不能确保版本之间的兼容性。这里是快速查看版本依赖 -

  • Spark v1.6.1 - Guava v14.0.1
  • HBase v1.2.4 - Guava v12.0
  • Janusgraph 0.1.1 - Guava v18.0

即使您在CLASSPATH中使用了所有三个jar,由于版本冲突,您将继续使用guava。我解决它的方法是重建Janusgraph并在janusgraph-core和janusgraph-hbase-parent中重新定位guale guava。

解决了这个问题之后,我遇到了一些与Spark和HBase中的jetty冲突相关的其他依赖问题,为此我从janusgraph-hbase-parent着色中排除了mortbay。

希望这有帮助,如果您需要更多相关信息,我将更新答案。

答案 1 :(得分:0)

几天前我遇到了完全相同的问题。这是因为com.google.guava:guava:18.0工件可能不存在于类路径中,或者类路径中可能存在同一个jar的多个版本。

#from the projects home dir
>ls -lrt lib/ | grep gua
# should show guava-18.0.jar

如果工件(https://mvnrepository.com/artifact/com.google.guava/guava/18.0)不存在,则将其添加到lib文件夹中。

最好从shell脚本中打印$ CLASSPATH,以检查类路径上是否需要jars