LinearRegressionWithSGD不会收敛超过11Mb的文件

时间:2016-05-13 08:02:15

标签: apache-spark machine-learning apache-spark-mllib spark-dataframe

我在我的Ubuntu 14.04上使用Spark 1.6.1和scala 2.11.7,并为我的项目设置了以下内存设置:JAVA_OPTS="-Xmx8G -Xms2G"

我的数据以20个类似json的文件组织,每个文件大约8-15 Mb,包含分类和数值。我解析这些数据,传递DataFrame工具,然后缩放一个数字特征并为分类特征创建虚拟变量。

到目前为止,在我的json-like文件的最初14个键中,我在最终的LabeledPoint中获得了大约200-240个功能。最终数据稀疏,每个文件包含大约20000-30000个观测值。

我尝试在数据上运行两种类型的算法:LinearRegressionWithSGDLassoWithSGD,因为数据稀疏且可能需要正则化。

对于大于11MB的数据,LinearRegressionWithSGD失败并出现以下错误:

  

org.apache.spark.SparkException:由于阶段失败而中止作业:阶段346.0中的任务58失败1次,最近失败:阶段346.0中丢失任务58.0(TID 18140,localhost):ExecutorLostFailure(执行程序驱动程序退出导致其中一个正在运行的任务)原因:Executor心跳在179307 ms之后超时。

我遇到了与11Mb文件相同的问题(对于5MB算法的文件运行良好),并且在尝试了很多调试选项(测试driver.memory& executors.memory的不同选项后,确保缓存是正确清除,正确使用coalesce()),我发现设置StepSize Gradientt Descent1可以解决此错误(对于5MB文件 - 大小StepSize = 0.4没有错误并且提供更好的结果。)

所以我尝试将StepSize扩展为12MB的文件大小(将StepSize设置为1.5和2)但它没有工作。如果我只使用10 Mb的文件而不是整个文件,算法不会失败。

由于我需要在整个文件上构建模型,这看起来非常尴尬,这似乎与大数据格式相差甚远。

如果我无法在12 Mb上运行线性回归,我可以在更大的设备上运行吗?我注意到,在预处理步骤中使用StandardScaler并依赖线性回归步骤时,会执行collect()方法,这可能会导致错误。所以缩放线性回归的可能性受到质疑,因为据我所知,collect()对驱动程序执行,因此缩放计算的结果会丢失。

设置以下参数:

val algorithme = new LinearRegressionWithSGD() //LassoWithSGD()
algorithme.setIntercept(true)
algorithme.optimizer
  .setNumIterations(100)
  .setStepSize(1)

0 个答案:

没有答案