开源图计算框架GraphLab介绍
GraphLab介绍
GraphLab 是由CMU(卡内基梅隆大学)的Select 实验室在2010 年提出的一个基于图像处理模型的开源图计算框架。框架使用C++语言开发实现。
该框架是面向机器学习(ML)的流处理并行计算框架,可以运行在多处理机的单机系统、集群或是亚马逊的EC2 等多种环境下。框架的设计目标是,像MapReduce一样高度抽象。可以高效运行与机器学习相关的、具有稀疏的计算依赖特性的迭代性算法,并且保证计算过程中数据的高度一致性和高效的并行计算性能。该框架最初是为处理大规模机器学习任务而开发的,可是该框架也相同适用于很多数据挖掘方面的计算任务。在并行图计算领域,该框架在性能上高出非常多其它并行计算框架(比如,MapReduce、Mahout)几个数量级。GraphLab 自成立以来就是一个发展非常迅速的开源项目,其用户涉及的范围也相当广泛,全球有2 000 多个企业、机构使用GraphLab。

GraphLab的长处
GraphLab 作为一个基于图处理的并行计算框架,可以高效地运行机器学习相关的数据依赖性强,迭代型算法。其设计具有例如以下特点和长处。
- 统一的API 接口。
对于多核处理器和分布式环境,採用统一的API 接口,一次编敲代码就可以高效地运行在共享内存环境或者分布式集群上。
- 高性能。优化C++运行引擎,在大量多线程操作和同步I/O 操作之间进行了非常好的平衡。
- 可伸缩性强。GraphLab 可以智能地选择存储和计算的节点,原因是GraphLab 对于数据的存储与计算都使用了精心设计的优良算法。
- 集成HDFS。GraphLab 内置对HDFS 的支持。GraphLab 可以直接从HDFS中读数据或者将计算结果数据直接写入到HDFS 中。
- 功能强大的机器学习类工具集。GraphLab 在自身提供的API 接口之上实现了大量的开箱即用的工具集。
GraphLab在Windows下的安装
GraphLab如今还不支持Windows,临时仅仅能通过VMware Player运行linux的虚拟机,官方给出了已经配置好的GraphLab Create的VM文件。可以免去编译等步骤。
下载GraphLab Create,并依照要求配置安装
- 首先下载GraphLab Create VM文件
- 然后安装VMware Player。导入GraphLab Create VM文件详见文档
- 最后通过ipython查看能否正常导入graphlab库详见文档
GraphLab和MapReduce的对照
一般的机器学习类算法有下面两个特性:
- 数据依赖性非常强。运算过程中參与计算的各个机器之间常常须要交换大量的数据。
- 流处理复杂。主要表如今整个处理过程须要重复地迭代计算,数据处理分支非常多。非常难实现真正的并行。
在GraphLab 出现之前。针对这些机器学习的算法,普遍的编程方法是採用MPI 和PThread 这些已有的底层开发库来完毕这类计算问题。採用这样的编程模型的开发应用,针对详细的应用,须要开发人员实现相应的算法来完毕计算过程中集群计算节点之间主机通信和数据同步等底层操作。这样的开发方法的优势在于,可以针对详细的应用对代码进行深度的优化。以达到非常高的性能。
可是对于不同的应用,须要重写代码实现底层的数据分配、数据通信等细节,这就导致了代码重用率非常低,可拓展性差。对编程人员要求高。这样的编程模型显然不适合当前敏捷的互联网开发。而当前被广泛使用的MapReduce 计算框架,在并行运行多任务的时候,要求各个任务之间相互独立。任务运行期间不须要相互之间进行数据通信。所以MapReduce 不适合数据依赖性强的任务,并且MapReduce 并行计算模型也不能高效表达迭代型算法。
这样的计算模型在处理如日志分析、数据统计等数据独立性的任务时具有明显的优势,可是在机器学习领域。MapReduce框架并不能非常好地满足机器学习计算任务。
GraphLab 的出现不是对MapReduce 算法的替代,相反,GraphLab 借鉴了MapReduce 的思想,将MapReduce 并行计算模型推广到了对数据重叠性、数据依赖性和迭代型算法适用的领域。本质上,GraphLab 填补了高度抽象的MapReduce 并行计算模型和底层消息传递、多线程模型(如MPI 和PThread)之间的空隙。
当前流行的并行计算框架MapReduce 将并行计算过程抽象为两个基本操作。即map 操作和reduce 操作。在map 阶段将作业分为相互独立的任务在集群上进行并行处理。在reduce阶段将map的输出结果进行合并得到终于的输出结果。GraphLab 模拟了MapReduce 中的抽象过程。对MapReduce的map操作,通过称为更新函数(Update Function)的过程进行模拟,更新函数可以读取和改动用户定义的图结构数据集。用户提供的数据图代表了程序在内存中和图的顶点、边相关联的内存状态,更新函数可以递归地触发更新操作。从而使更新操作作用在其它图节点上进行动态的迭代式计算。GraphLab 提供了强大的控制原语,以保证更新函数的运行顺序。GraphLab对MapReduce的reduce操作也通过称为同步操作(Sync Operation)的过程进行模拟。同步操作可以在后台计算任务进行的过程中运行合并(Reductions),和GraphLab 提供的更新函数一样,同步操作可以同一时候并行处理多条记录,这也保证了同步操作可以在大规模独立环境下运行。
GraphLab并行框架
GraphLab将数据抽象成Graph结构,将算法的运行过程抽象成Gather、Apply、Scatter三个步骤。其并行的核心思想是对顶点的切分。
上图演示样例中,须要完毕对V0邻接顶点的求和计算,串行实现中。V0对其全部的邻接点进行遍历。累加求和。而GraphLab中,将顶点V0进行切分,将V0的边关系以及相应的邻接点部署在两台处理器上。各台机器上并行进行部分求和运算。然后通过master顶点和mirror顶点的通信完毕终于的计算。
Graph的构造
顶点是其最小并行粒度和通信粒度。边是机器学习算法中数据依赖性的表现方式。
对于某个顶点,其被部署到多台机器,一台机器作为master顶点,其余机器上作为mirror。Master作为全部mirror的管理者,负责给mirror安排详细计算任务;mirror作为该顶点在各台机器上的代理运行者,与master数据的保持同步。
对于某条边。GraphLab将其唯一部署在某一台机器上,而对边关联的顶点进行多份存储,解了边数据量大的问题。
同一台机器上的全部edge和vertex构成local graph,在每台机器上,存在本地id到全局id的映射表。
vertex是一个进程上全部线程共享的,在并行计算过程中,各个线程分摊进程中全部顶点的gather->apply->scatter操作。
GraphLab的运行模型
每一个顶点每一轮迭代经过gather->apple->scatter三个阶段。
- Gather阶段
工作顶点的边 (可能是全部边。也有可能是入边或者出边)从领接顶点和自身收集数据,记为gather_data_i。各个边的数据graphlab会求和,记为sum_data。这一阶段对工作顶点、边都是仅仅读的。 - Apply阶段
Mirror将gather计算的结果sum_data发送给master顶点,master进行汇总为total。Master利用total和上一步的顶点数据,依照业务需求进行进一步的计算,然后更新master的顶点数据,并同步mirror。
Apply阶段中。工作顶点可改动,边不可改动。
- Scatter阶段
工作顶点更新完毕之后,更新边上的数据,并通知对其有依赖的邻结顶点更新状态。这scatter过程中,工作顶点仅仅读,边上数据可写。
在运行模型中,graphlab通过控制三个阶段的读写权限来达到相互排斥的目的。在gather阶段仅仅读,apply对顶点仅仅写。scatter对边仅仅写。并行计算的同步通过master和mirror来实现,mirror相当于每一个顶点对外的一个接口人。将复杂的数据通信抽象成顶点的行为。
參考资料
p=215">GraphLab:新的面向机器学习的并行框架
GraphLab百度百科
轻松搞定TB级数据。开源GraphLab突破人类图计算“极限值”
GraphLab:将大数据分析从理念运用到生产
转载请注明作者Jason Ding及其出处
GitCafe博客主页(http://jasonding1354.gitcafe.io/)
Github博客主页(http://jasonding1354.github.io/)
CSDN博客(http://blog.csdn.net/jasonding1354)
简书主页(http://www.jianshu.com/users/2bd9b48f6ea8/latest_articles)
百度搜索jasonding1354进入我的博客主页
$(function () {
$('pre.prettyprint code').each(function () {
var lines = $(this).text().split('\n').length;
var $numbering = $('
$(this).addClass('has-numbering').parent().append($numbering);
for (i = 1; i ').text(i));
};
$numbering.fadeIn(1700);
});
});
开源图计算框架GraphLab介绍的更多相关文章
- 腾讯正式开源图计算框架Plato,十亿级节点图计算进入分钟级时代
腾讯开源再次迎来重磅项目,14日,腾讯正式宣布开源高性能图计算框架Plato,这是在短短一周之内,开源的第五个重大项目. 相对于目前全球范围内其它的图计算框架,Plato可满足十亿级节点的超大规模图计 ...
- 开源实体映射框架EmitMapper介绍
开源实体映射框架EmitMapper介绍 综述 EmitMapper是一个开源实体映射框架,地址:http://emitmapper.codeplex.com/. Emit ...
- GraphLab介绍[转]
GraphLab介绍 原文链接:http://blog.jasonding.top/2015/06/08/Machine%20Learning/%E5%BC%80%E6%BA%90%E5%9B%BE% ...
- Spark入门实战系列--9.Spark图计算GraphX介绍及实例
[注]该系列文章以及使用到安装包/测试数据 可以在<倾情大奉送--Spark入门实战系列>获取 .GraphX介绍 1.1 GraphX应用背景 Spark GraphX是一个分布式图处理 ...
- 腾讯开源进入爆发期,Plato助推十亿级节点图计算进入分钟级时代
腾讯开源再次迎来重磅项目,14日,腾讯正式宣布开源高性能图计算框架Plato,这是在短短一周之内,开源的第五个重大项目. 相对于目前全球范围内其它的图计算框架,Plato可满足十亿级节点的超大规模图计 ...
- 明风:分布式图计算的平台Spark GraphX 在淘宝的实践
快刀初试:Spark GraphX在淘宝的实践 作者:明风 (本文由团队中梧苇和我一起撰写,并由团队中的林岳,岩岫,世仪等多人Review,发表于程序员的8月刊,由于篇幅原因,略作删减,本文为完整版) ...
- 图计算 on nLive:Nebula 的图计算实践
本文首发于 Nebula Graph Community 公众号 在 #图计算 on nLive# 直播活动中,来自 Nebula 研发团队的 nebula-plato 维护者郝彤和 nebula-a ...
- Spark(十七)图计算GraphX
一.图概念术语 1.1 基本概念 图是由顶点集合(vertex)及顶点间的关系集合(边edge)组成的一种数据结构. 这里的图并非指代数中的图.图可以对事物以及事物之间的关系建模,图可以用来表示自然发 ...
- GraphX 图计算实践之模式匹配抽取特定子图
本文首发于 Nebula Graph Community 公众号 前言 Nebula Graph 本身提供了高性能的 OLTP 查询可以较好地实现各种实时的查询场景,同时它也提供了基于 Spark G ...
随机推荐
- EasyUI - DataGrid 组建 - [ 新增功能 ]
效果: html代码: <div> <!--使用JS加载方式--> <table id="tab"></table> <!-- ...
- Eclipse用法和技巧十一:分栏显示
在编码的时候,有时候需要同时看到两个文件的代码.或者在代码走读的时候,能同时看到两个文件的代码能加快我们对代码的理解.来看看如何在eclipse中同时显示两个文件的代码. 步骤一:拖住一 ...
- Java内部类——局部内部类
局部内部类,即放在“{块中}”,局部内部类,不能被成员修饰符static修饰,且内部类的成员也不能是static. 内部类中访问局部变量“{块中}”,需要将局部变量声明为final. 可以直接访问外部 ...
- 基于visual Studio2013解决面试题之0608找出两个只出现一次的数
题目
- HDU 3328 Flipper (stack)
最近着手打基础,做做STL的题目,虽然一般STL题目难度不大,但需要加快速度的准确率............................. 本题有N张牌,一开始每个位置一张(正面朝上或者朝下),有 ...
- 火炬之光模型导出(Unity载入火炬之光的模型)
先说明几点.导出方案可行,測试通过. python和blender的版本号一定要用下文中所说的.新的Python或者是新的Blender版本号都无法完美导入. 导入导出脚本能够选择 (http://c ...
- 怎样成为一个游戏制作人——第五章:使用GGE图形库来写游戏
怎样成为一个游戏制作人--第五章:使用GGE图形库来写游戏 前言: 细致想了一下,来看博客的一般都是有自学能力的了.C++基础多少也会有一些了. 于是决定以下的章节.会教大家做一些小游戏. 来巩固自己 ...
- redhat6.3 jfreechar中文乱码解决途径
最近使用到jfreechar的项目,在转移到linux上面时出现中文乱码(中文被显示为框框),网上查了一些资料,结合自身系统的特性,总结了一种安装字体的方式.在说字体安装之前首先上个测试的代码吧:we ...
- ExtJs4 笔记(13) Ext.menu.Menu 菜单、Ext.draw.Component 绘图、Ext.resizer.Resizer 大小变更
本篇讲解菜单.绘图.还有大小变更控件.菜单控件可以附加到各种其他控件中,比如按钮.工具栏等,甚至可以直接通过通过右键打开(模拟右键菜单):ext对绘图的支持可以让我们通过js来绘图:大小变更控件可以让 ...
- PIL Gif分割成多个图片
项目中遇到GIF图片读取问题,使用PIL中Image im=Image.open("D:\\yzm\\0009.gif") mode = 'RGB' im.seek(0) im.c ...