源碼圖庫-一文搞定janusgraph圖數據庫的本地源碼編譯(janusgraph source code compile)

源碼分析 的第一步就是要先編譯好源代碼,才能進行debug跟蹤流程查看,本文總結了janusgraph源碼編譯的全流程!

主要介紹了janusgraph+hbase+es的本地源碼編譯過程,最後介紹了janusgraph+berkeleyje+es的編譯過程。

源碼已經上傳個人github:https://github.com/YYDreamer/janusgraph 歡迎star和fork~

本文所有的 janusgraph源碼項目文件 + hadoop安裝包 + hadoop在windows的輔助安裝包 + hbase安裝包 + es安裝包全部整合放到了公衆號“匠心Java”中,微信搜索“匠心Java”,回覆“圖庫資源”四個字即可
在這裏插入圖片描述

一 本地安裝依賴環境

本機安裝hbase環境,這裏我後臺存儲使用的是 hbase,這裏爲了更好的符合正常的使用情況,沒有用janusgraph自帶的inmemory存儲形式

ps:如果你在其他服務器有hbase和es環境,就不用自己本地搭建了,如果沒有的話,我們在本地搭建一個自己的hbase和es,這種網上特別多,下面也給出了我自己搭建看的博客連接

1. 安裝hadoop 並 啓動

hbase依賴於hadoop環境,所以我們在安裝hbase前,先安裝hadoop環境

安裝:參考博客:hadoop安裝教程

啓動

  • 管理員方式打開cmd
  • 轉到對應的hadoop的sbin目錄下,例如我的:D:\app\app_develop\hadoop-2.7.7\sbin
  • 使用命令start-all* 出現四個黑框框:hadoop namenode、hadoop datanode、yarn resourcemanager、yarn nodemanager即可
  • 訪問http://localhost:50070,可以訪問即爲成功!

2. 安裝hbase 並 啓動

注意:在選擇安裝hbase的版本時,需要查看自己下載的janusgraph源碼的版本支持hbase的什麼版本

這裏我們選擇的是janusgraph-0.5.2版本,支持hbase-2.1.x版本,所以這裏我下載的hbase-2.1.5版本

安裝:參考博客:hbase安裝教程

啓動

  • 管理員方式打開cmd
  • 轉到對應的hadoop目錄下,例如我的:D:\app\app_develop\hbase-2.1.5\bin
  • 輸入命令,回車start-hbase.cmd
  • 出現一個黑框框,如下
    在這裏插入圖片描述
  • 在hbase的bin目錄下,輸入命令hbase shell,能成功連接hbase shell,即爲成功!

如果啓動報錯:java.lang.ClassNotFoundException: org.apache.htrace.core.HTraceConfiguration

解決方法: 將本地hbase-2.1.5目錄下的lib\client-facing-thirdparty目錄下的htrace-core-3.1.0-incubating.jarhtrace-core4-4.2.0-incubating.jar賦值到路徑lib下,重新start-hbase.cmd命令,啓動成功!

3. 安裝es 並 啓動

安裝:參考博客:es安裝教程

啓動

  • 管理員方式打開cmd
  • 轉到對應的hadoop目錄下,例如我的:D:\app\app_develop\elasticsearch-6.8.3\bin
  • 輸入命令,回車elasticsearch.bat
  • 輸入完命令後,當前的黑框中會啓動es,最終出現下述:
    在這裏插入圖片描述
  • 訪問http://localhost:9200/,出現下述json即爲成功!
{
  "name" : "99Xn4Vd",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "YpMeVAlzQRuzuVis1JzHpA",
  "version" : {
    "number" : "6.8.3",
    "build_flavor" : "default",
    "build_type" : "zip",
    "build_hash" : "0c48c0e",
    "build_date" : "2019-08-29T19:05:24.312154Z",
    "build_snapshot" : false,
    "lucene_version" : "7.7.0",
    "minimum_wire_compatibility_version" : "5.6.0",
    "minimum_index_compatibility_version" : "5.0.0"
  },
  "tagline" : "You Know, for Search"
}

最終,我們使用jps 可以看到我們剛纔啓動的進程,如下圖:
在這裏插入圖片描述

經過上述步驟,我們

  • 編譯好了janusgraph-0.5.2的源代碼
  • 在本地安裝了hbase、es的環境並啓動

二. 配置文件修改和添加對應的依賴

1. 修改對應的配置文件

上述代碼使用的是hbase 和 es作爲底層存儲和索引後端的, 這裏我們找到對應的源碼中janusgraph-dist模塊下的\src\assembly\cfilter\conf\janusgraph-hbase-es.properties下的這個文件:

ps: 這裏我用的是自己的絕對路徑,其實這個文件是在janusgraph-dist模塊下的一個文件,如下圖:
在這裏插入圖片描述

將下面的代碼註釋刪除掉,並刪除JANUSGRAPHCFG字段和對應的大括號,下面默認使用的是本地的hbase和es 如果你需要配置遠程的hbase和es注意修改對應的ip,修改後如下:

