Я хочу больше узнать о сохраняющейся стратегии хаупа вне искры.
Когда я сохраняю кадр данных со стратегией DISK_ONLY, где хранятся мои данные (путь/папка...)? И где указать это место?
Я хочу больше узнать о сохраняющейся стратегии хаупа вне искры.
Когда я сохраняю кадр данных со стратегией DISK_ONLY, где хранятся мои данные (путь/папка...)? И где указать это место?
Для краткого ответа мы можем просто взглянуть на документацию относительно spark.local.dir
:
Каталог для использования в качестве «временного» пространства в Spark, включая выходные файлы карты и RDD, которые сохраняются на диске. Это должно быть на быстром локальном диске в вашей системе. Это также может быть разделенный запятыми список нескольких каталогов на разных дисках. ПРИМЕЧАНИЕ. В Spark 1.0 и более поздних версиях это будет переопределено переменными среды SPARK_LOCAL_DIRS (Standalone, Mesos) или LOCAL_DIRS (YARN), установленными диспетчером кластера.
Для более глубокого понимания мы можем взглянуть на код: DataFrame
(то есть просто Dataset[Row]
) основан на RDD
и использует те же механизмы сохранения. RDD
s делегирует это 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/
, в противном случае это во многом зависит от вашей среды и конфигурации.
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-стратегии.
Большое спасибо за все ваши полезные советы в этой проблеме!