IT 论文精读 · PAPER 22

Pregel — 像顶点一样思考

Malewicz 等 · Google · SIGMOD 2010

EN →

这篇论文干了什么?

2010 年,谷歌一队工程师造了一个叫 Pregel 的系统,专门算「图」——不是图片,是「点和线连成的网」:谁认识谁(社交网络)、哪个网页链到哪个网页(万维网)、哪个城市通向哪个城市(地图)。像谷歌起家的排名算法 PageRank,本质就是在几百亿网页连成的巨图上反复算。Pregel 让你能用一台机器写不下、要几百台机器一起扛的超大图,跑得又对又稳。

先说旧世界的痛

之前谷歌算大数据靠上一代神器 MapReduce:把数据摊成一大堆、整批扫一遍。可图算法不是「扫一遍就完」——它得一轮一轮地反复迭代:这一轮每个点把消息传给邻居,下一轮再根据收到的消息更新自己,来回几十上百轮才收敛。用 MapReduce 硬套,每一轮都要把整张图从硬盘搬进来、算完再全写回硬盘,几百轮下来光搬运就慢到没法看,代码也绕得让人头疼。

新点子:别站在「上帝视角」,站到一个点上去想

Pregel 换了个思路:你不用去操心「整张图怎么并行切分」,只需要写清楚「假如我是图里的一个点,这一轮我该干嘛」。作者管这叫「像顶点一样思考」。每个点要做的事很简单:读一读上一轮邻居发来的消息 → 更新一下自己的值 → 给邻居发点新消息 → 觉得没事干了就「举手示意我睡了」。系统负责把亿万个点这套动作在几百台机器上同时跑起来。

关键的节拍器:大家一轮一轮地齐步走

Pregel 把计算切成一轮轮「超步」,中间卡一道「栅栏」:所有点必须都算完这一轮、把消息都发出去,才一起迈进下一轮——像齐步走,喊一声「一」大家迈一步,谁都不许抢跑。这个整齐的节拍带来两个大好处:一是这一轮发的消息,保证下一轮才被读到,没有「你还没算完我就来看你」的混乱;二是想想都简单,写图算法像写「一个点的心事」,不用管调度和加锁。

怎么让睡着的点停下来

一个点如果这一轮没事干,就「举手睡觉」变成非活跃。之后要是有邻居给它发消息,它会被叫醒再干。等到全场所有点都睡着、而且再没有消息在飞,整个计算就结束了——像一屋子人,事情传完、都安静下来,会议自然散场。

带来了什么

Pregel 成了谷歌跑 PageRank、最短路径、社群发现这类大规模图算法的主力,能稳稳吃下几百台机器、上十亿个点的图。更深远的是它开了个范式:后来开源界照着它做出了 Apache Giraph(脸书拿它算过万亿条边的社交图)、Spark 的 GraphX 等一大票系统,「像顶点一样思考」成了图计算的通用说法。诚实说一句代价:因为大家必须齐步走,每一轮都得等最慢的那台机器——碰上一个连着几百万人的「超级明星」点,那台机器会拖后腿,全场陪它等。

一句话记住

Pregel 让你用「假如我是图里一个点,这一轮该干嘛」的思路,去写能跑在几百台机器、上十亿个点的超大图算法。诀窍是把计算切成一轮轮「超步」、中间用「栅栏」让所有点齐步走:读消息→更新自己→发消息→没事就睡;全睡着且没消息在飞就结束。代价是每轮都得等最慢的那台机器。

想看 BSP 超步与栅栏的确切语义、Combiner / Aggregator、以及靠检查点做容错? → 切到精读版