源碼分析 的第一步就是要先編譯好源代碼,才能進行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.jar
和htrace-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等組件的話,可以先將下面講的環境搭建起來,再用上述語句進行編譯,成功圖如下:
錯誤解決:
- 打開項目後,可能會發現有的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
”,回覆“圖庫資源
”四個字即可,也可通過微信公衆號聯繫博主,一同探討!