2016-02-07 2 views
0

настойчивости Шага 1.Scala. Нагрузка от Монго против нагрузки от

загружает данные из Монго в РДУ таким образом:

  1. var buff = new ListBuffer[item]
  2. Заливка любитель через чтение из Монго
  3. data1 = sc.makeRDD(buff).setName(name).persist(MEMORY_ONLY)

Все работает.

Шаг 2.

Я сохранить эти данные в ПЕРСИСТЕНТНОСТЬ файл (папку):

data1.saveAsObjectFile(fileName) 

В дальнейшем я могу прочитать данные из файла, а не из Монго

data2 = sc.objectFile(fileName).persist(MEMORY_ONLY).setName(name) 

Everyhing является за работой.

ВОПРОС.

Почему data1 является 8 (восемь !!!) раз медленнее, чем data2 ???

Например,

  *data1.count() - 9.5 sec* 

     *data2.count() - 1.2 sec* 

памяти достаточно.

Любые идеи приветствуются.

+0

это общая плохая практика, чтобы использовать 'var' вместо' val' , Что касается вашего вопроса, пытались ли вы использовать «HDFS» вместо локального каталога? –

+0

Спасибо. Я знаю эту плохую практику, но это дело. –

+0

Что касается вопроса. Я не пытался использовать Hadoop HDFS, потому что RDD из локального каталога работает отлично. Я хочу ускорить RDD от Mongo. –

ответ

1

Вы не обеспечивают reproducible example и там не хватает подробностей о конфигурации, чтобы дать вам окончательный ответ, но, скорее всего, все, что может быть сведена к простой разнице в исполнении:

  • sc.makeRDD должен :

    • выборки данных в Driver для создания buff
    • сериализации элементов в buff и передать Респ ective рабочие
    • размера находки каждого раздела и уменьшить частичные результаты
  • sc.objectFile должен:

    • считывание данных для каждого раздела
    • размера находки каждого раздела и уменьшить частичные результаты

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

Как вы можете видеть, это делает makeRDD/parallelize значительно менее эффективным и передает данные через Driver, что может стать узким местом. Эти методы полезны в основном для тестирования, распараллеливания небольших коллекций поддержки или объектов, похожих на диапазон, чтобы не обрабатывать тяжеловесные данные.

Есть два наименее MongoDB разъемы там, которые могут быть использованы вместо:

+0

Спасибо за совет. Я попытаюсь переработать код в соответствии с вашими советами и сообщить о результатах позже. –

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