如何进行SequoiaDB + JanusGraph的实践,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。
JanusGraph
实际上,在图数据领域里,Neo4j 才是真正处于统治地位的,但是无奈它的社区版本,性能“限(yan)制(ge)”得太过分了,功能也是各种被砍,难以使用在生产环境里。至于企业版,目前也没有专门的预算给到这块的需求。
而看看图数据库里的老二 -- JanusGraph ,Apache 基金会顶级项目,顶着当年明星项目 Titan 的光环,继续忍辱负重地前行。“这个孩子肯定有出息”,我就是这么想的。
如果大家好奇 JanusGraph 的前世今生,可以扒一扒 DataStax(Cassandra 母公司)对 Titan 干了啥。然后一群热爱开源,又相当牛叉的程序猿就独立单干了。反正这个故事听起来,和当年 MySQL 和 MariaDB 相爱相杀的故事差不多,只是 JanusGraph 的下场更加壮烈。
我从 JanusGraph 的官网里找了一个整体的架构图,大家可以看到 JanusGraph 的模块还是挺丰富的,功能也是比较的全面。
因为这种计算和存储分离的架构,使得应用的开发者,完全不需要关注底层的数据分布式实现,只要专心做好自己的应用逻辑就好了。
当然,如果你是一名 DBA,那样你还是要学习如何配置 SequoiaDB 底层的分布式存储的。
前面也讲到了,由于 JanusGraph 对底层存储的设计和接口,都是根据列存储来设计的,所以在为 SequoiaDB for JanusGraph 设计时,就需要做出一些调整。
首先是列簇里的 family 设计,我把它拆开来了,将不同的 family 直接对应成 SequoiaDB 的一个 Collection。
最开始时候,我是希望将一条记录的所有列都保存到 SequoiaDB 一个 BSON 里面,但是写到后面,由于 JanusGraph 会依赖 HBase 的列排序功能返回记录,所以这个在 SequoiaDB 里面无法对一条记录的不同列进行排序。所以在最后, JanusGraph 中的一条记录被我拆分成多个 BSON 记录,形式变成了以下的形式。记录以 RowKey 来维护其一条记录的完整性。
{RowKey:"", Key:"", Value:""}{RowKey:"", Key:"", Value:""}{RowKey:"", Key:"", Value:""}{RowKey:"", Key:"", Value:""}
在 BSON 中,RowKey、Key和Value 三个字段的数据类型都是 Binary 格式,这个也是 JanusGraph 自己所独有的解析方法。JanusGraph 保存于 SequoiaDB 中的记录如下面的例子:
{ "_id": { "$oid": "5e410c444f025855e5552b4c" }, "Key": { "$binary": "///////+x38ABZ40DXrgsGMwYTgxZmZiMTc2ODYtY2hlbjE=", "$type": "0" }, "RowKey": { "$binary": "AAAAAAAAAAM=", "$type": "0" }, "Value": { "$binary": "", "$type": "0" }}
02
JanusGraph 代码改造
BDB_JE("org.janusgraph.diskstorage.berkeleyje.BerkeleyJEStoreManager", "berkeleyje"),CASSANDRA_THRIFT("org.janusgraph.diskstorage.cassandra.thrift.CassandraThriftStoreManager", "cassandrathrift"),CASSANDRA_ASTYANAX("org.janusgraph.diskstorage.cassandra.astyanax.AstyanaxStoreManager", ImmutableList.of("cassandra", "astyanax")),CASSANDRA_EMBEDDED("org.janusgraph.diskstorage.cassandra.embedded.CassandraEmbeddedStoreManager", "embeddedcassandra"),CQL("org.janusgraph.diskstorage.cql.CQLStoreManager", "cql"),HBASE("org.janusgraph.diskstorage.hbase.HBaseStoreManager", "hbase"),IN_MEMORY("org.janusgraph.diskstorage.keycolumnvalue.inmemory.InMemoryStoreManager", "inmemory"),SEQUOIADB("org.janusgraph.diskstorage.sequoiadb.SequoiadbStoreManager", "sequoiadb");
StandardStoreManager 类是属于 janusgraph-cord 的模块,所以后续编译后,应该将最新的 janusgraph-core jar 包替换旧的 jar 包。
然后大家只要从 github 上下载 SequoiaDB for JanusGraph 的项目,将其放到 JanusGraph 源码的根目录,修改 maven 的pom.xml 编译脚本,增加 SequoiaDB 的驱动版本说明和添加编译 SequoiaDB for JanusGraph 的项目编译。
<titan.compatible-versions>1.0.0,1.1.0-SNAPSHOT</titan.compatible-versions> … <httpcomponents.version>4.4.1</httpcomponents.version> <hadoop2.version>2.7.7</hadoop2.version> <hbase1.version>1.4.10</hbase1.version> <hbase2.version>2.1.5</hbase2.version> <hbase.server.version>1.4.10</hbase.server.version> <sequoiadb.version>3.2.1</sequoiadb.version> ... <modules> … <module>janusgraph-doc</module> <module>janusgraph-solr</module> <module>janusgraph-examples</module> <module>janusgraph-sequoiadb</module> </modules>
对 JanusGraph 重新编译:
最后将编译好的 janusgraph-sequoiadb-0.4.0.jar 和 SequoiaDB 的 API 驱动 jar 包保存至 ${JANUSGRAPH_BINARY_HOME}/lib 目录中,就完成了 JanusGraph 扩展 SequoiaDB 存储的操作了。
03
JanusGraph 配置 SequoiaDB 作为存储
大家将 janusgraph-sequoiadb 的模块编译出来的 jar 包和 SequoiaDB 的 JSON API jar 包一起放到 JunasGraph 的 lib 目录里,同时更新 janusgraph-core 的 jar 包后,就完成了 JanusGraph 扩展 SequoiaDB 存储的操作了。
为了让 JanusGraph 能够认识 SequoiaDB 的连接信息,大家还需要准备一个 config 文件。大家在 JunasGraph 的conf 目录里增加一个 janusgraph-sequoiadb.properties的文件,内容大致如下:
gremlin.graph=org.janusgraph.core.JanusGraphFactorystorage.backend=sequoiadbstorage.hostname=10.211.55.7storage.port=11810#storage.username=sdbadmin#storage.password=sdbadminstorage.meta.visibility = truecache.db-cache = falsecache.db-cache-clean-wait = 20cache.db-cache-time = 180000cache.db-cache-size = 0.5
我给大家介绍几个重要的参数
storage.hostname,SequoiaDB coord 节点的 IP 地址,或者是 hostname
storage.port,SequoiaDB coord 节点的端口号
storage.username,如果 SequoiaDB 配置了鉴权,那样就需要配置鉴权的用户名
storage.password,如果 SequoiaDB 配置了鉴权,那样就需要配置鉴权的密码
当我们已经将 SequoiaDB 的配置信息写到了 config 文件里面了,那么 JanusGraph 对接 SequoiaDB 也是顺利成章的事情。
大家可以直接打开 Gremlin 控制界面,然后就像平时使用 JanusGraph 那样操作即可。
这里,我给大家准备了一下小 demo。
graph = JanusGraphFactory.open('conf/janusgraph-sequoiadb.properties');graph.addVertex("name", "aaa", "num", 123)g = graph.traversal()g.V().values('name')
关于如何进行SequoiaDB + JanusGraph的实践问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注亿速云行业资讯频道了解更多相关知识。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。