Graph Partition: Edge cut and Vertex cut

news2024/11/16 13:50:38

Graph Partition

  • Edge cut and Vertex cut
    • Edge cut
    • Vertex cut
  • 实际如何进行点分割和边分割的呢?
    • Graph store format
    • 情况1:按照边列表存储:
    • 情况2:按照邻接表存储:

Edge cut and Vertex cut

图结构描述了数据流动,分布式图计算系统或核外图计算系统均依赖于图划分。
良好的图划分策略可以最小化通信和存储开销,并确保计算平衡。
请添加图片描述

Edge cut

如下图所示,Edge cut 将节点分配到不同的机器,边横跨各机器,通信开销和存储开销直接与切割的数量呈比例.因此需要通过最小化边的切割数目,将节点尽量多的分给机器来减少通信开销和确保计算平衡。
但是规模巨大的图想要计算出一个最优的切割会付出巨大的花费,因此大多数都采用了随机切割,随机将节点分配给机器。随机的切割工作的时候接近最佳情况下的平衡,但是这也消耗了最坏的通信花费,切割了最多的边。
定理:如果节点被随机分配给p个机器,那么edge cut 的 expected fraction 为:

对于一个exponent 为 \partial的 power-law graph 每个节点期望的edge cut 为:

注:power-law degree distributios原来是一种描述网络图中结点度的分布,中文可叫做“幂律度分布”。

每次边的切割都会在本地保存一个邻近节点的备份,因此会增加网络和存储开销。
如图所示,切割成三份,增加了7个节点副本,每个节点都被复制了至少一次。
任何节点或边的变化都会通过网络同步到其他机器。

请添加图片描述
请添加图片描述
如上图所示,切割成三份,增加了5个节点副本,每个节点都被复制了至少一次。

对于频繁遍历的边,应该减少cut edge的存在,从而减少跨设备间的通信,提高查询效率。即把进行遍历的相邻顶点放在相同的分区,减少通信消耗。

顶点的id分配:一个分区就是一个有序的id区间,顶点被分配到一个分区就会为该顶点分配一个id,也就是顶点的id决定了该顶点属于哪一个分区。给一个顶点分配id:JanusGraph就会从顶点所属分区的id范围中选一个id值分配给该顶点。(先定分区,在分配id)

为顶点确定分区:JanusGraph通过配置好的 placement strategy来控制vertex-to-partition的分配。

默认策略:在相同事务中创建的顶点分配在相同分区上。
缺点:如果在一个事务中加载大量数据,会导致分配不平衡。
定制分配策略:实现IDPlacementStragegy接口,并在通过配置文件的ids.placement项进行注册。

Vertex cut

顶点切割,即把一个顶点进行切割,把一个顶点的邻接表分成多个子邻接表存储在图中各个分区上。
如图所示,vertex cut将边分配给不同机器,允许节点跨不同机器,节点的变化都需要同步到其他机器上,故通信开销与存储开销与每个节点跨机器的数呈正比,因此我们需要最小化每个节点跨机器的数。
比起edge cut,vertex cut 从理论和实践上,都显示出更好的性能。
请添加图片描述
通过为边定义一个hash函数,

可以保证每个节点最多在 在这里插入图片描述个机器上(m为机器集群的数量)。

是一个在节点ID上统一hash函数。

对于一个均衡的 p-way vertex cut ,将边集合 分配给机器 ,节点横跨机器集,因此可定义均衡切割如下所示:

平衡因子是一个很小的常量,里的每一个机器都将会有一个节点v的副本,每次节点的修改会传到每个副本,
因此的大小将会影响通信开销。
随机将中的一个副本设为master,维持着节点的主版本,其他副本都从此节点上复制。

vertex cut 能够更好的作用在power-law graph,通过切割部分度非常高的节点就能将整个图切分。同时每条边都保证了只存在于一个机器上。

在真实的大规模图上,Vertex cut 找到一个最优的切割也会付出巨大的花费,但是《Powergraph: Distributed graph-parallel computation on natural graphs》里为边的分区提出了几个简单的启发式data-parallel算法。最简单的策略就是随机的将边分给机器,随机的vertex cut 比随机的edge cut 更有效果,随机切分也能几乎达到最优均衡。

