–Outline
- 图计算系统
- GraphLab
- PowerGraph
- 数据流系统storm
–内容
1.GraphLab
- 单机系统
- 共享内存
- 多个线程都可以访问图数据
- 线程之间不用发送和接收消息
- 异步计算
- 不分超步,允许不同顶点有不同的更新速度
- 适合支持机器学习算法,在不同部分收敛速度不同
- 数据模型
- Data Graph G=(V, E),其中每个顶点和每条边可以有对应的数据
- 全局数据表(SDT,shared data table):SDT[key]–>value,可以定义全局可见的数据。
- 顶点计算
-
D
S
c
o
p
e
v
=
u
p
d
a
t
e
(
D
S
c
o
p
e
v
;
S
D
T
)
D_{Scope_{v}}=update(D_{Scopev};SDT)
DScopev=update(DScopev;SDT)
- update类似Pregel compute,是应用程序。
- s c o p e v scope_{v} scopev是顶点运算涉及的范围(include顶点v,v的邻边,v的相邻顶点)
- 运算是直接访问内存进行的
- update直接修改顶点和边上的数据,修改立即可见
- 共享内存出现问题?
- 数据竞争data race
- 避免数据竞争:提出三种一致性模型;要求应用程序选择其中一种;系统根据一致性模型,避免数据竞争,并发执行;
- 三种一致性模型
1. Full consistency
应用程序update需要访问整个 s c o p e v scope_{v} scopev
系统保证在update执行过程中,没有任何其他函数会访问 s c o p e v scope_{v} scopev
对应用程序最宽松
2. Edge consistency
应用程序update不写邻居顶点的数据,但可能读邻居顶点的数据(可以写v,v的邻边;可以读整个 s c o p e v scope_{v} scopev)
系统保证在update过程中,没有任何其他函数会访问v及其邻边
3. Vertex consistency
update只读写本顶点的数据,和读v邻边的数据
系统保证update执行过程中,没有任何其他函数会访问v本身
-
D
S
c
o
p
e
v
=
u
p
d
a
t
e
(
D
S
c
o
p
e
v
;
S
D
T
)
D_{Scope_{v}}=update(D_{Scopev};SDT)
DScopev=update(DScopev;SDT)
- 系统按照什么顺序调用update程序
- Sync计算:除update外的一种全局计算
- Sync类似在所有顶点上计算一个aggregate
- 程序员提供fold和apply函数,给定一个初始值和一个key
- Sync类似在所有顶点上计算一个aggregate
t = initial_value;
for each v in V{
t = fold(v,t);
}
SDT[key] = apply(t);
- GraphLab小结
- 以顶点为中心的计算
- 异步计算
- 可立即看到完成的计算结果
- 采用一种全局的aggregate机制帮助判断是否收敛
2.PowerGraph
- 大量自然图符合Power-law
- Power-law Distributions(幂律分布)是一种常见的数学模型,如二八原则:20%的人口拥有80%的财富,20%的上市公司创造80%的价值,80%的收入来自20%的商品等。
- Power-law引起的问题
- 图划分之间有大量的跨边
- Pregel需要传输大量的消息
- 把单一的compute()分成三个用户函数GAS来实现
- gather, apply, scatter
- gather:局部和–>全局和
- apply:在主顶点更新pagerank
- scatter:从主顶点拷贝pagerank更新数据,本地计算发送给邻居的信息内容,然后发送消息
- gather, apply, scatter
- PowerGraph小结
- 分布式图计算
- 针对Power-law图
- 提出GAS模型
2.数据流系统Storm
- 概念
- 数据流过系统
- 在流动的数据上进行处理
- 内部实现:java 和 clojure混合实现
- 大部分代码是Clojure写的,提供的编程接口主要为java
- 大部分代码是Clojure写的,提供的编程接口主要为java
- storm程序概念
- 计算形成一个有向无环图DAG
- DAG用一个Topology数据结构表示
- 每个job有一个topology
- 对应于数据流处理运算关系的一张图
- topology中的每个顶点代表一个运算
- Spout:产生数据流;Bolt:对数据流进行某种运算
- topology中两个顶点间的边代表数据流动的关系
- 计算形成一个有向无环图DAG
- 每个Supervisor运行多个线程
- 每个线程只会负责一个Spout/Bolt
- 一个Spout/Bolt可以对应多个Supervisor和多个线程