大河网,仅需这一篇,吃透「分布式体系」妥妥的,亵

科创中国 admin 2019-04-11 386 次浏览 0个评论
网站分享代码

我的 PhD 研讨方向是散布式体系,我老板也是散布式体系身世,咱们实验室在这方面的堆集还算不错,所以借此问题谈谈自己的观念。首要需求阐明的是,散布式体系是一个杂乱且广泛的研讨范畴,学习一两门在线课程,看一两本书或许都是不能彻底掩盖其所王厚道加盟有内容的。介于这篇文章是引导初学者入门,所以我个人觉得为初学者介绍一下当时散布式体系范畴的全貌,或许比直接引荐论文和课程更有协助。开端学者对这个范畴树立起一个大的 Picture 之后,能够依据自己的爱好,有挑选性地深化不同范畴进行进一步的学习。

本文首要企图答复以下两个问题:

1. 近些羊肉不能和什么一同吃年散布式体系范畴都在做些什么。

2. 为什么现在投入散布式体系的学习和研讨是值得的。

我会尽或许多地去介绍更 “有用” 的散布蚁粒康追风胶囊式体系常识。

什么是有用?例如:

什么不有用? 例如:

当然,散布式体系实在是一个太广泛的论题,自己孤陋寡闻,答复也仅仅可大河网,仅需这一篇,吃透「散布式体系」妥妥的,亵能偏重于我所关怀的范畴和方向,许多当地都不能八面玲珑。所以在此只能抛砖引玉, 走马观花,欢迎咱们提出宝贵意见,我也会及时对文章进行修正和弥补。

散布式体系近些年都在做些什么?

散布式体系是一个陈旧而广泛的论题,而近几年因为 “大数据” 概念的鼓起,又勃发出了新的芳华与生机。除此之外,散布式体系也是一门理论模型与工程技法偏重的学科内容。相较于机器学习这样的研讨方向,学习散布式体系的同学往往会感觉:“入门简略,深化难”。

确实,学习散布式体系简直不需求太多数学常识(比较于机器学习),这也是为什么会形成 “入门简略” 的幻觉。但是一旦深化下去,往往需求咱们去领会 System 研讨的 “简练” 与 “美”,正如李沐的答复中说的那样,体系作业是 “艺术” 而不是 “科学”,这一点我觉得是体系研讨作业最难,一起也是最精华的当地。总归把握一点准则:好的体系研讨作业,尤其是散布式体系研讨,必定是尽或许地用最简略、最直观的办法简靖纹去处理实践的问题(看看 MapReduce 就性感视频知道了),因为简略就意味着有用

整体来说,散布式体系要做的使命便是把多台机器有机地组合、连接起来,让其协同完结一件使命,能够是核算使命,也能够是存储使命。格尔木假如必定要给近些年的散布式体系研讨做一个分类的话,我个人认为大约能够包含三大部分:

1. 散布式存储体系

2. 散布式核算体系

3. 散布式办理体系

近十年来在这三个方向上,毫无疑问, Google 都是开创者,乃至许多业内人士都说,这十年是外界跟随谷歌技能的十年。咱们之前说到,散布式体系的研讨是一门由实践问题驱动的研讨,而 Google 则是最早需求面临这些实践问题的公司。下面咱们别离看看这三个方面工业界以及学术界这几年都在做些什么。

散布式存储体系:

散布式存储体系是一个十分陈旧的论题,一起也是散布式体系里最难,最杂乱,涉及面最广的问题。 往细了分,散布式存储体系大约能够分为四个子方向:

1. 结构化存储

2. 非结构化存储

3. 半结构化存储

4. In-memory 存储

除了这四个子方向之外,散布式存储体系还有一系列的理论、算法小蚂蚁、技能作为支撑:例如 Paxos、CAP、ConsistentHash、Timing(时钟)、2PC、3PC 等等,这些内容咱们会在后边说到。现在,咱们先来看看上述四个子方向大致都在干些什么。