gremlin.graph=org.janusgraph.core.JanusGraphFactory
storage.backend=hbase
storage.hostname=127.0.0.1
cache.db-cache = true
cache.db-cache-clean-wait = 20
cache.db-cache-time = 180000
cache.db-cache-size = 0.5
index.search.backend=elasticsearch
index.search.hostname=127.0.0.1

2. 添加相應依賴

我們在janusgrap-test模塊編寫自己的單測並運行,因爲在janusgraph-test模塊中使用的是inmory也就是內存作爲存儲後端的,沒有對應的hbase和es依賴

而我們上述使用的是es 和 hbase所以添加了對應的依賴,根據你使用的在janusgraph-test模塊的pom文件下添加對應依賴即可

        <dependency>
            <groupId>org.janusgraph</groupId>
            <artifactId>janusgraph-hbase</artifactId>
            <version>${project.version}</version>
        </dependency>
        <dependency>
            <groupId>org.janusgraph</groupId>
            <artifactId>janusgraph-hbase-core</artifactId>
            <version>${project.version}</version>
        </dependency>
        <dependency>
            <groupId>org.janusgraph</groupId>
            <artifactId>janusgraph-hbase-10</artifactId>
            <version>${project.version}</version>
        </dependency>
        <dependency>
            <groupId>org.janusgraph</groupId>
            <artifactId>janusgraph-hbase-server</artifactId>
            <version>${project.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.hbase</groupId>
            <artifactId>hbase-client</artifactId>
            <version>2.1.5</version>
        </dependency>
        <dependency>
            <groupId>org.janusgraph</groupId>
            <artifactId>janusgraph-es</artifactId>
            <version>${project.version}</version>
        </dependency>

三:下載janusgraph源碼並編譯

1. 下載janusgraph的源碼到本地編譯器

方式一:

使用git的話,可以直接使用git clone從janusgraph的github倉庫來clone一份遠程代碼到本地

janusgraph 的 github地址: https://github.com/JanusGraph/janusgraph

git clone https://github.com/JanusGraph/janusgraph

方式二:

也可以直接下載源碼的zip包,本地解壓之後,用idea打開也可以

然後 git init 初始化爲git項目做版本控制,關聯到clone到自己的遠程倉庫即可

注意修改爲自己的maven倉庫

我的github中janusgraph對應的地址:https://github.com/YYDreamer/janusgraph,會將源碼分析過程中相關修改提交到該倉庫!

1.經過上述的步驟,我們在idea中便有了一個一個janusgraph源碼的項目,我們首先去除對應的maven插件

  • 將項目最外層pom.xml中的插件maven-enforcer-plugin部分註釋掉,不然會出現Failed to execute goal org.apache.maven.plugins:maven-enforcer-plugin:3.0.0-M2:enforce enforce-dependency-convergence) on project janusgraph-test: Some Enforcer rules have failed. Look above for specific messages explaining why the rule failed. 錯誤!
  • janusgraph-dist模塊中的pom.xml文件下的download-maven-plugin插件註釋掉,不然會出現org.apache.http.conn.HttpHostConnectException: Connect to artifacts.elastic.co:443 [artifacts.elastic.co/151.101.110.222] failed: Connectiontimed out: connect錯誤!

2.接下來,進行編譯,點擊idea下面的Terminal,輸入命令:
編譯項目全部模塊:

mvn clean install -DskipTests -Drat.skip=true

或者單獨編譯一個模塊,下面以janusgraph-test模塊示例:

mvn -pl janusgraph-test -am clean install -Dlicense.skip=true -DskipTests -P prod

這裏,我們使用全部編譯的語句,將項目全部編譯!

3.最後全部success即可! 過程可能有點慢,如果看到編譯過程在下載es等組件的話,可以先將下面講的環境搭建起來,再用上述語句進行編譯,成功圖如下:
在這裏插入圖片描述

錯誤解決:

  1. 打開項目後,可能會發現有的pom文件報錯,一是看看你的maven有沒有正確配置,二是可能是maven的本地倉庫索引沒有更新,可以參考博客:pom問題解決,超鏈接直接點擊即可

四. 編寫單測 並 運行

1. 編寫單測

janusgraph-test模塊下的test目錄下,新建一個’mytest’文件夾,編寫一個單元測試JanusGraphFirstTest,如下:

public class JanusGraphFirstTest {

