摘要:GES大规模图计算引擎HyG通过实现不同的点边分区算法,可以灵活地供用户选择多种多样的切分策略,进而达到更好的运算性能。

本文分享自华为云社区《GES超大规模图计算引擎HyG揭秘之图切分》,作者:π 。

对于超大规模图数据,点、边数量可以达到百亿甚至千亿、万亿,存储如此规模的图数据往往需要几百GB甚至几TB的存储空间,为了高效的图计算分析,往往需要将图数据存储于内存中,因此,对于超大规模的图数据,是没有办法将整张图存放在单机之上的,这就需要图计算框架对原始图进行切分,将一张大图切割成多个子图,然后将这些子图运行于一个集群之上,进而完成各种各样的图分析、图查询任务。GES大规模图计算引擎HyG通过实现不同的点边分区算法,可以灵活地供用户选择多种多样的切分策略,进而达到更好的运算性能。

一个好的图切分算法对于图计算引擎性能至关重要:

  • 合理的切分可以使每个子图负载更加均衡,进而加快每轮的迭代速度
  • 合理的切分可以大大降低子图之间的通信开销

图切分算法主要有两大分支:

  • 离线切分 :需要加载完整的图数据,根据图整体的拓扑结构,进行多次迭代、聚类等方法,来获得高质量的分区边界
  • 流式切分:在对点/边的划分过程中,被划分对象数据流式地传输到图划分模块中,当前对象的分区策略至多依赖于之前对象的分区状态,而与后续流式传输来的对象的信息无关

流式的图分区算法的优点

1) 内存占用小。流式的图分区算法每个分区只需要加载部分的图数据即可进行划分,各分区之间只需要较小的通讯代价即可完成对分区状态的同步。而离线的图分区算法需要加载完整的图数据,并且例如XtraPupl、Metis对整个图进行多次迭代,细化其分区,产生大量内存开销。

2) 分图效率高。流式的图分区算法中,对象流式地传入,即刻可以决定分区结果,对每个分区对象只需要遍历一次。并且支持多线程多个对象并行流式输入、分区,分区完成之后线程间同步分区状态,实现高效率的分区。而类似XtraPupl、Metis的离线分区算法,由于需要多次迭代,对一个对象的分区需要对遍历不止一次,并且由于其分区算法对图整体拓扑结构的依赖性高,导致其可开发的并行度不高,分图效率不如流式的图分区算法。

3) 分图质量相当,部分情况下更优。在对多种图计算算法和多个数据集的测试中,图计算推理时间开销各有优劣,但流式图分区中总有数个具体分区算法,其在图计算推理的时间开销优于离线图分区算法XtraPupl,用户使用流式图分区算法具有更高的灵活度,可以针对不同的算法、数据集、分区数量,选择合适的具体分区算法,获得更好的图计算推理性能。

我们的HyG图计算引擎就是采用流式切分算法进行图切分。

HyG图计算引擎如何实现图切分?

图切分最核心的就是两个步骤。1、如何将点分配到各个主机;2、如何将边分配到各个主机。HyG对这两个步骤进行了抽象,定义了以下两个方法:

getMaster(nodeID) //给定一个点ID,返回这个点需要分配给哪个主机

getEdgeOwner(edgeSrcID, edgeDstID) // 给定一条边,返回这个边需要分配给哪个主机

一旦给出了以上两个函数,HyG的切分器就可以完成大图的切分。业界和学术界有大量的图切分算法,本质的区别就是getMaster和getEdgeOwner的实现不同,几乎所有的图切分算法都可以重写成这种模式。下面我们举一个出边切(OEC)的例子,看看HyG是怎么通过重定义getMaster和getEdgeOwner两个函数完成图切分的。

首先我们定义

GetMaster(nodeID)
return floor(nodeID / hostNum)

这个函数很简单,就是点ID除以主机数量然后向下取整,图1我们有4个顶点,假设我们有4个主机,这样的话就为每个主机分配了一个点。

然后我们定义

GetEdgeOwner(edgeSrcID, edgeDstID)
return masterOf(edgeSrcID)

