基于mapreducer的图算法

作者系阿里巴巴集团1688技术部普通码农

引言

周末看到一篇不错的文章“Graph Twiddling in a MapReduce
world” ,介绍MapReduce下一些图算法的实现。文章语言质朴,介绍很多实用图优化技巧。文章2009年发表,至今已经被引用183次,足以证明这篇文章价值。目前这篇文章网上已经有人对这篇文章做了介绍,但仅介绍了其中最简单的两个算法,对其中的所做优化,并没有做分析。为了加深对文章算法的理解,我重新对这篇文章的算法做了翻译,同时加了自己的理解,以及算法在我们工作可能涉及的应用场景。鉴于“一图胜千言”的想法,我增加大量图片,以及实际例子演化算法流程,以增强对算法的理解。

介绍

MapReduce框架非常适合处理大规模的流数据,而图算法的实现一直是MapReduce的难点。已发表这方面的文章也不是特别多。根据“Graph
Twiddling in a MapReduce world”,本文详细介绍了 四个图算法的实现,分别是图节点度计算,三元环检测,四元环检测,k-桁结构(k-trusses)检测。

图节点度计算

度是图节点最基本的特征,在hadoop中求节点度的方法比较简单。以图1为例,需要求其中各个节点的度。

Hadoop算法实现非常简单,如下图2所演示

MapReduce-1:
分别以边的两个节点作为key,边作为键值输出,reducer阶段统计节点关联的边个数,同时输出边中相应节点的度;

MapReduce-2:以MapReduce-1的输出作为输入,reducer阶段合并边上两个节点的度。

三元环检测

三元环检测主要思想是先查找所有开三元环(相当于三个节点形成一条链),然后一条边是否可以将这个开三元环闭合(即是否有一条边可以将链的两个端点闭合)。

这里有两个优化点,可以大大提供算法性能。 首先,为了降低计算复杂度,一个三元环,我们只输出一次。如果对三元环中节点排序(最简单的办法就是节点按字母排序),通过逆序或者旋转三元环的节点输出顺序只有一种(例如ABC,BAC, CBA, ACB… 都可以由ABC逆序或者旋转得到)。由于这个性质,每轮mapper reducer过程,输出时候保证节点是按顺序的。 其次,二次爆炸问题,当某一个节点度比较高的时候,那么通过这个节点边就会很多,进而形成的开三元环也会比较多(例如,节点A的度为N,那么通过节点A边有N条边,这N条边任意两条都可以形成一个开三元环,最终A节点将形成N(N-1)/2
个开三元环,当N很大时候性能会有很大影响)。一个解决办法是,使用度较小的节点为key做合并,这样数据被分散到度比较小的节点上。(结合上面的性质,三元环节点序是只有一种,所以不会出现有些三元环没找到的情况)。这两个优化点能大大提高算法性能。

我们以第一节中的图1为例,具体的hadoop算法流程如下

检测三元环算法包含两个MapReducer过程:

  • MapReducer-1

    • Mapper:

      • input: 带有度的边
      • output: 以边中度较小的节点为key,边为键值输出;【降低二次爆炸问题】
    • Reducer:
      • process:合并节点的开三元环;
      • output:输出开三元环,输出时候按三元环两端节点字母排序输出。【保证输出顺序】
  • MapReducer-2
    • Mapper:

      • input:a) 所有带有度的边,按字母顺序输出; b) MapReduce-1中产生的所有开三元环;
      • output:输出边 和开三元环;
    • Reducer:
      • process: 判断是否,一条边能将开三元环闭合;能够闭合则是一个三元环;
      • output: 输出所有三元环

四元环检测

四元环检测基本思想与检测三元环类似。可以先找两个开三元环,如果两个开三元环连接相同的两个端点,那么这两个开三元环组成一个四元环。为了减少计算量,我们先分析一下四元环旋转和逆序的性质。先从三元环说起,前面已经提到了。假如三元环顶点有序,那么通过旋转和逆序三元环的顺序是唯一的(ABC,BCA,CAB,CBA,ACB,BAC都可以通过ABC旋转或者逆序得到)。对于四元环四个顶点(A,B,C,D),四个顶点的排列方式有4!=24中,但是通过旋转和逆序只有三种排列方式 (排序方法最简单就是按字母顺序排序)。

如图4所示,我们继续对上面四元环进行分析。根据其中三元环顶点与其邻居节点的关系,我们对上面三个四元环进行分类。首先(a)中两个开三元环(蓝色)的顶点(A,B)比它们相邻的节点(C,D)都小;(b)中两个开三元环(蓝色和黑色),黑色开三元环顶点小于它邻居节点,蓝色开三元环的顶点在邻居节点中间;(c)中两个开三元环(黑色),顶点都在邻居节点中间。所以四元环可以分解成两种三元环的组合:一种三元环,其顶点在两个邻居节点中间,一种三元环,其顶点比邻居节点小。通过这样的策略我们减少开三元环的输出,降低算法的复杂度,后面我们将看到这个策略的应用。

