janusgraph索引创建失败解决方法

背景

janusgraph在导入数据前或者导入数据后都可以创建索引,对于导入数据前创建索引一般不易有问题,在导入数据后创建索引比较复杂且容易出错,导致索引无法生效。

问题现象描述

janusgraph索引生命周期
在创建索引后,无论如何操作索引状态始终是INSTALLED
根据上图可知
索引状态包括:INSTALLED 、REGISTERED 、ENABLED 、DISABLED ;
索引动作包含:REGISTER_INDEX 、REINDEX 、ENABLE_INDEX 、DISABLE_INDEX 、REMOVE_INDEX。
值得注意的是janusgraph修改索引状态并非是由一个状态改为另一个状态,而是使用索引动作将索引生产到下一个状态。

解决方法

  1. 使用以下代码回滚未提交的事务。graph1是图的名称。
all_graphtx=graph1.getOpenTransactions();
for(i=0;i<all_graphtx.size();i++) {graph1.getOpenTransactions().getAt(0).rollback()};
  1. 执行以下代码修改索引状态为REGISTERED。myIndex是索引名称。
mgmt = graph1.openManagement();
mgmt.updateIndex(mgmt.getGraphIndex("myIndex"), SchemaAction.REGISTER_INDEX).get();
mgmt.commit();
  1. 查看索引状态。在图库已有数据情况下,索引状态显示为REGISTERED,则直接跳转到第五步;在没有数据情况下一般会直接到ENABLED,到此问题解决;如果索引状态未改变按照第四步操作。
mgmt = graph1.openManagement();
mgmt.printSchema();
mgmt.commit();
  1. 参考以下代码关闭其他janusgraph节点。直接使用以下代码会关闭除当前节点以为的所有节点,不建议操作,尽量根据实际情况关闭异常节点。关闭后重新执行前三步。
all_instances = mgmt.getOpenInstances();
for(i=all_instances.size()-1;i>=0;i--) {if(all_instances[i].indexOf('current')!=-1){continue;}; mgmt.forceCloseInstance(all_instances[i]); };
mgmt.commit();
  1. 执行以下代码修改索引状态为ENABLED。如果数据量较大REINDEX可能比较耗时,建议不直接调用get(),使用异步执行等待结果。
mgmt = graph1.openManagement();
mgmt.updateIndex(mgmt.getGraphIndex("myIndex"), SchemaAction.REINDEX).get();
mgmt.commit();
mgmt = graph1.openManagement();
// 异步等待
future = mgmt.updateIndex(mgmt.getGraphIndex("myIndex"), SchemaAction.REINDEX);
mgmt.commit();
// 等待一段时间后查询状态,建议带超时时间
future.get(1000);
  1. 使用第三步中的代码查询索引状态是否到ENABLED状态。可以在查询语句后加profile()验证是否有使用索引。eg:
graph1.V().has("id","1212212").profile();

原因介绍

  1. janusgraph默认在你修改数据或者执行第一个查询(获取第一个视图)时开启事务并且需要调用graph1.tx().commit手动提交事务。所以需要步骤一回滚所有未提交事务。
  2. janusgraph创建索引需要所有节点都同步索引创建的消息,如果有节点异常就会导致索引创建失败,所以需要步骤四关闭异常节点。

参考链接

https://docs.janusgraph.org/index-management/index-lifecycle/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值