前面介绍了TinkerPop集成Neo4j的配置方法,并且实现了HA操作。这里有一个突出问题就是不管是使用Neo4j,还是自带的TinkerGraph都不可避免的面临一个问题——大数据量场景,也即分布式问题。鉴于此,Tinkerpop还提供了和Hadoop+Spark的集成解决方案,从而解决单节点问题。但是由于Spark中的数据一致性问题,不能修改数据,所以这种方案不能修改数据,也不能新增数据,只适合用来查询、计算,不得不说这是一个很大的缺点。如果有同学有更好的解决方法,欢迎在下面留言交流。另外,本文的所有操作同样都以Tinkerpop Server 3.4.4为例。
在Tinkerpop官网中已经给出了和Hadoop+Spark的集成方法,但是有两个问题。第一,所有的操作都是基于console完成的,没有server的操作步骤;第二,在使用SparkGraphComputer时,master都是local模式,对于使用YARN作为资源管理器的时候,参照官网资料往往是调试不成功的。原因主要有三点:
另外,在配置过程中,还需要指定Hadoop的依赖包目录信息和Tinkerpop Spark的驱动包路径,并且这一步往往是成功的关键。详细步骤如下:
GREMLIN_HOME=/home/apache-tinkerpop-gremlin-server-3.4.4
export HADOOP_HOME=/usr/local/hadoop
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
export CLASSPATH=$HADOOP_CONF_DIR
export JAVA_OPTIONS="-Djava.library.path=$HADOOP_HOME/lib/native:$HADOOP_HOME/lib/native/Linux-amd64-64"
cd $GREMLIN_HOME
[ ! -e empty ] && mkdir empty
export HADOOP_GREMLIN_LIBS=$GREMLIN_HOME/empty
bin/gremlin.sh conf/gremlin-server-spark.yaml
使用CDH的配置HADOOP_HOME时可以参考下面目录:
/opt/cloudera/parcels/CDH-5.9.1-1.cdh5.9.1.p0.4/lib/hadoop
gremlin.graph=org.apache.tinkerpop.gremlin.hadoop.structure.HadoopGraph
gremlin.hadoop.graphReader=org.apache.tinkerpop.gremlin.hadoop.structure.io.gryo.GryoInputFormat
gremlin.hadoop.graphWriter=org.apache.tinkerpop.gremlin.hadoop.structure.io.gryo.GryoOutputFormat
gremlin.hadoop.jarsInDistributedCache=true
gremlin.hadoop.defaultGraphComputer=org.apache.tinkerpop.gremlin.spark.process.computer.SparkGraphComputer
gremlin.hadoop.inputLocation=tinkerpop-modern.kryo
gremlin.hadoop.outputLocation=output
####################################
# SparkGraphComputer Configuration #
####################################
spark.master=yarn
spark.submit.deployMode=client
spark.executor.memory=1g
spark.yarn.archive=/tmp/spark-gremlin.zip
spark.yarn.appMasterEnv.CLASSPATH=./__spark_libs__/*:/usr/local/hadoop/etc/hadoop
spark.executor.extraClassPath=./__spark_libs__/*:/usr/local/hadoop/etc/hadoop
spark.driver.extraLibraryPath=/usr/local/hadoop/lib/native:/usr/local/hadoop/lib/native/Linux-amd64-64
spark.executor.extraLibraryPath=/usr/local/hadoop/lib/native:/usr/local/hadoop/lib/native/Linux-amd64-64
spark.serializer=org.apache.spark.serializer.KryoSerializer
spark.kryo.registrator=org.apache.tinkerpop.gremlin.spark.structure.io.gryo.GryoRegistrator
# spark.serializer=org.apache.tinkerpop.gremlin.spark.structure.io.gryo.GryoSerializer (3.2.x model)
gremlin.spark.graphStorageLevel=MEMORY_AND_DISK
gremlin.spark.persistContext=true
上面步骤会以前台方式启动Tinkerpop Server,更多启动方式可以参考前一篇文章TinkerPop集成Neo4j中的详细介绍。