原文:Dryad: Distributed Data-Parallel Programs from Sequential Building Blocks
TL;DR
Dryad是一个分布式批处理框架,相比MapReduce,它的特点是:
- 支持多种operator组成的DAG,且支持组合多个DAG。
- DAG中多个顶点可以分配给一个进程。
- 不同顶点间的消息传递不限于文件,还可以通过TCP和in-memory FIFO。
- 支持按网络拓扑插入中间节点做部分聚合。
Dryad属于是底层框架,用户真正用到的还是上面的框架,类似于MapReduce和Sawzall的关系。
架构
Dryad有一个JobManager负责调度,每台机器上有一个daemon负责起进程和监控,还有name server可以查询机器和机器的位置。
Dryad底下也有一个类似于GFS的共享存储,顶点间默认用它来通信,但也可以使用TCP Pipe和in-memory FIFO。
后两种通信方式性能更高,但因为是同步通信,可能有死锁问题,比如接收端顶点未启动。
操纵DAG
Dryad可以处理以下对DAG的修改:
- 增加顶点。
- 组合两个DAG以增加边。
- 合并两个DAG。
执行
Dryad中有逻辑DAG和物理DAG,逻辑DAG里的一个stage可能对应物理DAG的一组顶点,这样来简化监控和处理。
Dryad只负责顶点间纯字节流的通信,具体的序列化和反序列化由应用自己负责。
一台机器可以根据自己的负载能力一次接受多个顶点,这些顶点程序会在一个进程中,通过in-memory FIFO进行通信。这样不需要把不同顶点真的合并在一起,简化了处理,又保证了它们不会跨进程、机器通信,提高了性能。
每个stage对应一个stage manager,它可以在运行期从JM获得各个顶点的运行情况,从而做一些比较复杂的操作,比如冗余运行这个stage中比较慢的节点。
优化
大多数数据中心的网络都是两层结构,机器直连rack的交换机,rack的交换机再连主交换机。Dryad可以根据网络拓扑,在原有的DAG中插入中间层进行部分聚合。
也可以复制更多的中间顶点以提高整体的并行度。