这个函数也很简单,就是获取边的源顶点所在的主机ID,因为GetMaster已经完成了点的划分,因此这一步直接查询就可以得到结果。这样的话切分器就明确了这条边应该分配给哪个主机。

在完成GetMaster和GetEdgeOwner的定义后,HyG就可以将原始的图切分成4个子图,如图3所示。

图3

上面提到的切分示例是最简单的一种切分方法,在现实应用场景下,往往需要更为复杂的切分策略才能达到有效、均衡的切分效果。

HyG实现的点分区算法主要分为两类:ContiguousEB和FennelEB。

1) ContiguousEB直接将点分配给在读图阶段读取该点的分区,不进行额外的分区操作。

2) FennelEB在分区时会维护当前的分区状态,流式读取到顶点后,会根据各分区的已分配数量、该顶点在各分区的局部性,为每个分区生成一个评分,将顶点分配到评分最高的分区中。

HyG实现的边分区算法主要分为三类:Source,Hybrid和Cartesian。

1) Source直接将边分配给其对应顶点所在的分区,如果是以出边划分的算法,即将其划分给源顶点所在的分区,如果是以入边划分的算法,即将其划分给目标顶点所在的分区。

2) Hybrid设定一个阈值threshold,顶点度数低于阈值的称为低度顶点,高于阈值的视为高度顶点。这种边分区算法保证了低度顶点的局部性,同时将高度顶点分散开来,避免了少数高度顶点带来的负载不均衡问题。

3) Cartesian将邻接矩阵切分为数个二维网格,每个网格对应一个分区,将边按照网格划分,这种分区算法保留了一定的局部性,同时可以获得更好的负载均衡。

HyG通过实现不同的点分区算法(GetMaster)和不同的边分区算法(GetEdgeOwner),可以实现多种多样的切分策略,非常的灵活好用,用户可以根据自己图数据的特点选择不同的切分策略,进而达到更好的运算性能。

目前HyG已上线至华为云GES服务,欢迎大家上手体验~

 

点击关注,第一时间了解华为云新鲜技术~

