Spark - Запись в csv приводит к _temporary file [duplicate]

Это очень распространенная проблема, с которой мы сталкиваемся, борясь с «таинствами» JavaScript.

Давайте начнем с простой функции JavaScript:

function foo(){
// do something 
 return 'wohoo';
}

let bar = foo(); // bar is 'wohoo' here

Это простой синхронный вызов функции (где каждая строка кода выполняется одна за другой в последовательность), и результат будет таким же, как ожидалось.

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

function foo(){
 setTimeout( ()=>{
   return 'wohoo';
  }, 1000 )
}

let bar = foo() // bar is undefined here

Итак, вы идете, эта задержка просто сломала функциональность, которую мы ожидали! Но что именно произошло? Ну, на самом деле это довольно логично, если вы посмотрите на код. функция foo() после выполнения ничего не возвращает (таким образом, возвращаемое значение равно undefined), но оно запускает таймер, который выполняет функцию после 1s, чтобы вернуть «wohoo». Но, как вы можете видеть, значение, присвоенное бару, является немедленно возвращенным материалом из foo (), а не что-либо еще, что приходит позже.

Итак, как мы решаем эту проблему?

Давайте попросим нашу функцию для ОБЕЩАНИЯ. Обещание действительно о том, что это означает: это означает, что функция гарантирует, что вы предоставите любой результат, который он получит в будущем. поэтому давайте посмотрим на это в нашей маленькой проблеме выше:

function foo(){
   return new Promise( (resolve, reject) => { // I want foo() to PROMISE me something
    setTimeout ( function(){ 
      // promise is RESOLVED , when exececution reaches this line of code
       resolve('wohoo')// After 1 second, RESOLVE the promise with value 'wohoo'
    }, 1000 )
  })
}

let bar ; 
foo().then( res => {
 bar = res;
 console.log(bar) // will print 'wohoo'
});

Таким образом, резюме - для решения асинхронных функций, таких как вызовы на основе ajax и т. д., вы можете использовать обещание resolve значение (которое вы намерены вернуть). Таким образом, короче говоря, вы разрешаете значение вместо возврата в асинхронных функциях.

24
задан zeodtr 7 May 2015 в 08:03
поделиться

6 ответов

Я не думаю, что очистка поддерживается для всех сценариев. Я бы посоветовал написать простой планировщик окон для очистки ночью.

0
ответ дан ayan guha 1 September 2018 в 07:31
поделиться

Вам нужно вызвать close () в контексте искры, который вы создали в конце программы.

0
ответ дан David Wong 1 September 2018 в 07:31
поделиться

для spark.local.dir, он будет перемещать только искровые временные файлы, но файл snappy-xxx все еще будет существовать в каталоге / tmp. Хотя он и не нашел способ искры автоматически очистить его, но вы можете установить опцию JAVA:

JVM_EXTRA_OPTS=" -Dorg.xerial.snappy.tempdir=~/some-other-tmp-dir"

, чтобы заставить его перемещаться в другой каталог, так как большая часть системы имеет небольшой размер / tmp.

0
ответ дан flyhighzy 1 September 2018 в 07:31
поделиться

Я не знаю, как заставить Spark очистить эти временные каталоги, но я смог предотвратить создание файлов snappy-XXX. Это можно сделать двумя способами:

  1. Отключить сжатие. Свойства: spark.broadcast.compress, spark.shuffle.compress, spark.shuffle.spill.compress. См. http://spark.apache.org/docs/1.3.1/configuration.html#compression-and-serialization
  2. Используйте LZF в качестве кодека сжатия. Spark использует собственные библиотеки для Snappy и lz4. И из-за того, как JNI работает, Spark должен распаковать эти библиотеки перед их использованием. LZF, по-видимому, реализуется изначально на Java.

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

1
ответ дан nsantos 1 September 2018 в 07:31
поделиться

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

Вы можете изменить путь к папке temp для Spark по свойству spark.local.dir.

SparkConf conf = new SparkConf().setMaster("local")
                                .setAppName("test")
                                .set("spark.local.dir", "/tmp/spark-temp");

После завершения теста я удалю папку /tmp/spark-temp вручную.

14
ответ дан vanekjar 1 September 2018 в 07:31
поделиться

Существует три SPARK_WORKER_OPTS для поддержки очистки папки рабочего приложения, для дальнейшей ссылки : from Spark Doc

  • spark.worker.cleanup.enabled, значением по умолчанию является false, Включить периодическую очистку рабочих / прикладных каталогов. Обратите внимание, что это влияет только на автономный режим, так как YARN работает по-разному. Исправлены только каталоги остановленных приложений.
  • spark.worker.cleanup.interval, по умолчанию - 1800, т. Е. 30 минут, контролирует интервал в секундах, в течение которого рабочий очищает старые рабочие документы приложения на локальной машине .
  • spark.worker.cleanup.appDataTtl, по умолчанию 7 * 24 * 3600 (7 дней), количество секунд для сохранения рабочих каталогов приложений для каждого рабочего. Это время для жизни и должно зависеть от объема доступного дискового пространства. Журналы приложений и банки загружаются в каждый каталог работы приложения. Со временем рабочие ряды могут быстро заполнить дисковое пространство, особенно если вы выполняете задания очень часто.
21
ответ дан Yijie Shen 1 September 2018 в 07:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: