GraphMapReduce

图计算框架
授权协议 未知
开发语言 C/C++
所属分类 服务器软件、 分布式应用/网格
软件类型 开源软件
地区 国产
投 递 者 祁飞翰
操作系统 跨平台
开源组织
适用人群 未知
 软件概览

GraphMapReduce: 基于MapReduce编程模型的图计算框架

(名词约束: 顶点Vertex-图中顶点;节点Process-计算单元节点),目录说明:

代码主要包含四个文件: gmr.cpp gmr.h algorithms.h graph.h
|__graph/---------#此目录包含测试用的图例数据
|__include/-------#此目录包含所使用到的第三方库的头文件(目前只用到了ParMetis,去掉了GKlib)
|__lib/------------#包含了使用到的第三方库
|__gmr.cpp------#程序的main函数入口和迭代循环
|__gmr.h---------#包含主要的计算过程函数computing()和计算结果更新函数updateGraph()
|__algorithm.h---#常用图算法的MapReduce实现
|__graph.h-------#定义了图数据结果和常用的集中图操作函数

一. 框架的基础

1. MPI:

结算节点之间通信通过MPI实现;

2. MapReduce编程模型

3. 图划分:

为了将整图的不同部分放到不同的计算节点进行并行计算,需要将整划分为若干子图。本框架中每个子图包含三个部分{inners, borders, neighbors}, inners表示子图内与其他子图没有连接的顶点;borders表示子图内与其他子图又连接的顶点;neighbors表示子图外与本子图连接的顶点。

二、迭代计算过程

1. 数据交换:

第一步,先遍历自己计算的子图graph与其他子图的邻居情况,并收集需要向其他节点发送的字节数,并申请发送缓冲区;

第二步,通过MPI_Alltoall()与其他节点交换其他节点需要接受的字节数,每个节点收到信息后,各自计算和申请接受数据需要的空间。

第三步,再次遍历自己计算的子图graph,并将需要发往其他节点的顶点信心拷贝到发送缓存char *sb;

第四部,调用MPI_Alltoallv(),将发送缓存中的数据发往各节点.

2. 计算1th/2:map

将子图graph和接受缓冲区中的数据实例化为顶点Vertex,再调用业务逻辑函数map将Vertex生成key/value list。

3. 对生成key/value list进行排序: sort

4. 计算2th/2:reduce

将排序好的key/value list按照业务逻辑函数reduce进行规约.

5. 将reduce计算的结果更新到graph中

三. 编译和运行

1. (not mandatory)切图

切图采用了metis库,其源码和说明位于include/metis中,其编译使用可参考include/metis/README.md.已经有切好的例图,位于graph/下。

2. 编译gmr

make clean && make

3. 运行

mpirun -np graph_nparts ./gmr

四. 例子

4.1 PageRank

4.1.1. 如下包含10个顶点的简单图,划分之后包含三个子图subgraphs[3]:

输入图片说明

4.1.2. 迭代过程

  • 每个子图现将自己的边界顶点发送给其所连接的邻居节点,采用MPI_Alltoall()实现;

  • 在每个计算节点的内部,将每个顶点映射为若干键值对:      > {key, value1},其中key in [neighbors], value1 = value / neighbors.size()

    void map(Vertex &v, std::list<KV> &kvs){int neighbor_count = 0;while(v.neighbors[neighbor_count] != 0)neighbor_count++;float value = v.value / neighbor_count;for (int i = 0; i < neighbor_count; i++)
        kvs.push_back({v.neighbors[i], value});}
  • 在每个节点内将map生成的键值对按键值进行排序

  • 根据键值,对键值相同的键值组执行reduce函数

    KV reduce(std::list<KV> &kvs) {float sum = 0.0;for (auto kv : kvs) {
        sum += kv.value;}/*Pagerank=a*(p1+p2+…Pm)+(1-a)*1/n,其中m是指向网页j的网页j数,n所有网页数*/sum = 0.5 * sum + (1 - 0.5) / (sizeof(vs) / sizeof(Vertex) - 1); return {kvs.front().key, sum};}

4.2.3 PageRank终止点问题和陷阱问题

上述上网者的行为是一个马尔科夫过程的实例,要满足收敛性,需要具备一个条件:图是强连通的,即从任意网页可以到达其他任意网页:互联网上的网页不满足强连通的特性,因为有一些网页不指向任何网页,如果按照上面的计算,上网者到达这样的网页后便走投无路、四顾茫然,导致前面累 计得到的转移概率被清零,这样下去,最终的得到的概率分布向量所有元素几乎都为0。假设我们把上面图中C到A的链接丢掉,C变成了一个终止点,得到下面这个图:

输入图片说明

另外一个问题就是陷阱问题,即有些网页不存在指向其他网页的链接,但存在指向自己的链接。比如下面这个图:

输入图片说明

上网者跑到C网页后,就像跳进了陷阱,陷入了漩涡,再也不能从C中出来,将最终导致概率分布值全部转移到C上来,这使得其他网页的概率分布值为0,从而整个网页排名就失去了意义。

 相关资料
  • Angel-Graph 如今,我们身处万物互连的复杂网络世界,人和人、人和物、物和物之间的关系也变得更加复杂多样化,现实中许多问题都可以抽象为图来表达,通过传统图挖掘、图表示学习和图神经网络等图技术,我们可以从海量关系结构的数据中挖掘丰富的信息,以弥补单点分析的不足,最终对金融支付、安全风控、推荐广告等诸多业务场景产生助力。 概览 Angel Graph吸收了Angel参数服务器以及Spark、P

  • 一、MapReduce概述 Hadoop MapReduce 是一个分布式计算框架,用于编写批处理应用程序。编写好的程序可以提交到 Hadoop 集群上用于并行处理大规模的数据集。 MapReduce 作业通过将输入的数据集拆分为独立的块,这些块由 map 以并行的方式处理,框架对 map 的输出进行排序,然后输入到 reduce 中。MapReduce 框架专门用于 <key,value> 键值

  • 类型 实现框架 应用场景 批处理 MapReduce 微批处理 Spark Streaming 实时流计算 Storm

  • 其于职业介绍所、工头、工人、工作模型的分布式计算框架。 职业介绍所有两种,一种是本地职业介绍所,一种是远程职业介绍所。顾名思义,本地职业介绍所就是在当前计算机上的,远程职业介绍所用于连接到远程职业介绍所的。 工人、工头都可以加入到职业介绍所,所以加到本地或远程种业介绍所都是可以的。 在同一个职业介绍所中,具有同样类型的工人、工头和工作都存在的时候,工作就可以被安排下去执行。当然,有两种安排方式,一

  • 反向传播通过使用计算图在Tensorflow,Torch,Theano等深度学习框架中实现。 更重要的是,理解计算图上的反向传播结合了几种不同的算法及其变体,例如通过时间的backprop和具有共享权重的backprop。 一旦将所有内容转换为计算图,它们仍然是相同的算法 - 只是在计算图上反向传播。 什么是计算图 计算图被定义为有向图,其中节点对应于数学运算。 计算图是表达和评估数学表达式的一种

  • 1.5.3 ROS计算图 1.计算图简介 前面介绍的是ROS文件结构,是磁盘上 ROS 程序的存储结构,是静态的,而 ros 程序运行之后,不同的节点之间是错综复杂的,ROS 中提供了一个实用的工具:rqt_graph。 rqt_graph能够创建一个显示当前系统运行情况的动态图形。ROS 分布式系统中不同进程需要进行数据交互,计算图可以以点对点的网络形式表现数据交互过程。rqt_graph是rq