一、写在前面
工作需要,最近开始接触一点知识图谱的东西,从0开始,老大确定了要使用的图计算框架,其余的,全都靠自己,由于毫无经验所言, 图谱的概念对我来说是新的,JanusGraph这个框架是新的,它所基于的TinkerPop没听过,拿来写入数据的语言java基本上也算是新的了(虽然几年前在学校用过),部署可视化界面要使用的nginx也是新的,这些东西搅到一起,足足搞了10天才理出点头绪来,记录一下,给有相同需要的小伙伴点参考。
二、JanusGraph+HBase+ElasticSearch的环境搭建
一开始找到了好教程,但由于自己知识储备不足,不知道好教程是好教程,附上原文
参考的安装教程
我这里,由于是公司环境,Hbase和ES都是安装好的,不需要自己再装什么,下面记录一下我在安装的过程中踩了哪些坑
1.JanusGraph组件安装
(1)官方下载地址 github下载
坑:版本
在安装之前,我有想过这个问题,查了一下服务器上Hbase和ES的版本
- hbase 版本查询:在服务器上使用 hbase shell 命令打开 hbase 客户端,信息的最后一行即可看到:
Version 1.2.0-cdh5.16.1
- ES 版本查询:在服务器上执行
curl -XGET ip:port
(把ip和port改成你ES服务器的ip和端口号),返回信息中即可看到:{"version":{"number" : "5.5.1"}}
接着,去JanusGraph下载页面查每一个版本的JanusGraph所支持的组件版本,在每一个版本的“Tested Compatibility”里,新版本的JanusGraph支持的其他组件的版本都比较高,一定要使用支持自己组件版本的JanusGraph。一开始,我发现最新的几个版本都不支持我的Hbase和ES,得用很久之前的版本,心里比较反感,谁还不想用新的呢,想着,那么老的版本,都没多少人用了,都不更新了的,就全然不当回事,心存侥幸心理下载了最新版,后面被事实啪啪打脸,我慢慢降低版本,重新配置,脸肿了之后才学乖去找支持我组件的版本,最终找到了 0.2.3 版本,这才发现,人家最近才更新完
(2)解压
unzip janusgraph-0.2.3-hadoop2.zip
mv janusgraph-0.2.3-hadoop2 janusgraph
(3)配置环境变量
打开 ~/.bashrc 文件,在末尾追加
export JANUSGRAPH_HOME=你的janusgraph文件夹所在路径
export PATH=:$JANUSGRAPH_HOME/bin:$PATH
让环境变量生效source ~/.bashrc
2.配置JanusGraph Server
这一步的配置需要修改两个配置文件:janusgraph-hbase-es-server.properties
和 gremlin-hbase-es-server.yaml
文件放在 janusgraph/conf/gremlin-server/
下,如果没有,复制一份其他的配置文件再做修改即可
(1)janusgraph-hbase-es-server.properties
拷贝文件
cp janusgraph-cassandra-es-server.properties janusgraph-hbase-es-server.properties
修改配置信息
gremlin.graph=org.janusgraph.core.JanusGraphFactory
# 配置后端存储数据库
storage.backend=hbase
storage.hostname=node007164:2182,node007166:2182,node007167:2182 # 这里写你hbase的ip:port,如果是集群,可以像我这样写集群的zookeeper地址
storage.hbase.table=cpf_item_tag_graph # 这里写hbase里的表,事先库里有没有这个表都行,有的话他会直接用,没有的话,他会新建,如果事先建好了,无论你对那个表设置了神马,都会被清除掉,他会重新按自己的需要配置信息,别问我咋知道的,没被我们数仓小哥哥骂死已经是他脾气好了
# 下面中间的那个search你可以随便改名字,后面在设置schema建索引的时候保持一致即可,后面到那会再提一下
index.search.backend=elasticsearch
index.search.hostname=192.168.2.198:9201 # ES所在服务器的ip和端口,集群的话,写一个就行,我的就是集群
index.search.elasticsearch.health-request-timeout=120s # 这个是后面我查数据的时候报错信息提示ES超时之类的,查了一圈才查到这,莫得配置是30s,如果你跑数据的时候碰到类似问题,可以试一下
其余配置信息没有修改
(2)gremlin-hbase-es-server.yaml
拷贝文件
cp gremlin-server.yaml gremlin-hbase-es-server.yaml
这个文件比较好改
channelizer: org.apache.tinkerpop.gremlin.server.channel.WsAndHttpChannelizer # 改成同时支持websocket和http
graphs: {
graph: conf/gremlin-server/janusgraph-hbase-es-server.properties # 你自己的.properties文件路径
}
(3)启动JanusGraph Server
任意目录下执行gremlin-server.sh conf/gremlin-server/gremlin-hbase-es-server.yaml
三、向hbase中写入数据,并同步到ES中
好像有批量写入数据的工具,也许是我心不够静,还没研究明白,你们可以自己研究一下 janusgraph-utils
这里主要记录一下自己用Java往库里写数据的过程(不是不支持python,只是项目需要):
1.建项目
(1)请使用 maven 创建一个新项目
(2)修改源,不然速度太慢了,慢到想砸电脑
找到maven的settings.xml文件,目录:(command+,)IntelliJ IDEA -> Preferences -> 搜索框搜 maven -> 右边面板倒数第2行 User settings file后面就是你的路径,倒数第1行是存储jar包的仓库地址,记住这两个地址
修改:打开settings.xml文件,找到<mirrors>
标签,加入以下信息
<mirror>
<!--该镜像的唯一标识符。id用来区分不同的mirror元素。 -->
<id>nexus-aliyun</id>
<!--镜像名称 -->
<name>Nexus aliyun</name>
<!--该镜像的URL。构建系统会优先考虑使用该URL,而非使用默认的服务器URL。 -->
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<!--被镜像的服务器的id。例如,如果我们要设置了一个Maven中央仓库(http://repo1.maven.org/maven2)的镜像,就需要将该元素设置成central。这必须和中央仓库的id central完全一致。-->
<mirrorOf>central</mirrorOf>
</mirror>
找到<localRepository>
标签,确定仓库目录是正确的
这样加载pom.xml依赖的时候就快很多了
(3)pom.xml文件:
依赖项如下,挑你需要的即可
<dependencies>
<dependency>
<groupId>org.janusgraph</groupId>
<artifactId>janusgraph-hbase</artifactId>
<version>0.2.3</version>
</dependency>
<dependency>
<groupId>org.janusgraph</groupId>
<artifactId>janusgraph-core</artifactId>
<version>0.2.3</version>
</dependency>
<dependency>
<groupId>org.apache.tinkerpop</groupId>
<artifactId>gremlin-driver</artifactId>
<version>3.4.1</version>
</dependency>
<dependency>
<groupId>org.janusgraph</groupId>
<artifactId>janusgraph-all</artifactId>
<version>0.2.3</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId