TinkerPop’s Hadoop-Gremlin
JanusGraph with TinkerPop’s Hadoop-Gremlin

  • 利用Hadoop-Gremlin批量导入json数据到JanusGraph中,并且比较IncrementalBulkLoader和OneTimeBulkLoader的不同。

版本配置

  • 存储后端:hbase(本地)。索引后端:无。
  • n-0.2.0-hadoop2版本

前期准备

Schema定义

  • Schema定义写在文件test-janusgraph-schema.groovy中
def defineGratefulDeadSchema(janusGraph) {m = janusGraph.openManagement()//人信息节点labelperson = m.makeVertexLabel("person").make()//properties//使用IncrementBulkLoader导入时,去掉下面注释//blid  = m.makePropertyKey("bulkLoader.vertex.id").dataType(Long.class).make()birth = m.makePropertyKey("birth").dataType(Date.class).make()age = m.makePropertyKey("age").dataType(Integer.class).make()name = m.makePropertyKey("name").dataType(String.class).make()//indexindex = m.buildIndex("nameCompositeIndex", Vertex.class).addKey(name).unique().buildCompositeIndex()//使用IncrementBulkLoader导入时,去掉下面注释//bidIndex = m.buildIndex("byBulkLoaderVertexId", Vertex.class).addKey(blid).indexOnly(person).buildCompositeIndex()m.commit()
}

满足Schema格式的json文件

  • 我的json文件怎么来的?将graph导出成json文件。
  • 数据存放在test-modern.json中
{"id":4136,"label":"person","properties":{"name":[{"id":"16t-36w-5j9","value":"lisi"}],"birth":[{"id":"1z9-36w-3yd","value":1509443638951}],"age":[{"id":"101-26w-5qt","value":4136}]}}
{"id":4702,"label":"person","properties":{"name":[{"id":"171-38o-5j9","value":"fu1 "}],"birth":[{"id":"1zh-38o-3yd","value":1509043638952}],"age":[{"id":"1l9-38o-4qt","value":1}]}}
{"id":4700,"label":"person","properties":{"name":[{"id":"171-38o-5j9","value":"fu2 "}],"birth":[{"id":"1zh-38o-3yd","value":1509043638976}],"age":[{"id":"1l9-38o-4qt","value":1}]}}

目标图的配置

  • 下面只列了定制的配置,默认配置没显示。
  • 配置信息在janusgraph-test.properties文件中
storage.backend=hbase
schema.default = none
# true:在批量导入或api添加时,会进行一致性校验,否则不会进行
# 本例子中的一致性:在name属性上建立了唯一索引,所以name不允许有重复值。
storage.batch-loading=true

HadoopGraph图的配置

  • 保存在hadoop-graphson.properties文件中
  • 其中inputLocation指定了需要导入的json文件路径。(相对于janusgraph-0.2.0-hadoop2的路径)
gremlin.graph=org.apache.tinkerpop.gremlin.hadoop.structure.HadoopGraph
gremlin.hadoop.graphInputFormat=org.apache.tinkerpop.gremlin.hadoop.structure.io.graphson.GraphSONInputFormat
gremlin.hadoop.graphOutputFormat=org.apache.hadoop.mapreduce.lib.output.NullOutputFormat
gremlin.hadoop.inputLocation=./data/zl/test-modern.json
gremlin.hadoop.outputLocation=output
gremlin.hadoop.jarsInDistributedCache=true#####################################
# GiraphGraphComputer Configuration #
#####################################
giraph.minWorkers=2
giraph.maxWorkers=2
giraph.useOutOfCoreGraph=true
giraph.useOutOfCoreMessages=true
mapred.map.child.java.opts=-Xmx1024m
mapred.reduce.child.java.opts=-Xmx1024m
giraph.numInputThreads=4
giraph.numComputeThreads=4
giraph.maxMessagesInMemory=100000####################################
# SparkGraphComputer Configuration #
####################################
spark.master=local[*]
spark.executor.memory=1g
spark.serializer=org.apache.spark.serializer.KryoSerializer

文件位置

  • 我将上述文件都放在了D:\soft\janusgraph-0.2.0-hadoop2\data\zl目录下,即janusgraph安装目录的自己创建的一个zl文件夹。

    image.png

开始批量导入

  • 先启动hbase。
  • 以下操作都是在D:\soft\janusgraph-0.2.0-hadoop2目录下进行。
  • 我使用的是Git Bash命令终端。

使用OneTimeBulkLoader批量导入

  • 1.打开gremlin
./bin/gremlin.bat
  • 2.创建shcema,可以将下面整个粘贴到命令行中。会等待一些时间,执行完成后,在hbase中会看到多了janusgraph表,并且查询到里面有了数据(是配置以及schema数据)
:load data/zl/test-janusgraph-schema.groovy
graph = JanusGraphFactory.open('data/zl/janusgraph-test.properties')
defineGratefulDeadSchema(graph)
  • 3.使用OneTimeBulkLoader批量导入,导入完成后hbase中又会多出3行数据(json文件中数据已经被到入成功了)
graph = GraphFactory.open('data/zl/hadoop-graphson.properties')
blvp = BulkLoaderVertexProgram.build().bulkLoader(OneTimeBulkLoader).writeGraph('data/zl/janusgraph-test.properties').create(graph)
graph.compute(SparkGraphComputer).program(blvp).submit().get()
  • 4.查看导入的节点数据
graph = JanusGraphFactory.open('data/zl/janusgraph-test.properties')
g = graph.traversal()
g.V().valueMap()

查到的数据类似下面结构

==>[name:[lisi],birth:[Tue Oct 31 17:53:58 CST 2017],age:[10000]]
==>[name:[zhouliang],birth:[Tue Oct 31 17:53:58 CST 2017],age:[10000]]
  • 5.重复执行第4步,都会导入成功,你会发现最后数据重复了。
  • 6.此时修改janusgraph-test.properties中的storage.batch-loading=false,再次执行第4步,就会报错,提示有唯一性约束冲突,类似下面提示信息
org.janusgraph.core.SchemaViolationException: Adding this property for key [name] and value [lisi] violates a uniqueness constraint [nameCompositeIndex]

使用IncrementBulkLoader批量导入

  • 首先停掉gremlin console
  • 删除hbase中的janusgraph表
  • 将test-janusgraph-schema.groovy文件中的注释代码去掉。
  • 在janusgraph-test.properties设置storage.batch-loading=true。
  • 然后以下操作都是在D:\soft\janusgraph-0.2.0-hadoop2目录下进行。
  • 我使用的是Git Bash命令终端。
  • 1.打开gremlin
./bin/gremlin.bat
  • 2.创建shcema,可以将下面整个粘贴到命令行中。会等待一些时间,执行完成后,在hbase中会看到多了janusgraph表,并且查询到里面有了数据(是配置以及schema数据),因为schema多了两行代码,所以数据也会多几行。
:load data/zl/test-janusgraph-schema.groovy
graph = JanusGraphFactory.open('data/zl/janusgraph-test.properties')
defineGratefulDeadSchema(graph)
  • 3.使用IncrementBulkLoader批量导入,导入完成后hbase中又会多出3行数据(json文件中数据已经被到入成功了)
graph = GraphFactory.open('data/zl/hadoop-graphson.properties')
blvp = BulkLoaderVertexProgram.build().writeGraph('data/zl/janusgraph-test.properties').create(graph)
graph.compute(SparkGraphComputer).program(blvp).submit().get()
  • 4.查看导入的节点数据
graph = JanusGraphFactory.open('data/zl/janusgraph-test.properties')
g = graph.traversal()
g.V().valueMap()
  • 查到的数据类似下面结构,注意,有bulkLoader.vertex.id属性,且其值为json文件中顶点的id值。
==>[name:[fu1],birth:[Tue Oct 31 17:53:58 CST 2017],bulkLoader.vertex.id:[4702],age:[10000]]
==>[name:[lisi],birth:[Tue Oct 31 17:53:58 CST 2017],bulkLoader.vertex.id:[4136],age:[10000]]
  • 如果在schema中没定义bulkLoader.vertex.id属性就会报错,类似如下:
Undefined type used in query: bulkLoader.vertex.id
  • 如果没有定义byBulkLoaderVertexId索引会有警告提示,类似如下:
16:35:41 WARN  org.janusgraph.graphdb.transaction.StandardJanusGraphTx  - Query requires iterating over all vertices [(~label = person AND bulkLoader.vertex.id = 4136)]. For better performance, use indexes
  • 5.重复执行第4步,都会导入成功,你会发现最后数据没有多,还是原来数据。

  • 6.修改test-modern.json文件中顶点属性值,或修改顶点id值,然后在执行第4步,会发现json中id变的顶点会再次添加成功;id没变的顶点,但是其属性值变了,最后到图中对应的顶点的属性值也变化了。(其中如果json添加了新的属性,图中也会添加新的属性,但是json中属性变少了,图中的对应属性还在)。

  • 7.修改json文件,将某两个顶点的id设置成相同的,在执行第4步,会报错,类似如下:

16:18:04 WARN  org.apache.spark.scheduler.TaskSetManager  - Lost task 0.0 in stage 5.0 (TID 3, localhost): java.lang.IllegalStateException: The property does not exist as the key has no associated value for the provided element: v[4136]:bulkLoader.vertex.idat org.apache.tinkerpop.gremlin.structure.Property$Exceptions.propertyDoesNotExist(Property.java:155)
  • 8.此时修改janusgraph-test.properties中的storage.batch-loading=false,再次执行第4步,如果导入json数据的name和图中的已存在的name值有冲突就会报错,提示有唯一性约束冲突,类似下面提示信息。
org.janusgraph.core.SchemaViolationException: Adding this property for key [name] and value [lisi] violates a uniqueness constraint [nameCompositeIndex]

结论

  • storage.batch-loading设置为false,在批量导入和api添加节点时都会进行一致性校验;否则不会进行校验。
  • OneTimeBulkLoader:一次批量导入数据,不会保存源图(此案例是json)中的id,导入数据不会开启事务。
  • IncrementBulkLoader:增量导入数据,并且通过bulkLoader.vertex.id属性保存源图中的id值,对于id已导入过数据会执行更新操作。为此每导入一个顶点数据都会执行如下逻辑:获取要导入顶点的id值,查询图中是否有某个顶点的bulkLoader.vertex.id值等于id值的,如果等于,则使用要插入的值,更新该图中已存在的顶点属性;如果不存在,则直接添加。
    • 之所以在schema中添加下面代码,就是加快查询速度。
bidIndex = m.buildIndex("byBulkLoaderVertexId", Vertex.class).addKey(blid).indexOnly(person).buildCompositeIndex()

作者:zlcook
链接:https://www.jianshu.com/p/68117c2082a9
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

