TinkerPop集成Hadoop+Spark

前言

前面介紹了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包),並放置在/tmp/目錄(任意位置都可以)。
  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

     

  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

發佈了52 篇原創文章 · 獲贊 25 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章