在集群数为p时,随机切割期望副本为:

对于power-law graph来说,副本期望由power-law 常量\alpha决定:

其中:

从上图(a)可以看到,虽然越小(度很高的节点越多),replication factor越大,但是相对于edge cut,vertex cut的有效增益实际上随着α的降低而增加。图(b)显示的是随机edge cut的期望花费与随机vertex cut的期望花费,显示出了使用vertex cut的数量级增量。

对于一个给定的edge cut 有 g个镜像副本,使用 vertex cut 进行分区能使副本的数量少于g。

目的:一个拥有大量边的顶点,在加载或者访问时会造成热点问题。Vertex Cut通过分散压力到集群中所有实例从而缓解单顶点产生的负载。
方法:JanusGraph通过label来切割顶点,通过定义vertex label成partition,那么具有该label的所有顶点将被分配在集群中所有机器上。
案例:对于product和user顶点,product顶点应该被定义为partition,因为用户和商品有购买记录(edge),热销商品就会产生大量的购买记录,从而会造成热点问题。

改进Vertex cuts随机分配算法:

这是一顺序贪心启发式算法,能使边在不同的机器上从而最小化conditional expected replication factor。

现假设在放置边i后,任务是放置边i+1,定义conditional expectation如下:

Ai是前一个边i的分配。使用前面得到的定理,对于边我们可以有以下规则:

如果A(v)与A(u)相交,那么该边(u,v)应存于交集的机器中。
如果A(v)与A(u)不为空并且没有交集,应该将该边分给节点中最多边未分配边的那个节点的A(i)中的任意机器。
如果一个或着两个vertex已经被分配,那么选择被分配了节点的机器。
如果两个节点都没被分配,那么将边分给负载最小的机器。

Vertex cut as table

GraphX resilient distributed graph (RDG)数据结构在vertex cuts 实现时将其分为三个无序平行的表 。
分别如下所示:在这里插入图片描述
EdgeTable(pid, src, dst, data),存储相邻结构以及边的数据。(pid 表示分区编号,src 表示起始节点,dst 表示结束节点)这个表只包含节点的id,不包含节点数据。依据pid 分区。

VertexDataTable(id, data),存储节点的数据,由 vertex id 进行分区。
VertexMap(id, pid),显示了节点ID和邻接边的虚拟分区的映射。此表通过vertex id进行分区。

The partitioner is a hint to Spark to ensure the join site would be local to the edge table. This allows GraphX to shuffle only the vertex data and avoid moving any of the edge data.

vertex data table 与 vertex map table 可以组合为一个表,但是因为他们的功能不同,所以将其划分为了两个表。vertex data table 包含与在图形计算过程中发生变化的顶点的相关状态,vertex map table 保留了静态的图结构.

实际如何进行点分割和边分割的呢?

Graph store format

例如,图G中9个顶点,V={0,1,2,3,4,5,6,7,8}。
8条边E={<01>,<02>,<03>,<04>,<05>,<56>,<67>,<68>}。
分成两个子图G1和G2。

情况1:按照边列表存储:

Edge List:

0 1 
0 2
0 3
0 4
0 5
5 6 
6 7
6 8

G1存储的顶点为:{01234};
4条边:{<01>,<02>,<03>,<04>}。

0 1 
0 2
0 3
0 4

G2存储的顶点为:{05678};
4条边:{<05>,<56>,<67>,<68>}。

0 5
5 6 
6 7
6 8

这是点分割方式。因为顶点0被划分到两个子图。

出现Hot-Vertex(一个顶点有大量的边,且该顶点会被经常访问):
采用VertexCut(又叫Edge-centric)策略,将边(及其依附的顶点)分配在不同的机器上。

情况2:按照邻接表存储:

Adjacency list:

0 1 2 3 4 5
5 6
6 7 8

G1存储的顶点为:{01234};其中,顶点5为子图G2中顶点5的副本。
4条边:{<01>,<02>,<03>,<04>}

0 1 2 3 4 5

G2存储的顶点为:{5678};3条边{<56>,<67>,<68>}:

5 6
6 7 8

这是边分割方式。
因为边<05>中,顶点0分配在G1中,顶点5分配在G2中。
顶点0和顶点5被划分到两个子图。

