关于图计算场景寻求解决方案

图计算场景寻求解决方案

  • 场景描述
    定义: X节点的ANA是X父节点的ANA的影响因子最大的集合。 求全部节点的ANA

全图数据约2亿节点,求快速计算全部节点的ANA

目前采用celery+redis+nebula解决,但效率太慢,求大佬推荐方案

  1. 没懂这个ANA是怎么算出来的。
  2. 不知道多久迭代一次,如果只是计算部分,可以用一些单机图计算方案试试。
  3. 也不知道持久化和更新频率是什么样的。

感谢回复

这个计算流程有点类似递归

比如X的父节点是A1,A2,A3
如果要计算X的ANA必须要先计算出A1,A2,A3的ANA(预先约定,如果一个节点无父节点,那么其ANA为其自身)

全图计算
更新频率:全量更新一个月一次,增量更新每日一次(约200w节点)@min.wu

随便YY一下啊:

  1. 我不知道是不是可以离线预先计算一些常用的vertex的ANA——比如每日增量更新完成之后;
  2. 或者,要计算X的ANA的时候,把他所有的祖先的点和边(作为一个子图)都抽到一个计算程序里面(比如JGraphT),然后,把计算好的结果(和时间)写回nebula graph作为当天计算的cache。
  3. 不知道你对时效性要求是怎么样的。
  4. 感觉耗时应该是花在获取所有的祖先上面(IO),不知道这个子图会有多大,拉取要多少时间。

关于jgraphT还没用过,不知道加载大图的话能不能扛得住、是否支持分布式,我现在有点倾向于用spark graphx来计算,但这条路还没走过,不知道行不行得通。
时效性的话,一个月能把全图更新,或者一天能把200w左右的增量更新完成就ok

还有一点就是,全量计算的话我需要遍历全图来判断哪些节点还没有计算,目前似乎还没有类似于scan的方法来遍历全图 @min.wu

如果只是一个点全部的祖先,并不大吧。
当然如果想全图那还是找spark试试吧。
scan这个功能真的现在就是没有。。。

一个点及其祖先加载虽然很快,但如果要实现全部节点都计算完,这个加载的过程就会花费很多时间。
没有scan功能的话我就需要在另外一个地方把节点id都存起来,方便做遍历用

你这个计算是每晚离线计算的吗?还是 发生请求的时候在线计算的?
如果是前者,反正在spark里面了,spark 顺便把scan搞定好了。。。你可以用storage接口,把所有点边批量全扫出来。你可以看下java client repo里面最近一个pr。
后者的话,就是取子图和计算,这个和nebula graph设计初衷比较接近。

离线计算(24小时触发一次)