• 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏吧

了解一点 · 分布式理论(三)· 分开来算就快了

大数据 开发技术 3周前 (05-12) 212次浏览

在上一篇文章我们知道了单机存不下数据的主要原因是文件数量太多,最终也知道了存储分布式化是基于分治思想实现的,解决了单台机器存储能力有限的问题,我们本篇就来聊聊分布式系统要解决的另一个主要问题:单台机器运算能力不足。

这是系列文章的第三篇,阐述分布式系统如何将运算分布式化。在本系列文章开篇中提到,我们提高机器算力的最初方案是将运算并行化:多线程->多进程->多协程,只不过这种并行方案只能作用在单台机器上,对算力的提升有限,在任务量足够大的情况下依然会把单台机器压垮,于是我们就采用分布式系统,将单机的运算负荷转到多机,即运算分布式化,来提高总体算力。

运算分布式化的本质

运算分布式化,就是将运算任务分散到多台机器,共同协作完成运算任务,这个策略不正是“分而治之”嘛,体现的依然是 分治思想 ,所以运算分布式化本质上也是基于分治思想来实现的。

运算任务量大在哪

如同分情况来讨论单机存储数据量大的原因一样,我们可以先分情况讨论运算任务量大的原因:

  1. 运算任务总数量多
  2. 单项运算任务量大

这两种情况都有可能。解决方案也很容易想到:

  1. 当运算任务总数量多时,可以将多个任务分散到各台机器,每台机器负责完成部分任务

2. 当单项运算任务量大时,可以将单项任务拆分为多项子任务分散到各台机器完成,再将多项子任务的结果汇总,就成了单项任务的总结果

将两种解决方案抽象来看就可以发现:应对第一种情况,我们使多台机器执行相同的操作,不同的只是数据;应对第二种情况,我们将任务拆分,让多台机器各自完成单项任务的不同阶段子任务,最后再汇总任务结果。所以这两种方案实际上是 运算逻辑分布式化运算结果分布式化

运算逻辑分布式化

运算逻辑的分布式,即运算逻辑的并行化,将分治思想应用在运算逻辑上,说白了就是使用相同的代码来处理不同的数据,很容易理解:多线程、多进程、多协程和多机运算都是这么实现运算并行化的。

而运算并行化要处理的不同数据,也就基于前述的存储分布式化,不同的机器从不同的数据存储处获取数据,然后分别进行运算。这也是我们在上一篇文章先讨论存储分布式化的原因。

运算结果分布式化

运算逻辑分布式化很好理解,但是运算结果分布式化是个什么东西?

首先要明确一点:一个运算任务的结果只有一个。所以,将运算任务拆分开来算,最后必须要合并所有子任务的结果为最终结果。举个例子: 需求:接收用户输入的1亿个数字并计算总和。

对于这个需求,我们使用单线程也是可以做的,只需要循环接收计算即可,但是在分布式环境且追求性能的前提下,我们必须分而治之,就例子而言,应分两个阶段来做:

  1. 各自计算总任务的一部分之和(拆分)
  2. 对各部分之和进行求和(合并)

这种“先各自为战再会师”的套路在分布式编程中有另一个名字:map和reduce。

MapReduce

“Map(映射)”和”Reduce(归约)”是MapReduce的主要思想,它们是从函数式编程语言里借来的概念和从矢量编程语言里借来的特性。MapReduce是一种编程模型,用于大规模数据集的并行运算。Hadoop(一款主流分布式框架)的分布式计算框架 MapReduce就得名于此,本质上就是先map再reduce这个分治思想的多机版本实现。

MapReduce是一个大主题,可以另开篇章讨论,此处不做赘述。

总结

运算分布式化也是对分支思想的应用,其中包括运算逻辑分布式化和运算结果分布式化。


喜欢 (0)