首页 理论教育 RDD持久化案例及解析

RDD持久化案例及解析

时间:2023-06-25 理论教育 版权反馈
【摘要】:可以使用persist方法和cache方法将任意RDD缓存到内存或磁盘、Tachyon文件系统中;其中,cache方法是persist方法使用MEMORY_ONLY存储级别的快捷方式。表2.4 Spark提供的存储级别及其具体含义以MEMORY_AND_DISK进行测试,具体步骤如下。图2.27 Driver Program中count方式触发缓存RDD后的Storage界面可以看到缓存的分区数为29,其中一部分缓存在Memory,

RDD持久化案例及解析

可以使用persist方法和cache方法将任意RDD缓存到内存或磁盘、Tachyon文件系统中;其中,cache方法是persist方法使用MEMORY_ONLY存储级别的快捷方式。

RDD对应的缓存是容错的,如果一个RDD分片丢失,可以通过构建它的Transformation自动重构

这一节详细描述了可用的存储级别及其含义,并对使用默认存储级别的cache方法进行详细解析;同时,以MEMORY_AND_DISK存储级别为例,扩展persist方法的应用及不同缓存特点,包括缓存的lazy特性、内存无法缓存时的处理方法等,解析过程中对比了MEMO-RY_ONLY与MEMORY_AND_DISK这两个等级的缓存结果的差异点。

具体操作步骤如下:

一、小文件缓存解析

这里的小文件的是指该文件的数据大小在当前内存中可以全部装载。

1.加载文件,输入命令:

978-7-111-51909-6-Chapter02-95.jpg

2.缓存RDD到内存中,输入命令:

978-7-111-51909-6-Chapter02-96.jpg

查看Web Interface界面(http∶//driverhost∶4040)的Storage部分,真正缓存之前的内存信息界面如图2.20所示。

978-7-111-51909-6-Chapter02-97.jpg

图2.20 Driver Program中缓存RDD之前的Storage界面

可以看到执行cache后,并不会马上进行缓存。

3.用Action操作触发缓存,输入count命令,触发前面的cache的执行。

978-7-111-51909-6-Chapter02-98.jpg

978-7-111-51909-6-Chapter02-99.jpg

查看Web Interface界面(http∶//driverhost∶4040)的Storage部分,触发并缓存之后的内存信息如图2.21所示。

978-7-111-51909-6-Chapter02-100.jpg

图2.21 Driver Program中缓存RDD后的Storage界面

可以看到,全部分区都已经缓存到Memory中。

4.执行unpersist方法,释放缓存。

978-7-111-51909-6-Chapter02-101.jpg

执行过程如下:

978-7-111-51909-6-Chapter02-102.jpg

查看Web Interface界面(http∶//driverhost∶4040)的Storage部分,eager型的unpersist操作后的内存信息如图2.22所示。

978-7-111-51909-6-Chapter02-103.jpg

图2.22 Driver Program中unpersistrdd后的Storage界面

不同于cache的lazy特性,unpersist是个eager操作,执行后,Web Interface界面上显示的内存马上被释放了。二、大文件缓存解析

测试的大数据量的文件缓存到默认存储级别(Memory)。当文件数据量比较小时,全部缓存到了内存中。当大数据量的文件缓存时,在内存不能完全装载的情况下,部分分区数据会被丢弃,可以通过下面步骤进行验证。

1.查看文件大小,文件有918MB,使用du-m目标文件来查看。

978-7-111-51909-6-Chapter02-104.jpg

2.重新加载大数据量的文件,查看RDD分区数。

978-7-111-51909-6-Chapter02-105.jpg

可以看到,bigText.partitions.size返回29,也就是当前分区数为29。

3.使用默认存储级别进行cache。

查看Web Interface界面(http∶//driverhost∶4040)的Storage部分,使用默认存储级别,在真正缓存之前的内存信息如图2.23所示。

978-7-111-51909-6-Chapter02-106.jpg

978-7-111-51909-6-Chapter02-107.jpg(www.xing528.com)

图2.23 Driver Program中缓存rdd前的Storage界面

4.用take的Action操作触发缓存,语句如下所示。

bigText.take(1)

查看Web Interface界面(http∶//driverhost∶4040)的Storage部分,使用默认存储级别,在真正缓存之后的内存信息如图2.24所示。其中driverhost为应用程序启动的节点。

此时,缓存分区数为1、分区总数为29、缺失分区数为28。其中,缺失的分区数在需要使用时会重新计算。

5.用count的Action操作触发缓存,语句如下所示。

978-7-111-51909-6-Chapter02-108.jpg

查看输出日志信息,由于当前文件的大小超过了内存可以装载的最大值,在缓存过程中,我们会在日志中看到内存空间不足的警告日志,警告日志信息会包含“Not enough space to cache rdd_...in memory…”这些内容。即,当可用的缓存空间不足以装载RDD的分区数据时,就会出现该日志信息,对应的,此时RDD可能仅仅缓存了部分的分区,如果指定仅在内存中缓冲的话,其他分区将不会缓存,在下次使用时会重新计算。

查看Web Interface界面(http∶//driverhost∶4040)的Storage部分,内存不足以装载整个RDD时,仅缓存部分分区数据时的内存信息如图2.25所示。

978-7-111-51909-6-Chapter02-109.jpg

图2.24 Driver Program中take方式触发缓存RDD后的Storage界面

978-7-111-51909-6-Chapter02-110.jpg

图2.25 Driver Program中部分缓存RDD后的Storage界面

三、修改存储级别,测试不同等级的处理

Spark提供的存储级别可以参考官方网站中的编程指南部分,具体内容如表2.3所示。

表2.4 Spark提供的存储级别及其具体含义

978-7-111-51909-6-Chapter02-111.jpg

以MEMORY_AND_DISK进行测试,具体步骤如下。

1)首先导入存储级别类:

978-7-111-51909-6-Chapter02-112.jpg

2)以MEMORY_AND_DISK级别缓存RDD,输入命令:

978-7-111-51909-6-Chapter02-113.jpg

3)Action触发缓存,输入命令:

978-7-111-51909-6-Chapter02-114.jpg

查看Web Interface界面(http∶//driverhost∶4040)的Storage部分,在Action触发后真正缓存RDD时的内存信息如图2.26所示。

978-7-111-51909-6-Chapter02-115.jpg

图2.26 Driver Program中take方式触发缓存RDD后的Storage界面

可以看到,当前缓存的分区数为1,其他未缓存的分区在计算时需重新计算。

解析:cache是一个标志性操作,仅在数据真正计算时,才会缓存到内存,因此即使存储级别为MEMORY_AND_DISK,但take操作只需要针对一个分区进行操作,对应的,Stor-age也仅缓存了一个分区。

4)count操作进行Action触发缓存,输入命令:

978-7-111-51909-6-Chapter02-116.jpg

查看Web Interface界面(http∶//driverhost∶4040)的Storage部分,count方式触发RDD缓存时的内存信息如图2.27所示。

978-7-111-51909-6-Chapter02-117.jpg

图2.27 Driver Program中count方式触发缓存RDD后的Storage界面

可以看到缓存的分区数为29,其中一部分缓存在Memory,一部分缓存在Disk,其他未缓存的分区在计算时需重新计算。

解析:与take类似,由于count操作涉及各个分区数据的计算,因此最终会导致全部分区都处理之前的cache标志信息,即,存储在内存和磁盘中。

在RDD Name列下单击具体的RDD Name,可以进入各个分区数据缓存的具体信息,部分分区数据会存储在内存中,内存装载不下的分区数据会缓存到磁盘中。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