前言
前面介紹了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作爲資源管理器的時候,參照官網資料往往是調試不成功的。原因主要有三點:
- SparkGraphComputer會創建自己的SparkContext,而不是通過spark-submit獲取配置信息。
- 對於Spark運行在YARN上的模式,直到Tinkerpop 3.2.7/3.3.1版本之後才支持。
- 集羣的Spark依賴包很可能會和Tinkerpop的依賴產生衝突。
另外,在配置過程中,還需要指定Hadoop的依賴包目錄信息和Tinkerpop Spark的驅動包路徑,並且這一步往往是成功的關鍵。詳細步驟如下:
- 安裝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 - 將Tinkerpop_HOME/ext/spark-gremlin/lib目錄下的所有文件打包爲spark-gremlin.zip文件(不需要新建spark-gremlin目錄,直接打包所有jar包),並放置在/tmp/目錄(任意位置都可以)。
- 製作啓動文件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
- 修改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
- 將數據文件tinkerpop-modern.kryo拷貝到hdfs上,並保持文件位置和4中gremlin.hadoop.inputLocation配置一致。
- 修改Tinkerpop_HOME/conf/gremlin-server-spark.yaml文件host和port爲合適配置。
- 啓動Tinkerpop(該方式會以前臺方式啓動):sh spark-yarn.sh
- 通過Console連接Server,第一次計算因爲需要初始化Spark環境,所以會比較慢。
上面步驟會以前臺方式啓動Tinkerpop Server,更多啓動方式可以參考前一篇文章TinkerPop集成Neo4j中的詳細介紹。