TinkerPop集成Hadoop+Spark

邹英光
2023-12-01

前言

前面介绍了TinkerPop集成Neo4j的配置方法,并且实现了HA操作。这里有一个突出问题就是不管是使用Neo4j,还是自带的TinkerGraph都不可避免的面临一个问题——大数据量场景,也即分布式问题。鉴于此,Tinkerpop还提供了和Hadoop+Spark的集成解决方案,从而解决单节点问题。但是由于Spark中的数据一致性问题,不能修改数据,所以这种方案不能修改数据,也不能新增数据,只适合用来查询、计算,不得不说这是一个很大的缺点。如果有同学有更好的解决方法,欢迎在下面留言交流。另外,本文的所有操作同样都以Tinkerpop Server 3.4.4为例。

TinkerPop集成Hadoop+Spark

Tinkerpop官网中已经给出了和Hadoop+Spark的集成方法,但是有两个问题。第一,所有的操作都是基于console完成的,没有server的操作步骤;第二,在使用SparkGraphComputer时,master都是local模式,对于使用YARN作为资源管理器的时候,参照官网资料往往是调试不成功的。原因主要有三点:

  1. SparkGraphComputer会创建自己的SparkContext,而不是通过spark-submit获取配置信息。
  2. 对于Spark运行在YARN上的模式,直到Tinkerpop 3.2.7/3.3.1版本之后才支持。
  3. 集群的Spark依赖包很可能会和Tinkerpop的依赖产生冲突。

另外,在配置过程中,还需要指定Hadoop的依赖包目录信息和Tinkerpop Spark的驱动包路径,并且这一步往往是成功的关键。详细步骤如下:

  1. 安装Hadoop和Spark依赖
    ./gremlin-server.sh install org.apache.tinkerpop hadoop-gremlin 3.4.4
    ./gremlin-server.sh install org.apache.tinkerpop spark-gremlin 3.4.4
  2. 将Tinkerpop_HOME/ext/spark-gremlin/lib目录下的所有文件打包为spark-gremlin.zip文件(不需要新建spark-gremlin目录,直接打包所有jar包,可以参考apache-tinkerpop-gremlin-console-3.4.4/bin/hadoop/init-tp-spark.sh),并放置在/tmp/目录(任意位置都可以,和下面配置相同即可,也可以放在hdfs上)。
  3. 制作启动文件spark-yarn.sh,放在Tinkerpop_HOME/bin目录下,内容如下:
    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

  4. 修改Tinkerpop_HOME/conf目录下的hadoop-gryo.properties配置文件如下。Tinkerpop Server通常不提供该文件,可以从Tinkerpop Console的 conf/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

     

  5. 将数据文件tinkerpop-modern.kryo拷贝到hdfs上,并保持文件位置和4中gremlin.hadoop.inputLocation配置一致。
  6. 修改Tinkerpop_HOME/conf/gremlin-server-spark.yaml文件host和port为合适配置。
  7. 启动Tinkerpop(该方式会以前台方式启动):sh spark-yarn.sh
  8. 通过Console连接Server,第一次计算因为需要初始化Spark环境,所以会比较慢。

上面步骤会以前台方式启动Tinkerpop Server,更多启动方式可以参考前一篇文章TinkerPop集成Neo4j中的详细介绍。

参考资料

http://tinkerpop.apache.org/docs/current/reference

http://tinkerpop.apache.org/docs/3.4.4/recipes

 类似资料: