Janusgraph spark 番石榴版
Janusgraph spark guava version
这是我的问题:
我们将 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()
它开始执行 spark 作业和第一阶段 运行s 顺利但是在第二阶段我得到一个异常:
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).......
我觉得是guava版本问题
下面是我如何启动 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 作业,所以我无法干预和着色 guava 包。
提前致谢,
阿里
几天前我遇到了完全相同的问题。发生这种情况是因为类路径中可能不存在 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 是否在类路径中
当您提交将使用 Janusgraph 的 Spark 作业到 read/write from/to HBase 时会出现问题。问题的真正原因是每个组件都需要不同版本的番石榴,它的提交速度非常快,并且无法确保版本之间的兼容性。这是快速查看版本依赖性 -
- 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 中重定位着色番石榴。
解决这个问题后,我遇到了一些与 Spark 和 HBase 中的码头冲突相关的其他依赖性问题,为此我从 janusgraph-hbase-parent 着色中排除了 mortbay。
希望这对您有所帮助,如果您需要这方面的更多信息,我会更新答案。
这是我的问题:
我们将 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()
它开始执行 spark 作业和第一阶段 运行s 顺利但是在第二阶段我得到一个异常:
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).......
我觉得是guava版本问题
下面是我如何启动 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 作业,所以我无法干预和着色 guava 包。
提前致谢, 阿里
几天前我遇到了完全相同的问题。发生这种情况是因为类路径中可能不存在 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 是否在类路径中
当您提交将使用 Janusgraph 的 Spark 作业到 read/write from/to HBase 时会出现问题。问题的真正原因是每个组件都需要不同版本的番石榴,它的提交速度非常快,并且无法确保版本之间的兼容性。这是快速查看版本依赖性 -
- 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 中重定位着色番石榴。
解决这个问题后,我遇到了一些与 Spark 和 HBase 中的码头冲突相关的其他依赖性问题,为此我从 janusgraph-hbase-parent 着色中排除了 mortbay。
希望这对您有所帮助,如果您需要这方面的更多信息,我会更新答案。