Spark Java Heap Space - PullRequest
       20

Spark Java Heap Space

0 голосов
/ 02 мая 2018

У меня есть одна проблема с искрой, когда я попытался сгенерировать модель, я получил одно исключение с пространством кучи Java, которое я не могу решить. Я пытался поставить эти значения на параметры виртуальной машины -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());

Error

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 голосов
/ 03 января 2019

Я много страдал от этой проблемы, мы используем динамическое распределение ресурсов, и я подумал, что он будет использовать ресурсы моего кластера для наилучшего соответствия приложению.

Но правда в том, что при динамическом распределении ресурсов память драйвера не устанавливается, и она сохраняет значение по умолчанию, равное 1g.

Я решил это, установив spark.driver.memory в число, которое соответствует памяти моего драйвера (для оперативной памяти 32 ГБ я установил его в 18 ГБ)

вы можете установить его, используя команду spark submit:

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

Очень важное замечание, это свойство не будет учитываться, если вы установите его из кода, в соответствии с документацией spark:

Свойства искры в основном можно разделить на два вида: один связан развернуть, как «spark.driver.memory», «spark.executor.instances», этот тип свойств не может быть затронут при настройке программно через SparkConf во время выполнения, или поведение в зависимости от того, какой менеджер кластера и режим развертывания вы выбираете, так что было бы предложено установить через файл конфигурации или спарк-представить параметры командной строки; другая в основном связана со временем выполнения Spark контроль, как «spark.task.maxFailures», этот вид свойств может быть установить в любом случае.

...