我在我的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个观测值。
我尝试在数据上运行两种类型的算法:LinearRegressionWithSGD
或LassoWithSGD
,因为数据稀疏且可能需要正则化。
对于大于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 Descent
到1
可以解决此错误(对于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)