Spark项目如何应对小资源大数据的OOM情况

1.什么是小资源大数据的OOM情况?

假设用户driver端的内存为1G,cpu核数指定为1核,在运行程序时加载到内存中的数据量超过了1G,就会导致JVM崩溃抛出 Java heap space 堆内存空间溢出异常或者overhead limit exceededGC回收时间过长的内存异常,一般为这两种,也可能有堆外存溢出,但可能较小。

2.使用内存分析工具进行分析

先将dump文件取出,然后使用eclipse memory analyzer, 基于eclipse RCP的内存分析工具。详细信息参见:http://www.eclipse.org/mat/

3.在程序内哪些情况会导致内存溢出?

1)存在占用内存较大的数据结构如array、list等,当他们的长度过大,比如5000w长度时,如果是int型的数组那么将会占用约200mb的内存,如果是double类型将占用400mb,这可是一个相当庞大的开销。

2)action操作,例如包括但不限于collect(),redcue(),join()等操作,collect()会将rdd或dataset等数据集转化为数组,占用内存大小取决于转化后的数组大小,reduce(),groupbykey()等操作会触发shuffle操作的方法,会将多个分区的数据集中到一个分区中也有可能发生内存溢出,join()操作时系统会将两个rdd的数据都加载都内存进行匹配和比较也会导致内存溢出。

3)缓存的数据例如使用catcah()等操作将数据缓存到了内存中时,如果缓存的数据过大也是对系统不利的,容易导致内存溢出,可以修改缓存级别,选择磁盘,先内存后磁盘,rdd.persist(StorageLevel.DISK_ONLY)、rdd.persist(persist(StorageLevel.MEMORY_AND_DISK_SER)
而不要直接使用catch()缓存到内存中。

4)如果是因为不停的重复某个代码块导致创建了过多的array或者list等属于内存泄漏,可以使用内存分析工具进行排查,此处不做分析。

4.结合我做过的一个异常检测算子小资源大数据问题分析。

其中一个问题是 在这个算子中用到一个算法叫孤立森林算法,需要将全部数据对应分到每棵树的待测数组上,然后生成一个分配好数据的rdd。数据使用的是5000w长度的鸢尾花数据,参数设置为100棵树,也就是这个过程会生成100个5000w长度的int数组,这是一个很可怕的数据量(200mb * 100 = 20G),已经远远超过了1G内存能承载的限度,于是我开始对这块内容进行修改。
具体怎么修改的呢,我就是将中间过程生成的数据改为了RDD,全程使用RDD格式数据,避免用数组加载。
修改过程画成了一张图片,改良了将数据抽样并平均分到各颗树上的过程,原来在这个过程中会生成n个5000w长度的int数组,然后根据索引抽取数据,在大数据量情况必会内存溢出,改为使用zipWithIndex、groupByKey等操作完成了等效数据分组在生成结果RDD的过程中不生成任何数组,有效地降低了在数据分组上出现内存溢出的可能。

  • 原数组分组方式
    \原数组分组方式
  • RDD分组方式
    RDD分组方式
    这样就解决了这块的OOM问题。
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值