四元环检测算法如下:

a) mapper输入所有的边,分别以边节点为key,边为value的键值,同时对键值对进行标注,标记输出的节点的字母排序(或者其他排序)大小,例如,处理边AF时候, mapper输出值有两个键值对,<A,(AF),L> <F,(AF),H>。第一个值表示key A,键值 AF,L表示A < F (字母序); 第二个值表示key F,键值AF,H表示 F>A(字母序);

b) reducer 处理所有节点对应的开三元环 ,这里注意我们输出两种开三元环:(I)输出节点关联的任意两个L键值对组成的开三元环 (例如,图中C,F对应的两个L键值对,他们组成的开三元环都要输出。如果有三个对以上的L 键值,任意两对组成的开三元环都要输出);(II)输出节点任意一个L键值对和所有的H键值组成的开三元环(例如图中D,F节点)。 【这里就是为什么上面我们分析四元环的组成,因为任意一个四元环只能分解成,两种情况顶点小于两个相邻节点,顶点在两个相邻节点中间。两个L键值对表示的就是顶点小于两个相邻节点,一个L键值和一个H键值表示就是顶点在两个相邻节点中间】

c) 最后一个Reducer就是分析是否两个开三元环的顶点不一样,但是端点一致;是则是四元环;否则不是。

算法流程可以见下图5

k-trusses 结构检测

k-trusses 桁结构的定义是:a relaxation of a kmember clique and is a nontrivial, single-component maximal subgraph, such that every edge is contained in at least k -2 triangles in the subgraph. 具体理解,桁结构中是由三角结构组成的平面或者立体结构。如下图中(a)是一个4-trusses,而(b)不是4-trusses;(b)是两个3-trusses。桁结构有很多力学性质,在网络社区发现等算法中k-trusses也经常被认为是一簇紧密相连的节点,可以聚为一类。下面我们就来介绍一下,通过hadoop框架来实现k-trusses结构检测的问题。

从上面定义可以发现其实寻找k-trusses问题可以转化为查找三元环问题。同时,由于k-trusses的边满足支撑条件(即k-trusses中的边至少属于k-2 triangles),可以考虑每次删除图中不满足支撑条件的边,检验剩下的图中边是否还满足支撑条件,不断迭代。如果将所有不满足支撑条件的边都去掉,图中剩余的component,就是k-trusses。具体算法如下:

  • 1) 计算边的度,检测出所有的三元环
  • 2) 输出三元环所有边,记录边所在三元环的个数;
  • 3) 保留满足支撑条件的边;
  • 4) 如果step 4 删除某些边,那么goto step1
  • 5) 剩下图中的components,每一个都是k-trusses

其中step 3,4 是一个MapReducer过程。

具体计算过程如下,假如初始图如下,我们要做4-trusses检测:

  • 1) 计算节点度,检测三元环;
  • 2) step 3, step 4 为一个MapReduce过程,演示示意图如下图6。 
  • 3) Reducer过程中去掉了一些边,那么回到step1,重新对剩下的边做三元环检测,看剩下的边是否满足支撑条件。如下图所示,这时我们发现剩下的边组成如下的图,由此我们推理出trusses检测算法的主要流程,最后满足支撑条件的边都能构成4-trusses。

参考资料

Graph
Twiddling in a MapReduce world

基于mapreducer的图算法,布布扣,bubuko.com

时间: 2024-10-14 20:40:45

基于mapreducer的图算法的相关文章

实时智能决策引擎在蚂蚁金服风险管理中的实践

摘要:以"数字金融新原力(The New Force of Digital Finance)"为主题,蚂蚁金服ATEC城市峰会于2019年1月4日上海如期举办.金融智能专场分论坛上,蚂蚁金服数据技术专家王修坤做了主题为<实时智能决策引擎在蚂蚁金服风险管理中的实践>的精彩分享.在演讲中,王修坤分享了互联网保险产品场景化.高频化和碎片化的典型特征以及在风险控制方面所面临的诸多挑战,并为大家介绍了实时智能决策引擎在蚂蚁金服风险管理中的实践.王修坤 蚂蚁金服保险事业群数据技术专家

基于OpenCL的图像积分图算法改进

复杂的算法却未必低效,简单的算法往往要付出代价,这个代价可能很大.在opencl环境下编程,与我们在CPU上的传统编程思想有一些差异,这些差异看似微不足道,但往往是细节决定成功,就是这些看似微不足道的差异,在多核的GPU上被无限放大,导致同一种算法在GPU和CPU运行效果有着巨大的差别. 之前写过一篇文章<基于OpenCL的图像积分图算法实现>介绍了opencl中积分图算法的基本原理(不了解积分图概念的朋友可以先参考这篇文章),并基于这个基本原理提供了kernel实现代码.但经过这两个月的实践