janusgraph基本使用相关推荐

  1. 需要监控JanusGraph的一些指标

    一.官方文档中说明开启metrics可以监控JanusGraph中的指标: 1.开始,提交和回滚的事务数 2.每种存储后端的尝试和失败的操作类型 3.每种存储后端操作类型的响应时间分布 实际操作后,在 ...

  2. 开启JanusGraph中的监控功能

    开启JanusGraph中的metrics功能进行监控: 1.在配置文件中指定配置项 # Copyright 2019 JanusGraph Authors # # Licensed under th ...

  3. 使用java连接JanusGraph进行操作,hbase报错信息为:Caused by: org.apache.hbase.thirdparty.io.netty.channel.AbstractCh

    背景是我用windows上的idea去连接已经配好的虚拟机操作JanusGraph 报错部分截图如下: 报错很奇怪显示的是127.0.0.1即本地的地址我明明连的是虚拟机的环境 部分代码截图如下: 然 ...

  4. JanusGraph报错:Unknown external index backend

    使用java连接JanusGraph进行创建图操作,报错地方是程序运行第50行代码其作用是生成混合索引,截图如下: 后在0.6版本官方文档发现有说明先贴一份截图: 具体说明如下: The exampl ...

  5. java 连接janusgraph_基于JanusGraph的大数据图数据库

    导读 知识图谱是近来很火的概念,很多领域都希望能用知识图谱解决一些问题.在零售领域其实也有使用知识图谱的场景,比如阿里使用知识图谱进行商品智能导购以及商品"巡检",而我想试验着把知 ...

  6. java对象底层原存储结构图解_图解图库JanusGraph系列-一文知晓“图数据“底层存储结构...

    大家好,我是洋仔,JanusGraph图解系列文章,实时更新~ 图数据库文章总目录: 转载文章请保留以下声明: 一:存储模式 留言或私信我,邀请你加入"图数据库交流"微信群! 1. ...

  7. JanusGraph 安装

    下载地址:https://github.com/JanusGraph/janusgraph/releases/ 版本:Version 0.3.2 (June 16, 2019) 安装 解压 janus ...

  8. JanusGraph(HugeGraph通用): 可视化 GraphEXP 插件安装

    JanusGraph: 可视化 Gephi 插件安装可参考:https://datamining.blog.csdn.net/article/details/103894994 下载地址:https: ...

  9. JanusGraph: 可视化 Gephi 插件安装

    下载地址 https://gephi.org/ 安装 下一步默认安装即可 打开安装插件 打开后发现提示无法连接,并且可用插件显示为0 (我更新过所以不为0) 点击"代理配置" 设置 ...

  10. janusgraph整合mysql_图解图库JanusGraph系列-一文知晓“图数据“底层存储结构

    527-7.jpg 大家好,我是洋仔,JanusGraph图解系列文章,实时更新~ 图数据库文章总目录: 版本:JanusGraph-0.5.2 转载文章请保留以下声明: 一:存储模式 留言或私信我, ...

最新文章

  1. linux 无响应_系统加固之Linux安全加固
  2. 非注解和注解的处理器映射器和适配器---SpringMVC学习笔记(三)
  3. 工作243:name报错
  4. 同学,要不要来挑战双11零点流量洪峰?
  5. svn中status为missing的文件的处理方式
  6. mybatis case when_MyBatis 几种通用的写法
  7. 计算机科技英语论文,计算机专业英语(第2版)——科技交流与科技论文写作
  8. qt 提升 全局包含_研讨引思想碰撞,学习促共同提升 | 粤渝两地幼教同行深度交流...
  9. 星环大数据 学习笔记(76) —— Kafka 运维常用命令
  10. maya中英文对照_Maya中英文对照
  11. 第二章 python自定义函数与类(一)
  12. 利用python爬虫技术模拟提交问卷星/问卷网表单
  13. JavaScript随机方块
  14. 猫耳FM导出音频转换为音频格式(m4a/mp3)
  15. @开发者,微软 CEO 萨提亚带领 60 位大咖的集结令,你敢接吗?
  16. 给定起止时间跨年计算周次(oracle函数)
  17. SLIC超像素分割的算法介绍和源码分析
  18. TestNG开源插件Arrow介绍
  19. 强一致性 弱一致性 最终一致性
  20. 硬盘保护卡破解--小哨兵篇 (转)

热门文章

  1. 软件测试面试题汇总(一)
  2. linux tomcat 开发js,tomcat9-windows-服务版JS文件乱码
  3. 【JavaScript-17】BOM-04 获取页面宽高、盒子宽高
  4. NC6 的单据类型枚举 类
  5. Linux搭建泰拉瑞亚(原版/模组/插件)服务器之(TShock)插件服务器1
  6. 【内存分析-jmap】已安装JDK,bash: jamp: command not found
  7. 测试工程师技术之外软技能提升指南
  8. KubeEdge设备接入应用的调试
  9. 【问与答】开复老师:硕士毕业后工作,还是出国读博?
  10. 利用H5Canvas进行前端图片压缩再上传笔记