Где хранятся мои данные sparkDF.persist(DISK_ONLY)?

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

Когда я сохраняю кадр данных со стратегией DISK_ONLY, где хранятся мои данные (путь/папка...)? И где указать это место?


person maffe    schedule 24.01.2018    source источник
comment
Это широкий вопрос/концепция, которую нужно задать в стеке, вы можете перейти по этой ссылке для большего понимания: quora.com/   -  person roh    schedule 24.01.2018
comment
Небольшое изменение: кэш в наборе данных означает сохранение с уровнем = ПАМЯТЬ И ДИСК, поэтому кеш также может записывать на диск   -  person T. Gawęda    schedule 24.01.2018
comment
Спасибо @rob за эту ссылку. Я обновил вопрос до более конкретной версии.   -  person maffe    schedule 25.01.2018


Ответы (2)


Для краткого ответа мы можем просто взглянуть на документацию относительно spark.local.dir:

Каталог для использования в качестве «временного» пространства в Spark, включая выходные файлы карты и RDD, которые сохраняются на диске. Это должно быть на быстром локальном диске в вашей системе. Это также может быть разделенный запятыми список нескольких каталогов на разных дисках. ПРИМЕЧАНИЕ. В Spark 1.0 и более поздних версиях это будет переопределено переменными среды SPARK_LOCAL_DIRS (Standalone, Mesos) или LOCAL_DIRS (YARN), установленными диспетчером кластера.

Для более глубокого понимания мы можем взглянуть на код: DataFrame (то есть просто Dataset[Row]) основан на RDD и использует те же механизмы сохранения. RDDs делегирует это SparkContext, что помечает его как постоянство. Затем задача выполняется несколькими классами в org.apache.spark.storage: во-первых, BlockManager просто управляет блоками сохраняемых данных и политикой того, как это сделать, делегируя фактическое сохранение DiskStore (конечно, при записи на диск), который представляет собой высокоуровневый интерфейс для записи и, в свою очередь, имеет DiskBlockManager для более низкоуровневых операций.

Надеюсь, теперь вы понимаете, где искать, чтобы мы могли двигаться дальше и понять, где на самом деле хранятся данные и как мы можем их даже настроить: DiskBlockManager вызывает помощника Utils.getConfiguredLocalDirs, что для практичность скопирую сюда (взято из связанной версии 2.2.1, последней версии на момент написания):

def getConfiguredLocalDirs(conf: SparkConf): Array[String] = {
    val shuffleServiceEnabled = conf.getBoolean("spark.shuffle.service.enabled", false)
    if (isRunningInYarnContainer(conf)) {
        // If we are in yarn mode, systems can have different disk layouts so we must set it
        // to what Yarn on this system said was available. Note this assumes that Yarn has
        // created the directories already, and that they are secured so that only the
        // user has access to them.
        getYarnLocalDirs(conf).split(",")
    } else if (conf.getenv("SPARK_EXECUTOR_DIRS") != null) {
        conf.getenv("SPARK_EXECUTOR_DIRS").split(File.pathSeparator)
    } else if (conf.getenv("SPARK_LOCAL_DIRS") != null) {
        conf.getenv("SPARK_LOCAL_DIRS").split(",")
    } else if (conf.getenv("MESOS_DIRECTORY") != null && !shuffleServiceEnabled) {
        // Mesos already creates a directory per Mesos task. Spark should use that directory
        // instead so all temporary files are automatically cleaned up when the Mesos task ends.
        // Note that we don't want this if the shuffle service is enabled because we want to
        // continue to serve shuffle files after the executors that wrote them have already exited.
        Array(conf.getenv("MESOS_DIRECTORY"))
    } else {
        if (conf.getenv("MESOS_DIRECTORY") != null && shuffleServiceEnabled) {
        logInfo("MESOS_DIRECTORY available but not using provided Mesos sandbox because " +
            "spark.shuffle.service.enabled is enabled.")
        }
        // In non-Yarn mode (or for the driver in yarn-client mode), we cannot trust the user
        // configuration to point to a secure directory. So create a subdirectory with restricted
        // permissions under each listed directory.
        conf.get("spark.local.dir", System.getProperty("java.io.tmpdir")).split(",")
    }
}

Код, как мне кажется, достаточно понятен и хорошо прокомментирован (и идеально соответствует содержанию документации): при работе на Yarn есть определенная политика, опирающаяся на хранение контейнеров Yarn, в Mesos она либо использует Mesos песочницу (если служба случайного воспроизведения не включена), а во всех остальных случаях он будет перемещаться в расположение, указанное в spark.local.dir или, альтернативно, java.io.tmpdir (что, вероятно, будет /tmp/).

Итак, если вы просто играете, данные, скорее всего, хранятся в /tmp/, в противном случае это во многом зависит от вашей среды и конфигурации.

person stefanobaghino    schedule 24.01.2018
comment
Большое спасибо @stefanobaghino за усилия, которые вы приложили к этому хорошо структурированному и подробному ответу. Следующим шагом для меня будет изучение нашей конфигурации пряжи, загруженной с помощью getYarnLocalDirs(conf).split(,). - person maffe; 25.01.2018
comment
Хороший ответ. Я бы сказал, что DataFrame основан на RDD. На мой взгляд, это не так, и он может просто генерировать родословную RDD, которую выполняет Spark (см. QueryExecution.toRDD< /а>) - person Jacek Laskowski; 25.01.2018
comment
@JacekLaskowski Спасибо, если вы думаете, что это хороший ответ, я уверен, что это так. :) И спасибо за комментарий, я действительно не знал об этом. Я постараюсь отредактировать ответ таким образом, чтобы это было более точно передано. Просто чтобы я не написал ничего неточного, главное остается в силе: фактическое кэширование делегировано RDD, верно? - person stefanobaghino; 25.01.2018

Подводя итог для моей среды YARN:

С руководством @stefanobaghino я смог сделать еще один шаг в коде, где загружается конфигурация пряжи.

val localDirs = Option(conf.getenv("LOCAL_DIRS")).getOrElse("")

который задается параметром yarn.nodemanager.local-dirs в yarn-default.xml.

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

2018-01-23 16:57:35,229 WARN org.apache.hadoop.yarn.server.nodemanager.DirectoryCollection: Directory /data/1/yarn/local error, used space above threshold of 98.5%, removing from list of valid directories

мое искровое задание иногда убивалось, и я хотел бы понять, используется ли этот диск также для моих постоянных данных во время выполнения задания (что на самом деле является огромным объемом).

Вот и получается, что это именно та папка, куда попадают данные при их сохранении с помощью DISK-стратегии.

Большое спасибо за все ваши полезные советы в этой проблеме!

person maffe    schedule 25.01.2018