学习分布式需要那几点知识

291 阅读10分钟

分布式分类大致可分为三个部分:

分布式存储(最复杂最难涉及面最广)

分布式存储大致可分为四个方向,当然这里面还涉及到很多分布式理论和算法,例如维持一致性的Paxios,分布式CAP理论等

  • 结构化存储

典型的场景就是事务处理系统(OLTP && OLAP)或者关系型数据库(RDBMS)传统的结构化存储系统强调的是:

(对于数据处理我们这里区分OLTP(联机事务处理)和OLAP(联机分析处理),TP是联机或者在线主要面对应用,AP主要面对数据挖掘,是数据仓库的组成部分,是支持决策的)

(1)结构化的数据(例如关系表)

(2)强一致性 (例如,银行系统,电商系统等场景)

(3)随机访问(索引,增删查改,SQL 语言)。

然而,正是由于这些性质和限制,结构化存储系统的可扩展性通常都不是很好,这在一定程度上限制了结构化存储在大数据环境下的表现

  • 非结构化存储

和结构化存储不同的是,非结构化存储强调的是高可扩展性,典型的实现就是分布式文件系统(GFS,HDFS等),虽然分布式文件系统扩展性和吞吐率都很好,但是不支持随机访问,通常支持之追加操作,这就注定无法面对实时性低延迟的操作

比如最近经常出现的NoSQL,Key-Value Store等(例如protobuf,thrift),甚至包括对象存储。其中对于NoSQL发展较为强劲,最出名的例如BigTable,Dynamo,Hbase,Cassandra等,即具有分布式文件存储的高扩展性,也具有随机访问能力(update,read),系统设计通常采用Key-value结构,抛弃结构化的事务和ACID特性(这里注意不是所有都这样,例如Redis具有事务处理)

  • 半结构化存储(Semi-structured)

多指文档数据库,这里勘误一下,对于K-V存储,是非结构化存储,半结构化典型是MongoDB和各类XML数据库

半结构化存储的出现就是为了解决非结构化存储随机访问性能差的问题,

这里需要注意底层存储结构,我们都知道Mysql底层存储是B+,BigTable底层是基于LevelDB做的(很好的C++教程),底层存储是LSM-Tree
这在DDAI书里面也有提及,也是存储里面的重点地方
  • In-Memory存储

随着内存价格下降,内存数据库也比较火了,就是将数据存储在内存里面,例如MongoDB,Redis,memcache等,还有一些偏于内存计算的系统例如DSM(分布式共享存储,DDAI也有提及)

在存储领域也有很多理论和算法,例如 Paxos, CAP, Consistent Hash, Timing (时钟), 2PC, 3PC ,一定要深入理解上下文环境对技术选型,就是一定要去思考为什么在当下环境需要某项技术,如果没有这个技术用其它技术替代是否可行,而不是一味的陷入大量的细节之中。例如:如何掌握好 Paxos? Paxos本质上来说是一个三阶段提交,更 high level 讲是一个分布式锁。理解paxos必须一步一步从最简单的场景出发,比如从最简单的 master-backup 出发,发现不行,衍生出多数派读写,发现还是不行,再到 paxos. 之后再了解其变种,比如 fast paxos, multi-paxos. 同理为什么需要 Consistent Hash, 我们可以先思考如果用简单range partition 划分数据有什么问题。再比如学习 2pc, 3pc 这样的技术时,可以想想他们和paxos 有什么关系,能否替代 paxos

分布式计算

分布式计算一定要区分并行计算

出发点不同:分布式计算是增加更多的机器,处理更大的数据,而并行计算是数据不变,提高计算速度
分布式计算的核心点就是容错能力,没有容错分布式计算无从谈起,然而更多的出错时进程被Kill,而不简单是数据问题,例如MAPREDUCE就是为了提高容错能力而设计,所以**容错机制也是一个重要部分**
随着机器学习的兴起,很多分布式计算系统都是为机器学习设计的,其实也是你入门机器学习一个重要渠道,推荐《分布式机器学习》

大致分类如下:

  • Msg系统

具有代表性的就是MPI(目前比较流行的两个 MPI 实现是 mpich2 和 openmpi ),很多时候我们都把他当作一组API使用,而不是一个系统,MPI比较常用的是send和recv(还有非阻塞扩展接口lsend lrecv),除了消息传递以外,还有提供资源管理和分配的接口,MPI在高性能计算中也常被使用,常常与Infiniband等高速网络无缝衔接。

MPI还有一个接口常用例如Allreduce接口,这个接口在机器学习系统开发常用,因为很多并行系统里面,不同进程分别训练模型,然后在底层做一个达成共识,这个达成共识操作很多都是直接通过AllReduce操作完成的

MPI不支持容错是最大缺点,很多系统没有用这个也是这个问题,但是这个问题最近被解决了,有一个Rabit提供了容错机制,xgboot底层分布式接口就是用的rabit