结构化存储(Structured Storage Systems)的前史十分陈旧,典型的场景便是业务处理体系或许联系型数据库(RDBMS)。传统的结构化存储都是从单机做起的,比方咱们耳熟能详的 MySQL。有句话说:MySQL 的成长史便是互联网的成长史。这一点也不为过。除了 MySQL 大河网,仅需这一篇,吃透「散布式体系」妥妥的,亵之外,PostgreSQL 也是近几年来气势十分微弱的一个 RDBMS。咱们发现,传统的结构化存储体系着重的是:(1)结构化的数据(例如联系表);(2)强一致性 (例如,银行体系、电商体系等场景);(3)随机拜访(索引、增删查改、SQL 言语)。但是,正是因为这些性质和束缚,结构化存储体系的可扩展性一般都不是很好,这在必定程度上束缚了结构化存储在大数据环境下的体现。跟着摩尔定律面临的瓶颈,传统的单机联系型数据库体系面临着巨大的应战。不过真的没办法了吗?在此咱们先埋下一个伏笔:)

非结构化存储 (No-structed Storage Systems):和结构化存储不同的是,非结构化存储着重的是高可扩展性,典型的体系便是散布式文件体系。散布式文件体系也是一个陈旧的研评论题,比方 70 时代的 Xerox Alto、80 时代的 NFS、AFS、90 时代 xFS 等等。但是,这些前期的散布式文件体系仅仅起到了网络磁盘的效果,其最大的问题便是不支撑容错 (Fault Tolerance)和过错康复 (Fault Recovery)。而 Google 在 2003 年 SOSP 上推出的 GFS(Google File System)则是做出了里程碑的一步,其开源完结对应为 HDFS。GFS 的首要思维包含:

(1)用 Master 来办理 Metadata。

(2)文件运用 64MB 的 Chunks 来存储,而且在不同的 Server 上保存多个副本。

(3)主动容错,主动过错康复。

Google 规划改脸型圣嘉新在线咨询GFS开端的意图是为了存储海量的日志文件以及网页等文本信息,而且对其进行批量处理(例如合作 MapReduce 为文档树立倒排索引,核算网页 PageRank 等)。和结构化存储体系比较,尽管散布式文件体系的可扩展性、吞吐率都十分好,但是简直无法支撑随机拜访(Random Access)操作,一般只能进行文件进行追加(Append)操作。而这样的束缚使得非结构化存储体系很难面临那些低延时,实时性较强的运用。

半结构化存储 (Semi-structure Storage Systems)的提出便是为了处理非结构化存储体系随机拜访功用差的问题。咱们一般会听到一些盛行的名词,比方 NoSQL、Key-Value Store, 乃至包含目标存储,例如 Protobuf、Thrift 等等。这些都归于半结构化存储研讨的范畴,其间以 NoSQL 近几年的发展气势尤为微弱。NoSQL 体系既有散布式文件体系所具有的可扩展性,又有结构化存储体系的随机拜访才能(例如随机 Update、Read 操作),体系在规划时一般挑选简略键值(K-V)进行存储,扔掉了传统 RDBMS 里杂乱 SQL 查询以及 ACID 业务。这样做能够交换体系最大极限的可扩展性和灵敏性。在 NoSQL 里比较有名体系包含:Google 的 Bigtable、Amazon 的 Dynamo,以及开源氨加黄敏胶囊界大名鼎鼎的 HBase、Cassandra 等。一般这些 NoSQL 体系底层都是根据比较老练的存储引擎,比方 Bigtable 便是根据 LevelDB(Jeff dean 写的,十分好的 C++ 源码教程),底层数据结构选用 LSM-Tree,除了 LSM-Tre发绀e 之外 B-Tree (B+Tree)也是很老练的存储引擎数据结构。

In-memory 存储:跟着业务的并发越来越高,存储体系对低推迟的要求也越来越高。 一起因为摩尔定律以及内存的价格不断下降,根据内存的存储体系也开端遍及。In-mem豆角焖面ory 存储望文生义便是将数据存储在内存中, 然后取得读写的高功用。比较有名的体系包含医治伤风只需一分钟 Memcahed ,以及 Redis。 这些根据 K-V 键值体系的首要意图是为根据磁盘的存储体系做 Cache。还有一些倾向于内存核算的体系,比方能够追溯到普林斯顿 Kai Lee 教授前期的研讨作业 Distributed Shared Memory ( DSM ),斯坦福的 RamCloud,以及最近比较火的根据 Lineage 技能的 Tachyon(Alluxio)项目(Spark 生态体系子项目)等等。