揭秘GES超大规模图计算引擎HyG:图切分的更多相关文章

  1. 图计算引擎分析——Gemini

    前言 Gemini 是目前 state-of-art 的分布式内存图计算引擎,由清华陈文光团队的朱晓伟博士于 2016 年发表的分布式静态数据分析引擎.Gemini 使用以计算为中心的共享内存图分布式 ...

  2. 图计算引擎分析--GridGraph

    作者:京东科技 李永萍 GridGraph:Large-Scale Graph Processing on a Single Machine Using 2-Level Hierarchical Pa ...

  3. 阿里重磅开源首款自研科学计算引擎Mars,揭秘超大规模科学计算

    日前,阿里巴巴正式对外发布了分布式科学计算引擎 Mars 的开源代码地址,开发者们可以在pypi上自主下载安装,或在Github上获取源代码并参与开发. 此前,早在2018年9月的杭州云栖大会上,阿里 ...

  4. 腾讯正式开源图计算框架Plato,十亿级节点图计算进入分钟级时代

    腾讯开源再次迎来重磅项目,14日,腾讯正式宣布开源高性能图计算框架Plato,这是在短短一周之内,开源的第五个重大项目. 相对于目前全球范围内其它的图计算框架,Plato可满足十亿级节点的超大规模图计 ...

  5. 腾讯开源进入爆发期,Plato助推十亿级节点图计算进入分钟级时代

    腾讯开源再次迎来重磅项目,14日,腾讯正式宣布开源高性能图计算框架Plato,这是在短短一周之内,开源的第五个重大项目. 相对于目前全球范围内其它的图计算框架,Plato可满足十亿级节点的超大规模图计 ...

  6. GraphX 图计算实践之模式匹配抽取特定子图

    本文首发于 Nebula Graph Community 公众号 前言 Nebula Graph 本身提供了高性能的 OLTP 查询可以较好地实现各种实时的查询场景,同时它也提供了基于 Spark G ...

  7. 图计算 on nLive:Nebula 的图计算实践

    本文首发于 Nebula Graph Community 公众号 在 #图计算 on nLive# 直播活动中,来自 Nebula 研发团队的 nebula-plato 维护者郝彤和 nebula-a ...

  8. 关于图计算&图学习的基础知识概览:前置知识点学习(Paddle Graph Learning (PGL))

    关于图计算&图学习的基础知识概览:前置知识点学习(Paddle Graph Learning (PGL)) 欢迎fork本项目原始链接:关于图计算&图学习的基础知识概览:前置知识点学习 ...

  9. 开源图计算框架GraphLab介绍

    GraphLab介绍 GraphLab 是由CMU(卡内基梅隆大学)的Select 实验室在2010 年提出的一个基于图像处理模型的开源图计算框架.框架使用C++语言开发实现. 该框架是面向机器学习( ...

  10. 揭秘阿里云EB级大数据计算引擎MaxCompute

    日前,全球权威咨询与服务机构Forrester发布了<The Forrester WaveTM: Cloud Data Warehouse, Q4 2018>报告.这是Forrester ...

随机推荐

  1. 鬼谷子的钱袋(lgP2320)

    主要思路:二进制拆分. 先将 \(m\) 进行二进制拆分. 注意金币总数有限,也就是说拆分后可能会多出来一组.多出来的这组如果不是 \(2^n\) 就不需要考虑了,因为不会和前面的重复. 接下来考虑重 ...

  2. JUC并发编程学习笔记(四)8锁现象

    8锁现象 八锁->就是关于锁的八个问题 锁是什么,如何判断锁的是谁 对象.class模板 深刻理解锁 锁的东西无外乎就两样:1.同步方法的调用者,2.Class模板. 同一个锁中,只有当前线程资 ...

  3. 来世再不选Java!

    危机感 距离上一次找工作面试已经过去快2年了,那时候正值疫情肆虐,虽然还未感受到"寒潮来临"的苗头,但最终还是成功通过了几轮面试,顺利签约.在目前公司待了2年了,在大环境的影响下, ...

  4. NPOI获取Excel文件里的形状/图片的坐标/锚点

    有个妹纸找我请教如何获取图片坐标,因此我到家后花了点时间,写了这份代码. 实测下来,可以正确获取 Excel 2003 版本的形状和图片这两种的坐标/锚点,以及 Excel 2007 版本的图片的坐标 ...

  5. C语言二进制转换成八,十,十六进制

    代码目前只支持整数转换,小数转换后续更新呀 #include <stdio.h> #include <math.h> void B_O(int n); void B_H(int ...

  6. Git如何回到拉取之前的代码

    1.执行git reflog命令查看你的历史变更记录: 2.git reset --hard 2aee3f(拉代码之前的提交记录) Git基础命令总结请参考:https://blog.csdn.net ...

  7. 在路上---学习篇(一)Python 数据结构和算法 (4) --希尔排序、归并排序

    独白: 希尔排序是经过优化的插入排序算法,之前所学的排序在空间上都是使用列表本身.而归并排序是利用增加新的空间,来换取时间复杂度的减少.这俩者理念完全不一样,注定造成的所消耗的时间不同以及空间上的不同 ...

  8. 🔥🔥Java开发者的Python快速进修指南:面向对象--高级篇

    首先,让我来介绍一下今天的主题.今天我们将讨论封装.反射以及单例模式.除此之外,我们不再深入其他内容.关于封装功能,Python与Java大致相同,但写法略有不同,因为Python没有修饰符.而对于反 ...

  9. C#Winform使用NPOI获取word中的数据

    公众号「DotNet学习交流」,分享学习DotNet的点滴. 需求 想要获取word里面的内容,如下图所示: 有一张表和一段文本,并将它们存入数据库或者Excel. 步骤 添加NPOI的库,如下图所示 ...

  10. 2019-2020 ICPC Southwestern European Regional Programming Contest (SWERC 2019-20) L题(SG+状压)

    题意:给定一个N*N的表格,其上有三种类型的方格:坚实的地面.潮湿的区域和保护区.连通的湿区方格形成湿区,当两个正方形共用一条边时,它们被认为是连接的.每个湿区必须连接到网格的左右两侧,并且不包含超过 ...