参考:
GraphX
PowerGraph

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/390907.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

项目经理必看!常用的项目管理工具及方法

本文为你介绍&#xff1a;1、好用的项目管理工具&#xff1b;2、项目管理方法 随着企业日益复杂的业务流程和庞大的项目数量&#xff0c;如何高效地管理项目成为了必须面对的挑战&#xff0c;许多企业开始使用项目管理工具和方法来更好地管理项目。 今天我就来介绍几个好用的…

【UE】大世界子关卡StreamingLevel加载流程

受限于硬件&#xff0c;当项目需要制作大世界的时候&#xff0c;整张大地图无法也没必要全部加载进内存。和所有支持大世界的引擎一样&#xff0c;UE采取了分块加载的方式&#xff1a;除了一个持久关卡&#xff08;PersistentLevel&#xff09;的加载以外&#xff0c;采用的都是…

网络通信快速入门

&#x1f3e1;个人主页 &#xff1a; 守夜人st &#x1f680;系列专栏&#xff1a;Java …持续更新中敬请关注… &#x1f649;博主简介&#xff1a;软件工程专业&#xff0c;在校学生&#xff0c;写博客是为了总结回顾一些所学知识点 目录网络编程实现网络编程的三要素&#x…

少儿编程 电子学会图形化编程等级考试Scratch一级真题解析(选择题)2022年12月

少儿编程 电子学会图形化编程等级考试Scratch一级真题解析2022年12月 选择题(共25题,每题2分,共50分) 1、小明想在开始表演之前向大家问好并做自我介绍,应运行下列哪个程序 A、 B、 C、 D、 答案:D

【MySQL】第17章_触发器

第17章_触发器 在实际开发中&#xff0c;我们经常会遇到这样的情况&#xff1a;有 2 个或者多个相互关联的表&#xff0c;如商品信息和库存信息分别存放在 2 个不同的数据表中&#xff0c;我们在添加一条新商品记录的时候&#xff0c;为了保证数据的完整性&#xff0c;必须同时…

Linux - 内存性能评估

文章目录概述free 命令指定的时间段内不间断地监控内存的使用情况通过watch与free相结合动态监控内存状况vmstat命令监控内存“sar –r”命令组合小结概述 内存的管理和优化是系统性能优化的一个重要部分&#xff0c;内存资源的充足与否直接影响应用系统的使用性能。在进行内存…

C语言-基础了解-07-C运算符

c运算符 一、算术运算符 假设变量 A 的值为 10&#xff0c;变量 B 的值为 20&#xff0c;则&#xff1a; 实例 #include <stdio.h>int main() {int a 21;int b 10;int c ;c a b;printf("Line 1 - c 的值是 %d\n", c );c a - b;printf("Line 2 - …

机器学习100天(四十一):041 对偶支持向量机-公式推导

《机器学习100天》完整目录:目录 机器学习 100 天,今天讲的是:对偶支持向量机-公式推导! 本节主要延续上一节的内容,推导线性支持向量机的对偶形式。本节内容包含的数学理论和推导很多,我尽量简化其中的数学部分,只做感性的介绍,便于大家在理解的同时不受数学复杂公式…

ubuntu 18.04 虚拟机分区扩容

我的虚拟机存在一个问题&#xff0c;原来分配的是60G的空间&#xff0c;但实际只用了30G就已经最显示空间已经满&#xff0c;没办法使用:通过fdisk -l查看分区情况查看LVM卷组的信息Free PE / Size 7551 / <29..50 GiB&#xff0c;这是还可以扩充的大小#lvextend -L 10G /de…

git常用命令汇总

Git 是一种分布式版本控制系统&#xff0c;它具有以下优点&#xff1a; 分布式&#xff1a;每个开发者都可以拥有自己的本地代码仓库&#xff0c;不需要连接到中央服务器&#xff0c;这样可以避免单点故障和网络延迟等问题。 非线性开发&#xff1a;Git 可以支持多个分支并行开…

踩坑:解决npm版本升级报错,无法安装node-sass的问题

