java - Spark Java 堆空间
问题描述
我的 spark 有一个问题,当我尝试生成模型时,我遇到了一个我无法解决的 java 堆空间异常。我试图将此值放在 VM 选项 -Xmx4g 上,但没有任何反应。我也尝试将此参数添加到 spark config 但再次没有发生任何事情。Java 版本:7 Spark 版本:2.1.0
SparkConf conf = newSparkConf().setAppName("myAPP").setMaster("local");
conf = (conf.setMaster("local[*]"));
SparkContext sc = new SparkContext(conf);
JavaRDD<LabeledPoint> data = MLUtils.loadLibSVMFile(sc, path).toJavaRDD();
// Split initial RDD into two... [60% training data, 40% testing data].
JavaRDD<LabeledPoint>[] splits =
data.randomSplit(new double[]{0.6, 0.4}, 11L);
JavaRDD<LabeledPoint> training = splits[0].cache();
JavaRDD<LabeledPoint> test = splits[1];
// Run training algorithm to build the model.
final LogisticRegressionModel model = new LogisticRegressionWithLBFGS()
.setNumClasses(2)
.run(training.rdd());
// Clear the prediction threshold so the model will return probabilities
model.clearThreshold();
// Compute raw scores on the test set.
JavaRDD<Tuple2<Object, Object>> predictionAndLabels = test.map(
new Function<LabeledPoint, Tuple2<Object, Object>>() {
@Override
public Tuple2<Object, Object> call(LabeledPoint p) {
Double prediction = model.predict(p.features());
return new Tuple2<Object, Object>(prediction, p.label());
}
}
);
// Get evaluation metrics.
BinaryClassificationMetrics metrics =
new BinaryClassificationMetrics(predictionAndLabels.rdd());
错误
18/05/02 13:06:49 INFO DAGScheduler: Job 1 finished: first at GeneralizedLinearAlgorithm.scala:206, took 0,038806 s
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at org.apache.spark.mllib.linalg.Vectors$.zeros(Vectors.scala:340)
at org.apache.spark.mllib.regression.GeneralizedLinearAlgorithm.run(GeneralizedLinearAlgorithm.scala:222)
at Principal.main(Principal.java:114)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:134)
解决方案
我经常遇到这个问题,我们使用动态资源分配,我认为它会利用我的集群资源来最适合应用程序。
但事实是,动态资源分配不会设置驱动程序内存,而是将其保持为默认值 1g。
我通过将 spark.driver.memory 设置为适合我的驱动程序内存的数字来解决它(对于 32gb ram,我将其设置为 18gb)
您可以使用 spark submit 命令设置它,如下所示:
spark-submit --conf spark.driver.memory=18gb ....cont
非常重要的一点是,根据 spark 文档,如果您从代码中设置它,则不会考虑此属性:
Spark属性主要可以分为两种:一种是和deploy相关的,比如“spark.driver.memory”、“spark.executor.instances”,这种属性在运行时通过SparkConf编程设置可能不受影响,或者行为取决于您选择的集群管理器和部署模式,因此建议通过配置文件或 spark-submit 命令行选项进行设置;另一个主要和Spark运行时控制有关,比如“spark.task.maxFailures”,这种属性可以任意设置。
推荐阅读
- git - 防止 SNAPSHOTS 被合并到 master
- c# - 流架构中的流适配器
- python - 将 python 列表转换为具有相同键但具有不同值的字典
- django - django 从管理面板中选择模板而不重新启动服务器
- json - 如何将 Elastic Search Index 中的所有数据以 JSON 格式导出到指定 _id 字段的文件?
- duplicates - ClickHouse - 将相似条目合并到一个新条目中
- c# - Async 和 await 可能会被省略?
- java - 如何优雅地结束对话?
- sql-server - 扩展事件需要哪些权限?
- windows - Windows 计划任务执行