【问题标题】:Deleting vertex with a degree of millions scale from JanusGraph从 JanusGraph 中删除数百万级的顶点
【发布时间】:2020-08-11 08:20:40
【问题描述】:
  • 我正在使用 Scylla 作为存储引擎运行 Janusgraph。
  • 该图有一个度数为 5M(进 + 出)的顶点,即大约有 5M 个顶点与之相连,
  • 我正在尝试通过 gremlin 查询 graph.traversal().V(vertexId).drop().iterate() 删除此顶点,但这需要很长时间(无法在 20 分钟内删除)。
  • 我了解上述查询会迭代所有边并进行实际删除

我想知道是否有人遇到过类似的问题并想出任何解决方法。任何线索都会非常有帮助。

【问题讨论】:

    标签: database graph janusgraph


    【解决方案1】:

    我的信息可能已经过时了,也许有修改过的方法可以做到这一点,但由于这个问题没有得到任何答复,我想我会提供我所知道的建议。在 JanusGraph 之前的日子里,当这个图被称为 Titan 时,我遇到了像你描述的那样的情况,我发现了类似的结果,你在直接 g.V(id).drop() 时发现了类似的结果,并且完全摆脱那个大小的顶点意味着拥有一些耐心。我用来摆脱它的策略涉及修剪其边缘的顶点,以便删除顶点本身成为可能。

    如何修剪边缘取决于您的数据以及这 5M 边缘的组成方式。它可以很简单,比如按标签或一次在每个标签内按 10000 个块或其他有意义的方法将过程分解成块。

    while(g.V(vertexId).outE('knows').limit(1).hasNext()) {
        g.V(vertexId).outE('knows').limit(10000).drop().iterate();
    }
    

    我想我记得我能够并行运行这些类型的操作,这稍微加快了进程。在任何情况下,当您得到所有​​边的顶点(或至少减小到明显更小的度数大小)时,您就可以g.V(vertexId).drop() 和它说再见了。

    我没有使用 ScyllaDB,但我想我记得这么多的删除可能会为 Cassandra 造成墓碑类型的问题,因此值得关注。您还可以考虑增加在此过程中可能发挥作用的各种超时。

    对我来说,多年来我在这个问题上学到的教训是构建基于 OLAP 的监控器来跟踪图表统计信息,以确保您在图表中获得适当和预期的增长(即学位分布、标签分布、 ETC)。这对于从 Kafka 等大容量流中提供的图表尤其重要,您可以在其中转过头几个小时,然后回来发现您的图表处于丑陋的意外状态。我认为以解决进入这些超级节点状态的可能性的方式进行建模也很重要。在许多情况下,边缘 TTL 和单向边缘可以帮助解决这个问题。

    我很想听到这个答案不再相关,并且有巧妙的新方法来做这些类型的下降,或者有一些 ScyllaDB 特定的方法来处理这个问题,但是,如果没有,也许这将是对您有用并帮助您解决问题。

    【讨论】:

    • 感谢@stephen 的回答,虽然它没有收到很多选票:)。您是否有任何时间测量,例如连接到顶点的 1M 边缘的执行时间?我继续使用对顶点的软删除方法,以便消费者在消费过程中可以忽略
    • 不幸的是我不记得了。我似乎记得有些情况不到一个小时,有些需要更长的时间,但我不记得是什么情况导致了这种情况。它总是让我着迷于一个顶点可以随着边缘增长到多胖。 cassandra 似乎从来没有遇到过被喂食越来越多的边缘的问题,但是一旦需要摆脱那个东西,就需要一些思考和努力。
    猜你喜欢
    • 2010-11-22
    • 2021-08-03
    • 1970-01-01
    • 2015-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多