npm版本由于经常更新&#xff0c;迁移前端项目时经常发现报错安装不上。 比如&#xff0c;项目经常使用的sass模块&#xff0c;可能迁移的时候就发现安装不了。 因为node-sass 编译器是通过 C 实现的。在 Node.js 中&#xff0c;采用 gyp 构建工具进行构建 C 代码&#xff0c…

自制有声书阅读器:用PaddleSpeech打开读书新方式

吕声辉&#xff0c;飞桨开发者技术专家&#xff08;PPDE&#xff09;&#xff0c;某网络科技公司研发工程师。主要研究方向为图像识别&#xff0c;自然语言处理等。 • AI Studio主页 https://aistudio.baidu.com/aistudio/personalcenter/thirdview/227158 项目背景 随着互联…

第十四届蓝桥杯三月真题刷题训练——第 3 天

目录 题目1&#xff1a;门牌制作 题目描述 运行限制 代码&#xff1a; 题目2&#xff1a;货物摆放_long 题目描述 答案提交 运行限制 代码&#xff1a; 题目3&#xff1a;跳跃_dp 题目描述 输入描述 输出描述 输入输出样例 运行限制 代码&#xff1a; 题目4&a…

AAAI顶会行人重识别算法详解——Relation Network for Person Re-identification

1.论文整体框架概述 在行人重识别任务中,通常都是对整个输入数据进行特征提取,但是缺少了局部信息。能不能既考虑局部与整体信息,也同时加入他们的联系呢?这篇论文主要的思想就是局部信息和全局信息的融合。 整体流程如上图所示, 首先对整体进行特征提取, 通常采用…

【FPGA】Verilog:MSI/LSI 组合电路之解码器 | 多路分解器

写在前面&#xff1a;本章将理解编码器与解码器、多路复用器与多路分解器的概念&#xff0c;通过使用 Verilog 实现多样的解码器与多路分解器&#xff0c;通过 FPGA 并使用 Verilog 实现。 Ⅰ. 前置知识 0x00 解码器与编码器&#xff08;Decoder / Encoder&#xff09; 解码器…

素数分类的猜想==素数,划分分类,就分为真素质数与非真素质数

素数分类的猜想 根据哥德巴赫公理&#xff08;我暂不称之为猜想了&#xff09;&#xff0c;普通素数加一&#xff0c;成为合数&#xff0c;必可分解成两个素数&#xff0c;所以&#xff0c;两个素数Pi,Pj相加减一&#xff0c;是有可能为素数Pn的&#xff0c;这样的素数Pi,Pj&am…

扩散模型DDPM开源代码的剖析【对应公式与作者给的开源项目,diffusion model】

扩散模型DDPM开源代码的剖析【对应公式与作者给的开源项目&#xff0c;diffusion model】一、简介二、扩散过程&#xff1a;输入是x_0和时刻num_steps&#xff0c;输出是x_t三、逆扩散过程&#xff1a;输入x_t&#xff0c;不断采样最终输出x_0四、具体参考算法流程图五、模型mo…

Android Framework 启动流程必知必会

课前预习在了解启动流程之前先了解一下下面两个概念:1、子进程与父进程的区别1.除了文件锁以外,其他的锁都会被继承2.各自的进程ID和父进程ID不同3.子进程的未决告警被清除4.子进程的未决信号集设置为空集2、什么是写时拷贝(copy-on-write)Linux 的 fork() 使用是通过「写时拷贝…

【Linux】Linux项目自动化构建工具make makefile

文章目录1. 背景2.实例3.原理4.项目清理5. 文件属性中的三个时间6. Linux下第一个小程序——进度条6.1 前置知识1&#xff1a;缓冲区6.2前置知识2&#xff1a;回车换行6.3进度条的实现7 Linux下git的”三板斧“1. 背景 一个工程中的源文件不计其数&#xff0c;其按类型、功能、…

【C++】位图+哈希切割+布隆过滤器

文章目录一、位图1.1 位图概念1.2 位图实现1.2.1 把x对应比特位0置11.2.2 把x对应比特位1置01.2.1 查看x对应比特位1.3 位图源码1.4 位图的应用二、哈希切割&#xff08;处理海量数据&#xff09;三、布隆过滤器3.1 布隆过滤器的概念3.2 布隆过滤器的应用场景3.3 布隆过滤器的实…