DAG vs. MPP
Native Design
MPP每个Segment高度对称(symmetric),狭义MPP storage各个Segment自己管理,自己备份,涉及某数据相关的query必定会落到某个Segment上,有concurrency和straggler的问题存在。
MPP天然有很优秀的Compiler和Optimizer,包括local runtime环境是数据库,解析、优化、codegen、执行一气呵成。Segment内有良好的二级资源管理和Task调度,足够细粒度且对query敏感(query隔离、内存使用监控等)。
DAG天然share storage,master能感知全局meta,所以才能单点schedule好task sets,并协调Executor之间的上下游数据shuffle、任务起停等过程。DAG每个task从设计上有简单、幂等等性质,可做task speculation的工作,甚至动态替换某个Node、更新其并发度。
DAG容易对不同存储介质的数据做IO,目前场景的是在输入和输出节点,理论上各个计算节点可挂载不同存储执行引擎,只要meta共享。
Task Schedule
MPP竖切,直通通完成Task的构造,每个Segment收到的是较为完整的sub-query。
DAG横切,节点合并(包括Spark的窄依赖和Stage)是优化手段,理论上不同Node的tasks要分散到不同计算进程上。最优的条件下,如Spark 2.0 whole-stage-codegen,是理论上把SQL优化到MPP那样的极致。