Сбой простого искрового зажигания из-за предела накладных расходов ГХ

Я создал автономный кластер Spark (2.1.1) на своих локальных машинах с 9 ядрами / 80 ГБ на каждой машине (всего 27 ядер / 240 ГБ оперативной памяти)

У меня есть образец искровой работы, который суммирует все числа от 1 до x, это код:

package com.example

import org.apache.spark.sql.SparkSession

object ExampleMain {

    def main(args: Array[String]): Unit = {
      val spark = SparkSession.builder
          .master("spark://192.168.1.2:7077")
          .config("spark.driver.maxResultSize" ,"3g")
          .appName("ExampleApp")
          .getOrCreate()
      val sc = spark.SparkContext
      val rdd = sc.parallelize(Lisst.range(1, 1000))
      val sum = rdd.reduce((a,b) => a+b)
      println(sum)
      done
    }

    def done = {
      println("\n\n")
      println("-------- DONE --------")
    }
}

При запуске приведенного выше кода я получаю результаты через несколько секунд, поэтому я запустил код, чтобы суммировать все числа от 1 до 1B (1000000000), и затем я получаю предел накладных расходов GC.

Я читал, что искра должна пролить память на жесткий диск, если памяти недостаточно. Я пытался поиграть с конфигурацией кластера, но это не помогло.

Driver memory = 6G
Number of workers = 24
Cores per worker = 1
Memory per worker = 10

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

По запросу @philantrovert я добавляю свою команду spark-submit

/opt/spark-2.1.1/bin/spark-submit \
--class "com.example.ExampleMain" \
--master spark://192.168.1.2:6066 \
--deploy-mode cluster \
/mnt/spark-share/example_2.11-1.0.jar

Кроме того, мои spark / conf следующие:

  • файл slaves содержит 3 IP-адреса моих узлов (включая главный)
  • spark-defaults contain:
    • spark.master spark://192.168.1.2:7077
    • spark.driver.memory 10g
  • spark-env.sh contain:
    • SPARK_LOCAL_DIRS= shared folder among all nodes
    • SPARK_EXECUTOR_MEMORY = 10 ГБ
    • SPARK_DRIVER_MEMORY = 10 ГБ
    • SPARK_WORKER_CORES = 1
    • SPARK_WORKER_MEMORY = 10 ГБ
    • SPARK_WORKER_INSTANCES = 8
    • SPARK_WORKER_DIR = общая папка среди всех узлов
    • SPARK_WORKER_OPTS = "- Dspark.worker.cleanup.enabled = true"

Спасибо


person Y. Eliash    schedule 28.11.2017    source источник
comment
Можете ли вы добавить свою spark-submit команду к вопросу?   -  person philantrovert    schedule 28.11.2017
comment
@philantrovert добавил конфигурацию spark-submit + my spark   -  person Y. Eliash    schedule 28.11.2017
comment
попробуйте добавить --conf "spark.driver.maxResultSize=3G" в вашу искру-отправку вместо вашей программы. Я не работал с кластерами Spark Standalone, но думаю, что драйвер запустится до того, как сможет выполнить conf.set(..) в вашей программе. Я могу быть не прав.   -  person philantrovert    schedule 28.11.2017
comment
вы пробовали создать свой rdd, используя val rdd = spark.range(1000000000L).rdd? Я думаю, что создание списка scala с 1 миллиардом записей является проблемой здесь ...   -  person Raphael Roth    schedule 28.11.2017
comment
@philantrovert - конфигурирование не помогло, и задание завершилось неудачно через 21 минуту   -  person Y. Eliash    schedule 28.11.2017
comment
@RaphaelRoth - ваше решение сработало! работа завершилась за несколько секунд с результатом - большое спасибо!   -  person Y. Eliash    schedule 28.11.2017
comment
@ Y.Eliash, тогда прими мой ответ   -  person Raphael Roth    schedule 29.11.2017


Ответы (1)


Я полагаю, проблема в том, что вы создаете List с 1 миллиардом записей в драйвере, что представляет собой огромную структуру данных (4 ГБ). Существует более эффективный способ программного создания набора данных / RDD:

val rdd = spark.range(1000000000L).rdd
person Raphael Roth    schedule 28.11.2017