spark ALS 使用checkpoint 机制

  最近在开发协同过滤组件,运用了spark millb上的协同过滤 ALS算法。在测试过程中遇到了内存溢出的错误,查找了错误位置,发现在训练的时候,迭代次数的增加便会出现这个问题,原因可能是迭代是的计算的数据量指数上升。为了解决这个问题,参考了许多技术文档后总结出一些自己的见解。

1)在ALS模型中运用checkpoint机制

spark checkpoint 机制 个人理解就是在程序中插入一个检查点,如果程序出错,重新运行程序便会从这个检查点开始,不需要重头再来,大大加强了程序的效率。

在使用checkpoint前 需要先设置checkpoint和相关参数,再进行训练。相关代码如下

sc.setCheckpointDir("hdfs://master:9000/..")//会在..目录创建一个文件夹 这里的sc 是 sparkContext
ALS.setCheckpointInterval(2).setMaxIter(100).setRank(10).setAlpha(0.1)
val model = ALS.run(ratings)

这样就在ALS 模型中运用了checkpoint 机制。

2)删除checkpoint留下的过程数据

但是这样会有一个弊端,每运行一次训练都会在hdfs上保存训练的过程数据,占用集群存储空间。解决的方法是利用spark操作(删除)hdfs上的文件。

sparkConf.set("spark.hadoop.validateOutputSpecs","false")   //设置你spark的配置
val sc = SparkContext(sparkConf)   	//读取你的saprkconf 到 sparkContext
通过spark自带的hadoopconf方式删除

val path = new Path("hdfs://xxx"); 声明要操作(删除)的hdfs 文件路径
val hadoopConf = sparkContext.hadoopConfiguration
val hdfs = org.apache.hadoop.fs.FileSystem.get(hadoopConf)
if(hdfs.exists(path)){
	//需要递归删除设置true,不需要则设置false
	hdfs.delete(path,true)  //这里因为是过程数据,可以递归删除
	


总结,checkpoint处理spark mllib内存溢出的方法只能治标,不能治本。只是将内存中的数据固化到硬盘上,解决内存不足的问题。虽然解决了内存溢出,但如果数据量大的话估计还会出现一系列类似IO的问题。然而还没有找到更好的解决方法,也就先这样吧。学无止境,估计以后会有大神分享更好的解决方法。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值