分布式计算( Distributed computing )是一种把需要进行大量计算的工程数据分割成小块,由多台计算机分别计算,在上传运算结果后,将结果统一合并得出数据结论的科学。”
讲到分布式计算,大多数人第一时间想到的,就是“Hadoop”,它的诞生就是为了解决海量数据的计算问题。Hadoop以谷歌三大论文为蓝本,Google FS、MapReduce、BigTable,这三篇论文奠定了大数据算法的基础。但这些论文毕竟是2003年就发表了,当时也只能应对离线数据的处理,因此后来衍生出了一些其他的方式,比如流失计算、流水线模式,以应对技术发展的需要,为实时计算、机器学习提供了更强有力的保障。
如果问起MapReduce、Spark、Tensorflow的区别,很多人会认为这是属于不同领域的引擎,但它们都有共同的一部分,即“分布式计算”。也就是说,这三个框架,都是定义了一种计算数据的方法,通过这种方法,来设计它的分布式计算能力,并解决一些特定的问题。
接下来我们就分别讲一下,这三种引擎对应的三种设计思想。
批处理:分而治之的思想
MapReduce的代表思想是“分而治之”,如何理解?其实很简单,根据名字就可以看出来,分而治之就是将一个复杂的大问题,拆解成规模较小的子问题,然后通过对子问题的求解,来合并成对大问题的求解。
第一个阶段称为Map阶段,负责将大的任务拆分为多个并行的子任务,相较于原始任务而言,子任务所执行的内容与父任务是相同的,但子任务的数据规模及需要计算的数据量都会小很多。第二个阶段称之为Reduce阶段,将各个拆分子任务的结果进行汇总,并得到最终的计算结果。整个过程如下图所示:
1.png
MapReduce的调优是一个复杂的过程,是一种长期积累的经验总结。主要包括以下四个部分:
1.硬件调优:内存、磁盘io以及网络等;
2.参数调优:缓冲区、磁盘读写、增加JVM内存、增加运行个数等;
3.代码调优:编写Combiner、重新设计Key、合并小文件、数据压缩等;
4.作业调优:合理规划运行依赖、调整作业优先级等。
流处理:实时计算的基础
MapReduce虽然对于大任务的处理有很高的效率,但也有自身的瓶颈,即任务的启动和停止需要耗费大量的资源,而且时间很长,因此处理实时任务“心有余而力不足”。实时任务通常是针对“数据流”进行处理,需要常驻的进行,数据到了之后,即时进行处理。在分布式领域,我们把这种方式称之为“流处理”,英文是Stream,如最近比较火的直播电商,就需要实时处理直播产生的流数据。
目前流式计算框架相对成熟,以Flink、Spark Streaming、Storm为代表的开源组件也被广泛应用。流式数据处理,简单来讲,就是系统每产生一条数据,都会被立刻采集并发送到流式任务中心进行处理,不需要额外的定时调度来执行任务。
通常来讲,流式计算与离线计算的区别在于以下四点:
1.数据像水流一样,持续的进行计算;
2.数据的规模通常很大,至少TB级以上;
3.对实时性的要求高,但旧数据的重要性会持续下降;
4.数据到达的顺序无法保证,因此需要窗口计算。
以Flink为例,流式数据处理过程如下图所示:
流水线:机器学习的助手
批处理和流式计算,能够解决绝大多数的业务场景,即便是复杂的业务场景,应用“流批一体”的技术,也能够设计出较好的方案。但有一种模式还是例外的,那就是“流水线”模式,这种模式通常与制造业相关。
例如生产一瓶饮料,首先需要在瓶子里灌装饮料,然后需要瓶盖封口,再包上相应的包装纸。这种向工厂一样的作业,即上一个任务结束后,再开始下一个任务,这种模式我们称之为“流水线”模式。
这种模式最早应用于CPU的设计,后来推广到机器学习等领域,广泛应用于模型训练之中,典型的框架就是Tensorflow,示意图如下:
TensorFlow的ETL流程如下:
提取(Extract):通过多种途径读取数据,比如内存、本地的 HDD 或 SSD、远程的 HDFS、GCS 等。数据的种类也有很多,比如图像数据、文本数据、视频数据等;
转换(Transform):使用 CPU 处理器对输入的数据进行解析以及预处理操作,包括混合重排(shuffling)、批处理(batching), 以及一些特定的转换。比如图像解压缩和扩充、文本矢量化、视频时序采样等;
加载(Load):将转换后的数据加载到执行机器学习模型的加速器设备上,比如 GPU 或 TPU。
流水线模式对于一些加速模型训练还是很重要的,如果你的CPU处理数据能力跟不上GPU的处理速度,此时CPU预处理数据就成为了训练模型的瓶颈环节。
综上,分布式计算技术,相较于分布式的其他领域,理解起来比较容易,实际应用也非常广泛,因此勤加学习,相信您很快可以掌握其中的精髓。
本文作者:CIO之家的朋友 来源:简书
CIO之家 www.ciozj.com 微信公众号:imciow