    @Test
    public void firstTest() {
        // 創建圖實例,存儲使用hbase,索引使用es
        // TODO 注意!文件路徑修改爲自己當前電腦下的絕對路徑
        JanusGraph graph = JanusGraphFactory
            .open("D:\\code\\janusgraph-0.5.2\\janusgraph-dist\\src\\assembly\\cfilter\\conf\\janusgraph-hbase-es.properties");
        // 使用GraphOfTheGodsFactory加載“The Graph of the Gods”圖,這是JanusGraph用於測試自定義的一個圖
        GraphOfTheGodsFactory.load(graph);
        // 獲取圖遍歷對象實例
        GraphTraversalSource g = graph.traversal();

        // 獲取屬性"name"爲"saturn"的節點
        Vertex saturn = g.V().has("name", "saturn").next();

        // 獲取上述節點對應的所有屬性的kv
        GraphTraversal<Vertex, Map<Object, Object>> vertexMapGraphTraversal = g.V(saturn).valueMap();
        // 輸出
        List<Map<Object, Object>> saturnProMaps = vertexMapGraphTraversal.toList();
        for (Map<Object, Object> proMap : saturnProMaps) {
            proMap.forEach((key,value) -> System.out.println(key + ":" + value));
        }

        // 獲取上述節點的father的father的姓名,也就是grandfather的姓名
        GraphTraversal<Vertex, Object> values = g.V(saturn).in("father").in("father").values("name");
        String name = String.valueOf(values.next());
        System.out.println("grandfather name:" + name);


        // 獲取在(latitude:37.97 and long:23.72)50km內的所有節點
        GraphTraversal<Edge, Edge> place = g.E().has("place", geoWithin(Geoshape.circle(37.97, 23.72, 50)));
        // 獲取邊對應的節點
        GraphTraversal<Edge, Map<String, Object>> node = place.as("source")
            .inV().as("god2")
            .select("source")
            .outV().as("god1")
            .select("god1", "god2").by("name");
        // 輸出
        List<Map<String, Object>> maps = node.toList();
        for (Map<String, Object> map : maps) {
            map.forEach((key,value) -> System.out.println(key + ":" + value));
        }
    }
}

注意!!!!!! 在上述新添加的JanusGraphFirstTest文件中最上面添加下面的註釋,不然會因爲不符合開源規則編譯會報錯!

並且! 我們在源碼分析過程中,添加了任何的文件或者修改了原有的文件,下面的註釋都是必須要加在文件最上面並且不可以刪除!!

// Copyright 2020 JanusGraph Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//      http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

運行上述單測,前提保證hadoop、hbase、es都在啓動狀態!

2. 運行成功後

首先,cmd進入hbase的bin目錄下,運行hbase shell命令,進入到hbase 的 shell界面:

2.1 輸入list命令,如下,可以發現存在一個叫做janusgraph的表,這就是我們剛纔運行的單測生成的一個默認table,用來存儲對應的圖數據

hbase(main):005:0> list
TABLE
janusgraph
1 row(s)
Took 0.0070 seconds
=> ["janusgraph"]
hbase(main):006:0>

2.2 輸入desc 'janusgraph' 命令,如下,查看對應的table schema,我們可以看到表狀態爲ENABLE可用狀態,並且下面跟着好大一坨列簇和列的信息

其中的列簇e\f\g\h\i\l\m\s\t都存了對應的圖信息,具體存了圖的什麼信息,我們下面的博文會分享,這裏不做描述了

hbase(main):012:0* desc 'janusgraph'
Table janusgraph is ENABLED
janusgraph
COLUMN FAMILIES DESCRIPTION
{NAME => 'e', VERSIONS => '1', EVICT_BLOCKS_ON_CLOSE => 'false', NEW_VERSION_BEH
AVIOR => 'false', KEEP_DELETED_CELLS => 'FALSE', CACHE_DATA_ON_WRITE => 'false',
 DATA_BLOCK_ENCODING => 'NONE', TTL => 'FOREVER', MIN_VERSIONS => '0', REPLICATI
ON_SCOPE => '0', BLOOMFILTER => 'ROW', CACHE_INDEX_ON_WRITE => 'false', IN_MEMOR
Y => 'false', CACHE_BLOOMS_ON_WRITE => 'false', PREFETCH_BLOCKS_ON_OPEN => 'fals
e', COMPRESSION => 'GZ', BLOCKCACHE => 'true', BLOCKSIZE => '65536'}
# 省略了一部分...

注意:

單測中包含GraphOfTheGodsFactory.load(graph)代碼,是將janusgraph自帶的一個測試圖導入到hbase中,供我們測試使用,首次運行單測成功後,我們要把這個語句GraphOfTheGodsFactory.load(graph)註釋掉,不需要重新load這個測試圖!

五. 底層存儲使用berkeleyje數據庫和es索引後端

我們只需要將上述單測代碼中的配置文件路徑配置文件修改爲相同位置下的janusgraph-berkeleyje-es.properties即可,將對應配置的註釋去掉!

然後,將對應的依賴放到janusgraph-test對應的pom文件中:

       <dependency>
            <groupId>org.janusgraph</groupId>
            <artifactId>janusgraph-es</artifactId>
            <version>${project.version}</version>
        </dependency>
        <dependency>
            <groupId>org.janusgraph</groupId>
            <artifactId>janusgraph-berkeleyje</artifactId>
            <version>${project.version}</version>
        </dependency>

運行即可!

本文所有的 janusgraph源碼項目文件 + hadoop安裝包 + hadoop在windows的輔助安裝包 + hbase安裝包 + es安裝包全部整合放到了公衆號“匠心Java”中,微信搜索“匠心Java”,回覆“圖庫資源”四個字即可,也可通過微信公衆號聯繫博主,一同探討!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章