Spark Java堆空间

时间:2018-05-02 13:34:40

标签: java apache-spark heap space

我有一个spark的问题,当我尝试生成模型时,我得到了一个我无法解决的Java堆空间异常。 我试图将这些值放在VM选项-Xmx4g上,但没有任何反应。 我试图将这些参数添加到spark配置但是再没有任何事情发生。 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)

1 个答案:

答案 0 :(得分:1)

这个问题让我非常痛苦,我们使用动态资源分配,我认为它将利用我的群集资源来最适合该应用程序。

但是事实是,动态资源分配不会设置驱动程序内存,而是将其保留为默认值1g。

我已通过将spark.driver.memory设置为适合我的驱动程序内存的数字(对于32gb的内存,我将其设置为18gb)来解决了该问题

您可以使用spark提交命令进行设置,如下所示:

spark-submit --conf spark.driver.memory=18gb ....cont

非常重要的一点是,根据spark文档,如果您通过代码进行设置,则不会考虑该属性:

  

火花属性主要可以分为两种:一种是相关的   进行部署,例如“ spark.driver.memory”,“ spark.executor.instances”,   设置时,此类属性可能不会受到影响   在运行时通过SparkConf以编程方式进行操作,否则行为为   取决于您选择的集群管理器和部署模式,因此   建议通过配置文件或spark-submit进行设置   命令行选项;另一个主要与Spark运行时有关   控件,例如“ spark.task.maxFailures”,这种属性可以是   设置任何一种方式。