[blog]基于卷积神经网络的以图搜图算法实现

基于卷积神经网络的以图搜图算法实现        如果用这个名称去搜索论文,一定有不少.为什么了,因为从原理上来看,卷积神经网络就非常适合找图片的相似的地方.想想看,许多大牛.小牛.微牛的文章都是说如何从mnist中.从CIFA10中.从CIFA100中去找到相似的图片.那么,反过来想一想,如果那么复杂的数据卷积神经网络都能够去处理,那么对于这种相对来说,比较简单的"以图搜图"的需求,应该更容易来解决.这里的神经网络解决这个问题,还是尝试得到一种较为通用的问题解决方法. 零.数据集的创

《SPARK/TACHYON:基于内存的分布式存储系统》-史鸣飞(英特尔亚太研发有限公司大数据软件部工程师)

史鸣飞:大家好,我是叫史鸣飞,来自英特尔公司,接下来我向大家介绍一下Tachyon.我事先想了解一下大家有没有听说过Tachyon,或者是对Tachyon有没有一些了解?对Spark呢? 首先做一个介绍,我来自英特尔的大数据团队,我们团队主要是致力于各种大数据的软件开发以及这些软件在工业界的推广和应用,我所在的团队主要负责Spark及其软件栈的开发和推广.我们是国内最早参加Spark开发和推广的团队,我们在2012年就加入了Spark社区.在Spark和相关的项目中间投入了大量的人力,长期以来我

【每日算法】图算法(遍历&amp;MST&amp;最短路径&amp;拓扑排序)

图有邻接矩阵和邻接表两种存储方法,邻接矩阵很简单,这里不讨论,下面我们先看看常用的邻接表表示方法. 邻接表常用表示方法 指针表示法 指针表示法一共需要两个结构体: struct ArcNode //定义边表结点 { int adjvex: //邻接点域 ArcNode* next; }; struct VertexNode //定义顶点表结点 { int vertex; ArcNode* firstedge; }; 每个节点对应一个VertexNode,其firstedge指向边表(与当前节点邻

RDD:基于内存的集群计算容错抽象

本文转载:http://shiyanjun.cn/archives/744.html 摘要 本文提出了分布式内存抽象的概念——弹性分布式数据集(RDD,Resilient Distributed Datasets),它具备像MapReduce等数据流模型的容错特性,并且允许开发人员在大型集群上执行基于内存的计算.现有的数据流系统对两种应用的处理并不高效:一是迭代式算法,这在图应用和机器学习领域很常见:二是交互式数据挖掘工具.这两种情况下,将数据保存在内存中能够极大地提高性能.为了有效地实现容错,

大数据技术之_19_Spark学习_05_Spark GraphX 应用解析 + Spark GraphX 概述、解析 + 计算模式 + Pregel API + 图算法参考代码 + PageRank 实例

第1章 Spark GraphX 概述1.1 什么是 Spark GraphX1.2 弹性分布式属性图1.3 运行图计算程序第2章 Spark GraphX 解析2.1 存储模式2.1.1 图存储模式2.1.2 GraphX 存储模式2.2 vertices.edges 以及 triplets2.2.1 vertices2.2.2 edges2.2.3 triplets2.3 图的构建2.3.1 构建图的方法2.3.2 构建图的过程2.4 计算模式2.4.1 BSP 计算模式2.4.2 图操作一

关于图算法 &amp; 图分析的基础知识概览

网址:https://learning.oreilly.com/library/view/graph-algorithms-/9781492060116/ 你肯定没有读过这本书,因为这本书的发布日期是2019年5月.本文会覆盖该书的大部分内容,读完这篇,你能够了解图算法的基本概念.关于此书,作为市面上为数不多的面向数据科学应用的图算法书籍,写的比较全面系统和易懂.当然,书在细节上的提高空间还有很多.今天内容很多,坐稳~ 目录 图算法 & 图分析 图基础知识 连通图与非连通图 未加权图与加权图 有

基于jquery开发的UI框架整理分析

根据调查得知,现在市场中的UI框架差不多40个左右,不知大家都习惯性的用哪个框架,现在市场中有几款UI框架稍微的成熟一些,也是大家比较喜欢的一种UI框架,那应该是jQuery,有部分UI框架都是根据jQuery研发出来的产品,现在也很常见了. 国产jQuery UI框架 (jUI) DWZ DWZ富客户端框架(jQuery RIA framework), 是中国人自己开发的基于jQuery实现的Ajax RIA开源框架.设计目标是简单实用,快速开发,降低ajax开发成本. jQuery 部件布局