[HugeGraph] CentOS上基于MySQL的HugeGraph部署
2020年12月更新
官方发布了新版server,原可视化studio升级为hubble,支持0.10以上的server,原来的studio只支持0.10以下的server
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
HugeGraph是一款易用、高效、通用的开源图数据库系统(Graph Database),实现了Apache TinkerPop3框架及完全兼容Gremlin查询语言,具备完善的工具链组件,助力用户轻松构建基于图数据库之上的应用和产品。HugeGraph支持百亿以上的顶点和边快速导入,并提供毫秒级的关联关系查询能力(OLTP),并可与Hadoop、Spark等大数据平台集成以进行离线分析(OLAP)。
HugeGraph典型应用场景包括深度关系探索、关联分析、路径搜索、特征抽取、数据聚类、社区检测、 知识图谱等,适用业务领域有如网络安全、电信诈骗、金融风控、广告推荐、社交网络和智能机器人等。
本系统的主要应用场景是解决百度安全事业部所面对的反欺诈、威胁情报、黑产打击等业务的图数据存储和建模分析需求,在此基础上逐步扩展及支持了更多的通用图应用。
虽然网上的HugeGraph文案把它吹得天花乱坠,且还能查到一些评测显示其吊打JanusGraph,但网上除了官方文档以外,能查到的文档实在有限。在实际安装部署的过程中,遇到的问题也不少,好在GitHub项目里(仿佛是)开发人员还是比较活跃的,一些问题可以在GitHub里找到解答。
另附一篇看起来比较客观的文章:「JanusGraph与HugeGraph」图形数据库-技术选型-功能对比
下载
components | description | download |
---|---|---|
HugeGraph-Server | HugeGraph的主程序 | 0.10.4 |
HugeGraph-Studio | 基于Web的图形化展示工具 | 0.10.0 |
依赖
安装 JDK-1.8
HugeGraph-Server
基于 jdk-1.8 开发,代码用到了较多jdk-1.8中的类和方法,请用户自行安装配置。
在往下阅读之前务必执行java -version
命令查看jdk版本
java -version
这里亲测OpenJDK 11是不能运行HugeGraph的。
安装GCC-4.3.0或更新版本(可选)
如果使用的是RocksDB
后端,请务必执行gcc --version
命令查看gcc版本;若使用其他后端,则不需要。
gcc --version
安装 HugeGraph-Server
有三种方式可以部署HugeGraph-Server组件:
方式1:一键部署(慢的要死)- 方式2:下载tar包
- 方式3:源码编译
其中源码编译的方法一开始觉得太麻烦了,没有试,但最后发现目前的发版(0.10.4)有bug呢,如果直接从源码编译则没有问题,具体操作可以查看官方文档。
解压缩
tar -zxvf hugegraph-${version}.tar.gz
使用内存快速启动
-
修改配置文件
vim hugegraph-${version}/conf/hugegraph.properties
Memory后端的数据是保存在内存中无法持久化的,不需要初始化后端,这也是唯一一个不需要初始化的后端。
backend=memory serializer=text
-
修改rest-server配置文件
vim hugegraph-${version}/conf/rest-server.properties
如果需要使用
RESTful API
进行访问,则需要将url修改为本机IP# bind url restserver.url=http://172.20.xxx.xxx:8080
-
启动 server
hugegraph-${version}/bin/start-hugegraph.sh Starting HugeGraphServer... Connecting to HugeGraphServer (http://127.0.0.1:8080/graphs)....OK
提示的 url 与
rest-server.properties
中配置的restserver.url
一致
停止Server
hugegraph-${version}/bin/stop-hugegraph.sh
no crontab for xxxx
The HugeGraphServer monitor has been closed
Killing HugeGraphServer(pid 36883)...OK
安装 HugeGraph-Studio
下载完成后解压缩:
tar zxvf hugegraph-studio-${version}.tar.gz
启动HugeGraph-Studio
修改配置文件:
vim hugegraph-studio-${version}/conf/hugegraph-studio.properties
以下为官网配置说明:
- 将配置项
studio.server.host
的值localhost
修改成机器名或 IP,这是 HugeGraph Studio 对外提供服务的host
,如果只需要本地访问则保持不变即可; - 将配置项
studio.server.port
的值8088
修改成想要的端口,这是 HugeGraph Studio 对外提供服务的port
,如果则保持不变即可; - 将配置项
graph.server.host
的值localhost
修改成 HugeGraph Server 的host
,HugeGraph Studio 通过此项和graph.server.port
与 HugeGraph Server 建立连接; - 将配置项
graph.server.port
的值8080
修改成 HugeGraph Server 的port
,HugeGraph Studio 通过graph.server.host
和此项与 HugeGraph Server 建立连接; - 将配置项
graph.name
的值hugegraph
修改成要连接的 HugeGraph Server 的图名,目前只允许连接一个图。
修改完上述配置后,即可启动 HugeGraph Studio(ctrl C结束)
hugegraph-studio-${version}/bin/hugegraph-studio.sh
建立演示图
graph.schema().propertyKey("name").asText().ifNotExist().create()
graph.schema().propertyKey("age").asInt().ifNotExist().create()
graph.schema().propertyKey("city").asText().ifNotExist().create()
graph.schema().propertyKey("lang").asText().ifNotExist().create()
graph.schema().propertyKey("date").asText().ifNotExist().create()
graph.schema().propertyKey("price").asInt().ifNotExist().create()
person = graph.schema().vertexLabel("person").properties("name", "age", "city").primaryKeys("name").ifNotExist().create()
software = graph.schema().vertexLabel("software").properties("name", "lang", "price").primaryKeys("name").ifNotExist().create()
knows = graph.schema().edgeLabel("knows").sourceLabel("person").targetLabel("person").properties("date").ifNotExist().create()
created = graph.schema().edgeLabel("created").sourceLabel("person").targetLabel("software").properties("date", "city").ifNotExist().create()
marko = graph.addVertex(T.label, "person", "name", "marko", "age", 29, "city", "Beijing")
vadas = graph.addVertex(T.label, "person", "name", "vadas", "age", 27, "city", "Hongkong")
marko.addEdge("knows", vadas, "date", "20160110")
marko = graph.addVertex(T.label, "person", "name", "marko", "age", 29, "city", "Beijing")
vadas = graph.addVertex(T.label, "person", "name", "vadas", "age", 27, "city", "Hongkong")
lop = graph.addVertex(T.label, "software", "name", "lop", "lang", "java", "price", 328)
josh = graph.addVertex(T.label, "person", "name", "josh", "age", 32, "city", "Beijing")
ripple = graph.addVertex(T.label, "software", "name", "ripple", "lang", "java", "price", 199)
peter = graph.addVertex(T.label, "person","name", "peter", "age", 29, "city", "Shanghai")
marko.addEdge("knows", vadas, "date", "20160110")
marko.addEdge("knows", josh, "date", "20130220")
marko.addEdge("created", lop, "date", "20171210", "city", "Shanghai")
josh.addEdge("created", ripple, "date", "20151010", "city", "Beijing")
josh.addEdge("created", lop, "date", "20171210", "city", "Beijing")
peter.addEdge("created", lop, "date", "20171210", "city", "Beijing")
g.V()
清除
g.V().drop()
连接MySQL数据库
-
在MySQL中建表
mysql -u root -p
输入密码,之后创建数据库
mysql> CREATE DATABASE IF NOT EXISTS `hugegraph`; Query OK, 1 row affected (0.01 sec) mysql> show databases; +--------------------+ | Database | +--------------------+ | cube | | hugegraph | | information_schema | | mysql | | performance_schema | | sys | +--------------------+ 6 rows in set (0.00 sec) mysql> exit; Bye
-
修改配置文件
vim hugegraph-${version}/conf/hugegraph.properties
- 原文件中自带的
jdbc.sslmode
写错了,应该包含下划线 - 需要注释掉
# cassandra backend config
下面未注释的内容
backend=mysql serializer=mysql # mysql backend config jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://127.0.0.1:3306 jdbc.username=root jdbc.password=123456 jdbc.reconnect_max_times=3 jdbc.reconnect_interval=3 jdbc.ssl_mode=false
- 原文件中自带的
-
初始化数据库(仅第一次启动时需要),0.10.4版本有bug,解决方案参考错误处理第一条
hugegraph-${version}/bin/init-store.sh ... ... 2020-11-17 09:51:51 2770 [main] [INFO ] com.baidu.hugegraph.HugeGraph [] - Graph 'hugegraph' has been initialized 2020-11-17 09:51:51 2771 [main] [INFO ] com.baidu.hugegraph.HugeGraph [] - Close graph hugegraph[hugegraph] 2020-11-17 09:51:51 2788 [Thread-1] [INFO ] com.baidu.hugegraph.HugeGraph [] - HugeGraph is shutting down
-
启动数据库和可视化
hugegraph-${version}/bin/start-hugegraph.sh Starting HugeGraphServer... Connecting to HugeGraphServer (http://127.0.0.1:8080/graphs)....OK hugegraph-studio-${version}/bin/hugegraph-studio.sh ... ... 10:20:00.867 [main] INFO com.baidu.hugegraph.studio.HugeGraphStudio ID: TS: - HugeGraphStudio is now running on: http://localhost:8088
错误处理
-
运行
init-store.sh
进行数据库初始化报错SSL链接安全问题WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explic itly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate erification.
遇到错误以后查到了文章hugegraph使用mysql做数据库服务,部署记录,该作者使用了下载GitHub源码自行编译的方法解决了这个问题。
看到文章中提到的GitLab以及截图(我觉得他打错了,应该是GitHub,因为我找到了原链接),于是按照图中方法修改了
init-store.sh
,成功运行vim hugegraph-${version}/bin/init-store.sh
修改
bin/init-store.sh
中第33行exec $JAVA -cp $LIB/hugegraph-dist-*.jar -Djava.ext.dirs=$LIB:$PLUGINS:$JAVA_HOME/jre/lib/ext \ com.baidu.hugegraph.cmd.InitStore $CONF/gremlin-server.yaml | grep "com.baidu.hugegraph"
确认已设置
JAVA_HOME
环境变量echo $JAVA_HOME
(如果没有显示jdk路径)要基于每个用户设置
JAVA_HOME
变量,请将其添加到~/.bashrc
或用户登录时加载的任何其他配置文件中对于系统范围的设置,请使用
/etc/profile.d
中的文件。-
Oracle JDK
# vim /etc/profile.d/java.sh export JAVA_HOME=/usr/java/jdk1.8.0_202-amd64 export PATH=$JAVA_HOME/bin:$PATH export CLASSPATH=.:$JAVA_HOME/jre/lib/ext:$JAVA_HOME/lib/tools.jar # source /etc/profile.d/java.sh
-
Open JDK
# vim /etc/profile.d/java.sh export JAVA_HOME=/usr/java/latest export PATH=$JAVA_HOME/bin:$PATH export CLASSPATH=$JAVA_HOME/lib # source /etc/profile.d/java.sh
-
-
端口不一致导致studio报错
Failed to connect HugeGraphServer.com.baidu.hugeGraph.rest.ClientException:Failed to do request
这是因为
hugegraph-studio-${version}/conf/hugegraph-studio.properties不能填对应HugeGraph Server
配置文件里graph.server.host
需要与HugeGraph Server
的IP一致,例如其所在虚拟机IP,这样才能正常运行。