MPI和MapReduce不对立,有用MPI实现的MapReduce库,比如美国能源部Sandia实验室的系统。显然的,可以用MPI的rank 0 processor做单点master,协调别的各个processor完成实际map和reduce。rank 0以外的关闭了,和mapreduce里关闭一个slave没有区别。而这样用mpi实现的map reduce里,显然的,slave关闭了以后rank 0的那家伙虽然和关掉的那个通讯过,但rank 0不需要重试

  • MapReduce-like系统

这类系统也被称作dataflow系统,其中以MapReduce(Hadoop)和Spark为代表(当然也不止这几种框架,很多实现例如Flume java,Dryad,Twister等),这类计算是将计算抽象为一组highlevel oprater ,例如像Map reduce filter这几种函数式算子,然后将算子组合成DAG,由后端调度系统进行并行化调度,MapReduce属于比较简单的DAG,只要两个节点(map reduce),MapReduce因为有其完备的容错机制受到追捧,Mapreduce社区也有很多衍生产品例如Hive(OLAP)和Pig(交互式数据操作)

MapReduce和MPI编程风格区分很大,对程序结构有严格约束,计算过程只能在两个函数中约束(map reduce),输入和输出数据也只能是一个records,任务之间无法通信,唯一通信阶段是map phase 和 reduce phase的shuffing阶段,而且不是由程序控制的,因为严格约束,所以系统能从上一个节点恢复,Spark的RDD采用的是lineage,让数据从内存中转换。

由于良好的扩展性,很多机器学习都并行跑在这些框架上,例如Mahout(基于Hadoop)和MLI(基于Spark),这些系统都很大缺点

1: 这些系统所能支持的机器学习模型通常都不是很大。导致这个问题的主要原因是这系统在 push back 机器学习模型时都是粗粒度的把整个模型进行回传,导致了网络通信的瓶颈。有些机器学习的模型可以大到无法想象,比如我们用 Field-aware factorization machine (FFM)做 criteo 的 ctr prediction 时模型大小可以达到100 GB.

2:严格的 BSP 同步计算使得集群的效率变的很低。也就是说系统很容易受到straggle的影响

  • 图计算系统

图计算系统是分布式计算里另一个分支,这些系统都是把计算过程抽象成图,然后在不同节点分布式执行,例如 PageRank 这样的任务,很适合用图计算系统来表示。最早成名的图计算系统当属 Google 的 pregel,该系统采用 BSP 模型,计算以 vectex 为中心。随后又有一系列图计算框架推出,例如:GPS (对 Pregel 做了优化,除了vectex-centric computation,还有 global computation,动态调整分区等等。)Giraph / Hama 都是基于 Hadoop 的 Apache 的开源 BSP 图计算项目。

除了同步(BSP)图计算系统之外,异步图计算系统里的佼佼者当属 GraphLab,该系统提出了 GAS 的编程模型。目前这个项目已经该名为 dato.,专门推广基于图的大规模机器学习系统

  • 基于状态(state)的系统

这一类系统主要包括 2010 年 OSDI 上推出的 Piccolo, 以及后来 2012 年 nips 上 Google 推出的 distbelief,再到后来被机器系学习领域广泛应用的 Parameter Server 架构。这里我们重点介绍一下 Parameter Server 这个架构。

我们之前说,MPI 由于不支持容错所以很难扩展至大规模集群之中;MapReduce 系统无法支持大模型机器学习应用,并且节点同步效率较低。用图抽象来做机器学习任务,很多问题都不能很好的求解,比如深度学习中的多层结构。而 Parameter Server 这种 state-centric 模型则把机器学习的模型存储参数上升为主要组件,并且采用异步机制提升处理能力。参数服务器的概念最早来自于 Alex Smola 于 2010 年提出的并行 LDA 架构。它通过采用分布式的 memcached 作为存放参数的存储,这样就提供了有效的机制作用于不同worker节点同步模型参数。 Google 的 jeff dean 在 2012 年进一步提出了第一代 Google Brain 大规模神经网络的解决方案 Distbelief. 在后来的 CMU 的 Eric xing 以及百度少帅 李沐 都提出了更通用的 Parameter server 架构。

如果要深入 Parameter server 系统的设计,需要一些机器学习的背景,比如什么是 ssp 协议, 在此我们就不详细讨论了。

  • Streaming系统

Storm Flink等,这些没有怎么过于研究,等有时间再来整理

分布式管理

这一块研究不是很多

阿里分布式图谱(学习路径)

分布式是一个很大的概念,无论从存储还是计算都有很大的技术难度,从架构设计、研发流程、运维部署、工程效率等多个角度均有很深的知识可以挖掘,学习成本和难度相对较大。

avatar

学习资源

目前最好的学习资源自然是读论文或者看书,但是论文来说的话,过于细节,对于初学者来说很容易陷入到细节里面,看书目前分布式有关的好书比较少,目前读过比价好的有:

  • 数据密集型应用系统设计
  • 从Zookeeper到Paxios
  • 分布式机器学习 --周志华 重点推荐

这里也有个网站,个人觉得不错,概念都比较清晰,目前在上学习

PinCap University

参考资料