NewSQL:咱们在介绍结构化存储时说到,单机 RDBMS 体系在可扩展性上面临着巨大的应战,但是 NoSQL 不能很好地支撑联系模型。那是不是有一种体系能兼备 RDBMS 的特性(例如:完好的 SQL 支撑,ACID 业务支撑),又能像 NoSQL 体系那样具有强壮的可扩展才能呢? 2012 年 Google 在 OSDI 上宣布的 Spanner,以及 2013 年在 SIGMOD 宣布的 F1,让业界第一次看到了联系模型和 NoSQL 在超大规划数据中心上交融的或许性。不过因为这些体系都太过于黑科技了,没有大公司支撑应该是做不出来的。比方 Spanner 里用了原子钟这样的黑科技来处理时钟同步问题,打破光速传输的束缚。在这儿只能对 Google 表明崇拜。

咱们在之前说到,散布式存储体系有一系列的理论、算法、技能作为支撑:例如 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。

以上是我关于散布式存储体系内容的一些总结,引荐一些相关的论文 ,有爱好的读者能够看看:

聊完了散布式存储体系,让咱们来聊聊散布式核算体系 :) 首要处理一个许多初学散布式核算ticket的同学的疑问:散布式核算和并行核算是一回事吗?开端我也有大河网,仅需这一篇,吃透「散布式体系」妥妥的,亵这样的疑问,而现在我的了解是这样的:

换句话说二者的动身点从一开端就不同,一个着重 High Performance, 一个着重 Scalability。举例来说,MapReduce 给业界带来的真实考虑是什么?其实是给咱们遍及了 Google 这样等级的公司对真实意义上的「大数据」的了解。因为在 04 年论文出来之前,搞并行核算的人压根连 「容错」的概念都没有。换句话说,散布式核算最为中心的部分便是「容错」,没有容错,散布式核算底子无从谈起。MapReduce 统要做成这个尼坤毒打昌珉的相片姿态(Map + Reduce),其实便是为了容错。

但是许多初学散布式核算的同学对容错的概念多多少少是有误解的。包含我在初学 MapReduce 的时分也会考虑:好好的核算怎样就会犯错了呢?一方面,因为硬件的老化,有或许会导致某台存储设备没有发动起来,某台机器的网卡坏了,乃至于核算运转进程中断电了,这些都是有或许的。但是最频频发作的过错是核算进程被杀掉。因为 Google 的运转环境是共有集群,任何一个权限更高的进程都或许 Kill 掉你的核算进程。设想在一个具有几千台机器的集群中运转,一个进程都不被 Kill 掉的概率简直为零。具体的容错机制咱们会在后边介绍具体的体系时说到。

另一个有意思的论题是,跟着机器学习技能的鼓起,越来越多的散布式核算体系是为了机器学习这样的运用规划的,这也是我比较重视的研讨范畴,也会在后边要点谈到。

好像散布式存储体系相同,我对散布式核算体系也做了一个分类,如下:

1. 传统根据 MSG 的体系

2. MapReduce-like 体系

3. 图核算体系

4. 根据状况(State)的体系

5. Streaming 体系

当然不同的人或许会有不同的分类办法,不过迥然不同。咱们接下来聊聊这些体系都在干些什么。

传统根据MSG的体系:这类体系里比较有代表性的便是 MPI (Message Passing Interface)。现在比较盛行的两个 MPI 完结是 MPICH2 和 OpenMPI。MPI 这个结构十分灵敏,对程序的结构简直没有太多束缚,以至于大周芷兰家有时把 MPI 称为一组接口 API, 而不是体系结构。在这些 API 里最常用的两个便是 send 和 recv 接口(还有一系列非堵塞扩展接口,例如:Isend、Irecv 等)。MPI 除了供给音讯传递接口之外,其结构还完结了资源办理和分配,以及调度的功用。除此之外,MPI 在高功用核算里也被广泛运用,一般能够和 Infiniband 这样的高速网络无缝结合。

