Spark MLlib机器学习实践(第2版)
上QQ阅读APP看书,第一时间看更新

3.2 RDD工作原理

RDD是一个开创性的数据处理模式,其脱离了单纯的MapReduce的分布设定、整合、处理的模式,而采用了一个新颖的、类似一般数组或集合的处理模式,对存储在分布式存储空间上的数据进行操作。

3.2.1 RDD工作原理图

前面笔者已经说了很多次,RDD可以将其看成一个分布在不同节点中的分布式数据集,并将数据以数据块(Block)的形式存储在各个节点的计算机中,整体布局如图3-2所示。

图3-2 数据块存储方式

从图上可以看到,每个BlockMaster管理着若干个BlockSlave,而每个BlockSlave又管理着若干个BlockNode。当BlockSlave获得了每个Node节点的地址,会又反向BlockMaster注册每个Node的基本信息,这样形成分层管理。

而对于某个节点中存储的数据,如果使用频率较多,则BlockMaster会将其缓存在自己的内存中,这样如果以后需要调用这些数据,则可以直接从BlockMaster中读取。对于不再使用的数据,BlcokMaster会向BlockSlave发送一组命令予以销毁。

3.2.2 RDD的相互依赖

不知道读者在看图3-1的时候有没有注意到,Transformation在生成RDD的时候,生成的是多个RDD,这里的RDD的生成方式并不是一次性生成多个,而是由上一级的RDD依次往下生成,我们将其称为依赖。

RDD依赖生成的方式也不尽相同,在实际工作中,RDD一般由两种方式生成:宽依赖(wide dependency)和窄依赖(narrow dependency),两者区别请参考图3-3所示。

图3-3 宽依赖和窄依赖

RDD作为一个数据集合,可以在数据集之间逐次生成,这种生成关系称为依赖关系。从图3-3可以看到,如果每个RDD的子RDD只有一个父RDD,而同时父RDD也只有一个子RDD时,这种生成关系称之为窄依赖。而多个RDD相互生成,则称之为宽依赖。

宽依赖和窄依赖在实际应用中有着不同的作用。窄依赖便于在单一节点上按次序执行任务,使任务可控。而宽依赖更多的是考虑任务的交互和容错性。这里没有好坏之分,具体选择哪种方式需要根据具体情况处理。