2016-05-17 2 views
2

Я подаю искр (искра-подать).Автоматически запускает кеширование rdds?

Проблема

я загружаю РДУ, читая Avro файлы с HDFS.
Затем я фильтрую rdd & посчитайте его (задание-1).
Затем я снова фильтрую его, используя другие критерии и подсчитаю его (задание-2).

  • В журналах я вижу, что FileInputFormat читает 60 файлов в первый раз. Но он не читает никаких файлов во второй раз.
  • Также, когда я делаю rdd.toDebugString Я не вижу, как родительский rdd кэшируется.

Подробности

Вот код:

JavaRdd<Record> records = loadAllRecords(); 
JavaRDD<Record> type1Recs = records.filter(selectType1()); 
JavaRDD<Record> type2Recs = records.filter(selectType2()); 
log.info(type1Recs.count()); 
log.info(type2Recs.count()); 

Когда я смотрю на информацию рдд отладки для первого подсчета:

..... 
    ..... 
    | MapPartitionsRDD[2] at filter at xxxx.java:61 [] 
    | NewHadoopRDD[0] at newAPIHadoopRDD at xxxxx.java:64 [] 

Когда я смотрю на Информация об отладке rdd для второго счета:

..... 
    ..... 
    | MapPartitionsRDD[5] at filter at EventRepo.java:61 [] 
    | NewHadoopRDD[0] at newAPIHadoopRDD at xxxxx.java:64 [] 

Если бы я поймать NewHadoopRDD бы некоторые ловли информацию, связанную с ней в строке отладки ...

Однако, я понимаю, что в обоих случаях РДД называют NewHadoopRDD[0]. Что такое [0] В этом контексте означает, что идентификатор? Я думаю, что у RDD есть дескриптор, поэтому я не уверен, что значило бы повторное использование одного и того же дескриптора?

Когда я первый count я вижу в журналах:

FileInputFormat: Total input paths to process : 60 

Но я не вижу подобный журнал для второго счета. Не следует ли загружать records Rdd снова?

Наконец второй отсчет быстрее, чем первый, который заставляет меня верить, что данные находятся в памяти ...

ответ

3

Для этой линии, FileInputFormat: Total input paths to process : 60, он принадлежит к метаданным РДД в. Этот вывод выводится в NewHadoopRDD.getPartitions. Это лениво, но работает только один раз. Вы можете сказать, что метаданные RDD кэшируются. Но данные этого RDD (данные в файлах) не кэшируются.

+0

А интересно! так ведь на самом деле он читает данные снова и снова? – hba

+0

yep, если вы не вызвали RDD.cache вручную. – zsxwing

2

Производится ли автоматическое искровое кэширование?

Иногда, да. RDD автоматически кэшируются в случае перетасовки.

Возможно, вы заметили «пропущенные этапы» в искровом веб-интерфейсе.

См: https://spark.apache.org/docs/1.5.0/programming-guide.html#shuffle-operations

В других случаях вам нужно будет позвонить rdd.cache или его варианты.

+0

Я начинаю видеть эти «пропущенные этапы», и они происходят до того, как я сделаю полное внешнее соединение ... так что на самом деле он автоматически выполняет кеширование ... но я не видел этого в документации, которую вы имели связанный в вашем ответе ... – hba

Смежные вопросы