大数据技术原理与应用学习笔记(十三)

本系列历史文章

大数据技术原理与应用学习笔记(一)
大数据技术原理与应用学习笔记(二)
大数据技术原理与应用学习笔记(三)
大数据技术原理与应用学习笔记(四)
大数据技术原理与应用学习笔记(五)
大数据技术原理与应用学习笔记(六)
大数据技术原理与应用学习笔记(七)
大数据技术原理与应用学习笔记(八)
大数据技术原理与应用学习笔记(九)
大数据技术原理与应用学习笔记(十)
大数据技术原理与应用学习笔记(十一)
大数据技术原理与应用学习笔记(十二)

图计算

图计算简介

图计算——专门针对图结构数据处理

  • 许多大数据都是以大规模图或网格的形式呈现
  • 许多非图结构大数据也常被转换为图模型后进行分析
  • 图数据很好地表达了数据间的关联性
  • 关联性计算是大数据的计算核心

传统图计算存在问题

  • 常表现出比较差的内存访问局部性
  • 针对单个顶点的处理工作过少
  • 计算过程中伴随着并行度改变

解决方案

  • 为特定的图应用定制相应的分布式实现
  • 基于现有分布式计算平台进行图计算
  • 使用单机图算法库(BGL、LEAD、NetWorkX、JDSL等)
  • 使用已有并行计算图算法库(Parallel BGL)

通用图计算软件

通用图计算软件可分为两种:

  • 基于遍历算法。实时的图数据库(Neo4j、OrientDB、DEX等)
  • 以图顶点为中心,基于消息传递批处理并行引擎(Hama、Giraph、Pregel等)

其中第二种是基于BSP模型实现。BSP为整体同步并行计算模型(大同步)
一个BSP模型→大量通过网络互联的处理器
一次超步包括:

  • 局部计算
  • 通讯
  • 栅栏同步

Pregel简介

后Hadoop时代新“三驾马车”:Caffeine、Dremel和Pregel

图计算模型

有向图和顶点

以有向图为Pregel计算模型输入

  • 每顶点有一个Stage类型顶点ID
  • 每个顶点有一个可修改的用户自定义值与之关联
  • 每条有向边都和其源顶点关联,并记录其目标ID
  • 边上有一个可修改值与其关联

计算过程

在超步S中(其前一个超步称为S-1,后一个称S+1):

  • 读取S-1超步中其获取的信息
  • 实际处理
  • 将处理完消息依有向边发出
  • 当其不易执行操作时,在S+1时设为非活跃节点

补充:非活跃节点再次获得消息后,Pregel框架必须根据条件判断是否将其唤醒。

过程示例

一个求最大值的Pregel计算过程图如下所示:
在这里插入图片描述

Pregel C++ API

Pregel已经预先定义好一个基类——Vertex类:

template <typename VertexValue, typename EdgeValue, typename MessageValue>
class Vertex {
  public:
	virtual void Compute(MessageIterator* msgs) = 0;//由用户自定义
	const string& vertex_id() const;//Strin类型ID
	int64 superstep() const;//当前超步数
	const VertexValue& GetValue();//当前顶点关联值
	VertexValue* MutableValue();//修改当前顶点关联值
	OutEdgeIterator GetOutEdgeIterator();//获取出射边的迭代器
	void SendMessageTo(const string& dest_vertex,	const MessageValue& message);//发送消息
	void VoteToHalt();//停机(设为非活跃)
    };

消息传递机制和Combiner

Combiner

Pregel计算框架在消息发出去之前,Combiner可以将发往同一个顶点的多个整型值进行求和得到一个值,只需向外发送这个“求和结果”,从而实现了由多个消息合并成一个消息,大大减少了传输和缓存的开销。
示例如下;
在这里插入图片描述

Aggregator

Aggregator提供了一种全局通信、监控和数据查看的机制。
在一个超步中,每个顶点都可向Aggregator提供一个数据,Pregel框架会对这些值进行聚合操作产生一个值,下一个超步中,所有顶点都可看见该值。

拓扑改变
  • 全局:采用了惰性协调机制
  • 局部:不会引发冲突,很大程度上简化了分布式编程。
Input/Output
  • 在Pregel计算框架中,图的保存格式多种多样,包括文本文件、关系数据库或键值数据库等
  • 在Pregel中,“从输入文件生成得到图结构”和“执行图计算”这两个过程是分离的,从而不会限制输入文件的格式
  • 对于输出,Pregel也采用了灵活的方式,可以以多种方式进行输出

Pregel体系结构

Pregel执行过程与容错性

将大型图切分成多个分区,hash(ID) mod N

过程:

  • 选择集群中多台机器,一台Master(管家),其他Worker
  • 图分区,一个Worker会分配到一到多个分区,每个Worker知道其他Worker分配到的分区情况
  • Master会把用户输入划分称多个部分,若一个Worker加载到的刚好是自己分区中的顶点,则立即更新数据结构
  • 否则,该Worker会根据ID,将其发送到其所属的分区的Worker上。当所有Input加载完,图中所有顶点标记为活跃
  • Master向每个Worker发送指令,Worker收到指令后,开始运行一个超步。当一个超步中所有工作完成后,Worker会通知Master,并把自己在下一个超步还处于活跃状态的顶点数量报告给Master
  • 计算结束后,Master会给所有Worker发送指令,通知每个Worker对自己的计算结果进行持久化存储。

容错性:

  • Pregel采用检查点机制来实现容错。在每个超步的开始,Master会通知所有的Worker把自己管辖的分区的状态(包括顶点值、边值以及接收到的消息),写入到持久化存储设备
  • Master会周期性地向每个Worker发送ping消息,Worker收到ping消息后会给Master发送反馈消息。如果Master在指定时间间隔内没有收到某个Worker的反馈消息,就会把该Worker标记为“失效”。同样地,如果一个Worker在指定的时间间隔内没有收到来自Master的ping消息,该Worker也会停止工作
  • 每个Worker上都保存了一个或多个分区的状态信息,当一个Worker发生故障时,它所负责维护的分区的当前状态信息就会丢失。Master监测到一个Worker发生故障“失效”后,会把失效Worker所分配到的分区,重新分配到其他处于正常工作状态的Worker集合上,然后,所有这些分区会从最近的某超步S开始时写出的检查点中,重新加载状态信息

Worker、Master和Aggregator

Worker(一般执行过程中保存在内存)
  • 顶点当前值
  • 出射边列表
  • 消息队列
  • 标志位

Worker会对自己分区中每个顶点遍历,调用其compute()。compute()需要3个参数,分别是顶点当前值,接收消息迭代器,出射边迭代器。
同时保存两份“标志位”和“输入消息队列”,用于S和S+1超步。

当Worker发送消息时:

  • 目标在本地机器:直接放入目标顶点输入队列中
  • 目标在远程机器:暂时缓存到本地,当数目到达一个阈值时,批量异步发送出去,传输在目标顶点Worker上。
Master

向所有处于有效状态的Worker发送相同指令,然后等待Worker回应,在指定时间内没回应,则说明该Worker已经失效,Master进入恢复模式。

Aggregator

某超步S中,每个Worker利用每个Aggregator对当前本地分区包含所有顶点的值进行规约,得到了一个本地局部规约值。

  • S结束时,所有Worker将其汇总,得到全局值提交Master
  • S+1开始时,Master将该全局值发送给每个Worker
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值