知乎专栏| 2021.04.13
单台机器的运算力和存储是非常有限的,通过几万甚至百万台设备堆叠方式,并使它们能够协同的工作起来,这种系统就是分布式系统(distributed system)。
如果一个大任务,分解成N个任务,分散到N个处理器上去实现指令流在时间或空间并行的运算,就是并行计算(Parallel Computing),注意这N个处理器是属于一台机器的,比如我国的神威太湖之光超级计算机,就有1064万个处理器,IBM的Summit超算就有239.7万个处理器,它们属于一个整体的众核系统。这样的机器上用的系统就叫并行操作系统(COS=concurrent operating system)。(题外话:虽然我国的太湖之光处理器数量是IBM的Summit的4.4倍,但是速度却只有Summit的62.5%,说明我国自研的申威处理器性能上到底还是差人家一大截)
如果把N个独立系统,协同起来各分一部分任务运算,这种就叫分布式计算,分布式计算之后最后还得集中到一起,再汇总各自结果集中计算才有结果。
- 把N个独立系统协同起来工作的系统叫分布式操作系统
- 用于特定的分布式处理的软件就叫分布式软件系统
如果一个大数据,分解成N个小数据放到N台机器上去存储,这就是分布式存储(Distributed Storage System)。
- 用于分布式存储的文件系统就叫分布式文件系统,
- 如果是数据库,那就叫分布式数据库。
换句话说,它们都需要建立在[分布式操作系统+分布式文件系统+网络]的基础之上的。
这样做的优点是显而易见的。
举例说明:
1、在天文探测、高能物理计算、气象数据处理等许多方面,有非常大的运算量需要计算,如果用普通个人PC去计算,要几百年才能算完,如果我们把1000万个处理器并行起来协同工作,把所有计算任务分解成几千万个并行的任务去计算,1秒钟就计算结束了,节约了大量的时间。
分布式操作系统就是负责把这几千万个并行任务,合理地分配到1000万个处理器上去并行运算,完成正确协同计算。
2、存储几十亿人口的数据时,有非常大的数据量要存储,通常是几百EB或ZB甚至几百YB,而单个机器几个PB就很大了,但如果有几万台机器集群,分块分散存储起来,就可以轻松解决这样的问题。
分布式文件系统就是负责把这几万个分块文件透明地管理起来,而你处理的时候就像是处理一个文件一样。
当然了,对于普通个人而言,这些八辈子都用不上。
但是对于一家超大企业、一个国家职能机构来说,那是家常便饭。
对于并行/分布式计算的软件来说,在编写的时候,当然也是有很大区别的,主要注意两点:
1、任务的并行化分解[关键]
2、并行子任务之间无耦合
原则其实就是一句话:化解一切串行,拆分成N个可独立任务,让它们全部分配到空闲到执行单元上去执行。
当然,你不能分解成了2个任务一个任务只需要1秒完成而另外一个任务要100秒完成,这样的并行化分解,并不能极大提高加速比,必须尽可能保持每个子任务执行时间差不多相等,这样才能最大化提高加速比。
对于我们普通开发者来说,接触不到超算那么强大的系统,但是对于集群还是经常要用到的,比如:Hadoop,是Apache基金会所开发的分布式系统基础架构。
用户可以在不了解分布式底层细节的情况下,开发分布式程序。充分利用集群的威力进行高速运算和存储。
Hadoop框架最核心的设计就是两个:HDFS和MapReduce。
1、HDFS:为海量的数据提供了存储
2、MapReduce:为海量的数据提供了计算
也有人说,我就一个普通人,连集群都没有,自己单主机做开发。
其实也是可以借鉴上面的思想去做开发的,因为我们现在的PC也普遍都是4核-32核的,能把这4-32核最大化利用起来,也是很不错的,在我们做开发的时候,也是可以采用并行化/分布式的思想去编写我们的程序,拆解串行任务为并行任务,从而提高加速比的。
