zoukankan      html  css  js  c++  java
  • 基于mapreducer的图算法

    作者现就职阿里巴巴集团1688技术部

    引言

    周末看到一篇不错的文章“Graph Twiddling in a MapReduce world” ,介绍MapReduce下一些图算法的实现。文章语言质朴。介绍非常多有用图优化技巧。

    文章2009年发表,至今已经被引用183次。足以证明这篇文章价值。眼下这篇文章网上已经有人对这篇文章做了介绍,但仅介绍了当中最简单的两个算法,对当中的所做优化,并没有做分析。

    为了加深对文章算法的理解,我又一次对这篇文章的算法做了整理,同一时候加了自己的理解,以及算法在我们工作可能涉及的应用场景。鉴于“一图胜千言”的想法,我添加大量图片,以及实际样例演化算法流程,以增强对算法的理解。

    介绍

    MapReduce框架很适合处理大规模的流数据,而图算法的实现一直是MapReduce的难点。

    已发表这方面的文章也不是特别多。依据“Graph Twiddling in a MapReduce world”,本文具体介绍了 四个图算法的实现。各自是图节点度计算三元环检測四元环检測k-桁结构(k-trusses)检測


    图节点度计算

    度是图节点最主要的特征。在hadoop中求节点度的方法比較简单。以图1为例,须要求当中各个节点的度。


    图1
    Hadoop算法实现很easy,例如以下图2所演示
    图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算法流程例如以下
    图3
    检測三元环算法包括两个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
    如图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

    图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结构检測的问题。


    screenshot
    从上面定义能够发现事实上寻找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检測:
    screenshot

    • 1) 计算节点度,检測三元环;
    • 2) step 3, step 4 为一个MapReduce过程,演示示意图例如以下图6。

       图6

    • 3) Reducer过程中去掉了一些边。那么回到step1,又一次对剩下的边做三元环检測,看剩下的边是否满足支撑条件。例如以下图所看到的,这时我们发现剩下的边组成例如以下的图,由此我们推理出trusses检測算法的主要流程,最后满足支撑条件的边都能构成4-trusses。
    图6trusses2

    參考资料
    Graph Twiddling in a MapReduce world
  • 相关阅读:
    luogu P1833 樱花 看成混合背包
    luogu P1077 摆花 基础记数dp
    luogu P1095 守望者的逃离 经典dp
    Even Subset Sum Problem CodeForces
    Maximum White Subtree CodeForces
    Sleeping Schedule CodeForces
    Bombs CodeForces
    病毒侵袭持续中 HDU
    病毒侵袭 HDU
    Educational Codeforces Round 35 (Rated for Div. 2)
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/5266106.html
Copyright © 2011-2022 走看看