spark ALS 使用checkpoint 机制

来源:互联网 发布:软件开发详细计划书 编辑:程序博客网 时间:2024/04/19 11:42

  最近在开发协同过滤组件,运用了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的问题。然而还没有找到更好的解决方法,也就先这样吧。学无止境,估计以后会有大神分享更好的解决方法。


原创粉丝点击