除了 send 和 recv 接口之外,MPI 中另一个接口也值得注意,那便是 AllReduce。这个接口在许多陈潭山机器学习体系开发里都很用。因为许多并行机器学习体系都是各个进程别离练习模型,然后在适宜的时分(例如一轮迭代完毕)咱们同步一下答案,到达一致,然后持续迭代。这个 “到达一致” 的操作往往能够很方便地经过 AllReduce 来完结。 AllReduce 接口具有两个长处:高效和运用简略。 先说说为什么运用简略:运用 AllReduce 一般只需求在单机中心源码里参加 AllReduce 一行代码,就能完结并行化的功用。说 AllReduce 高效的原因是因为其底层音讯传递运用了 Tree Aggregation,尽或许地将核算分摊到每一个节点。

但是,已然 AllReduce 这么好,为什么在实践大规划核算中很少看到呢?原因很简略,便是因为 MPI 不支撑容错,所以很难扩展到大规划集群之上。不过最近陈天奇写了一个支撑大河网,仅需这一篇,吃透「散布式体系」妥妥的,亵容错的 AllReduce 接口,叫 Rabit,有爱好的同学能够重视一下。 大名鼎鼎的 XGBoost 底层的散布式接口便是 Rabit。

MapReduce-like 体系:这一类体系又叫作 Dataflow 体系,其间以 MapReduce(Hadoop)和 Spark 为代表。其实在学术界有许多相似的体系例如 Dryad、FlumeJava、Twister 等等。这一类体系的特色大河网,仅需这一篇,吃透「散布式体系」妥妥的,亵是将核算笼统成为 High-Level Operator,例如像 Map、Reduce、Filter 这样的函数式算子,然后将算子组合成 DAG ,然后由后端的调度引擎进行并行化调度。其间,MapReduce 体系归于比较简略的 DAG,只要 Map 和 Reduce 两层节点。MapReduce 这样的体系之所以能够扩展到超大规划的集群上运转,便是因为其齐备的容错机制。在 Hadoop 社区还有许多根据 MapReduce 结构的衍生产品,比方 Hive(并行数据库 OLAP)、Pig(交互式数据操作)等等。

MapReduce-like 的编程风格和 MPI 截然相反。MapReduce对程序的结构有严厉的束缚——核算进程有必要能在两个函数中描绘:Map 和 Reduce;输入和输出数据都有必要是一个一个的 Records;使命之间不能通讯,整个核算进程中仅有的通讯机会是 Map P思南第宅hase 和 Reduce Phase 之间的 Shuffuling Phase,这是在结构操控下的,而不是运用代码操控的。因为有了严厉的操控,体系结构在任何时分犯错都能够从上一个状况康复。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 架构。它经过选用散布式的 Mem五服c大河网,仅需这一篇,吃透「散布式体系」妥妥的,亵ached 作为寄存参数的存储,这样就供给了有用的机制效果于不同Worker节点同步模型参数。Google 的 Jeff Dean 在 2012 年进一步提出了第一代 Google Brain 大规划神经网络的处理方案 Distbelief。后来 CMU 的 Eric xing 以及百度少帅李沐都提出了更通用的 Parameter server 架构。

假如要深化 Parameter Server 体系的规划,需求一些机器学习的布景,比方什么是 SSP 协议, 在此咱们就不具体评论了。

Streaming 体系:Streaming 体系听姓名就能看出来是为流式数据供给效劳的。其间比较有名的体系包含 Storm、Spark Streaming、Flink 等等。因为自己对这个范畴并不是很熟,就不具体介绍了。

以上是我对散布式核算体系的一些介绍,其实每一个方向深化下去都是一个研讨范畴,在此引荐一些论文:

从构建散布式秒杀体系聊聊散布式锁

支撑百万并发的数据库架构怎样规划?

SpringBoot开发事例从0到1构建散布式秒杀体系

来历/知乎

作者/马超

声明:本文仅代表作者个人观念,版权归作者一切

点在看

开发 PC 技能
声明:该文观念仅代表作者自己,搜狐号系信息发布渠道,搜狐仅供给信息存储空间效劳。