Вопрос:

Почему Spark работает быстро при подсчете слов?

parallel-processing streaming apache-spark bigdata rdd

1388 просмотра

3 ответа

22260 Репутация автора

Тестовый пример: подсчет слов в данных 6G за 20+ секунд по Spark.

Я понимаю MapReduce , FP и модели потокового программирования, но не мог понять, что подсчет слов настолько быстр, что удивительно.

Я думаю, что в данном случае это интенсивный ввод-вывод, и невозможно сканировать файлы 6G за 20 с лишним секунд. Я предполагаю, что перед подсчетом слов выполняется индекс, как это делает Lucene. Волшебство должно заключаться в дизайне RDD (Resilient Distributed Datasets), который я недостаточно хорошо понимаю.

Я ценю, если кто-нибудь может объяснить RDD для случая подсчета слов. Спасибо!

Автор: 卢声远 Shengyuan Lu Источник Размещён: 04.03.2015 09:35

Ответы (3)


4 плюса

4293 Репутация автора

Решение

Во-первых, время запуска. Для запуска задания Hadoop MapReduce требуется запуск нескольких отдельных JVM, что не быстро. Запуск задания Spark (в существующем кластере Spark) приводит к тому, что существующая JVM разветвляет новые потоки задач, что в разы быстрее, чем запуск JVM

Далее нет индексации и нет магии. Файл 6 ГБ хранится в 47 блоках по 128 МБ каждый. Представьте, что у вас достаточно большой кластер Hadoop, и все эти 47 блоков HDFS находятся на разных жестких дисках JBOD. Каждый из них обеспечивает скорость сканирования 70 МБ / с, что означает, что вы можете прочитать эти данные за ~ 2 секунды. С сетью 10GbE в вашем кластере вы можете передавать все эти данные с одного компьютера на другой всего за 7 секунд.

Наконец, Hadoop несколько раз помещает промежуточные данные на диски. Он выводит данные mapна диск хотя бы один раз (и даже больше, если вывод карты большой и происходит слияние на диске). В следующий раз он помещает данные на диски reduceперед выполнением reduceсамого себя. Spark помещает данные на жесткие диски только один раз в течение shuffleфазы, и эталонная реализация Spark рекомендует увеличить кэш записи файловой системы, чтобы эти «случайные» данные не попадали на диски.

Все это дает Spark значительное повышение производительности по сравнению с Hadoop. В RDD Spark нет магии, связанной с этим вопросом

Автор: 0x0FFF Размещён: 04.03.2015 10:53

0 плюса

125 Репутация автора

Помимо факторов, упомянутых в 0x0FFF, локальное объединение результатов также повышает эффективность подсчета слов при запуске. Spark по умолчанию объединяет результаты на каждом узле перед отправкой результатов на другие узлы.

В случае задания подсчета слов Spark рассчитывает количество для каждого слова в узле, а затем отправляет результаты в другие узлы. Это уменьшает объем данных, передаваемых по сети. Для достижения той же функциональности в Hadoop Map-Reduce необходимо указать класс комбинера.job.setCombinerClass(CustomCombiner.class)

Используя combineByKey()в Spark, вы можете указать пользовательский объединитель.

Автор: Manmohan Размещён: 04.03.2015 08:02

0 плюса

5426 Репутация автора

  • Apache Spark обрабатывает данные в памяти, в то время как Hadoop MapReduce сохраняется обратно на диск после карты или сокращения действия. Но Spark нужно много памяти

  • Spark загружает процесс в память и сохраняет его там до дальнейшего уведомления, для кеширования.

  • Resilient Distributed Dataset (RDD) , который позволяет прозрачно хранить данные в памяти и сохранять их на диске, если это необходимо.

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

  • Вместо обработки пакета хранимых данных, как в случае с MapReduce, Spark может также манипулировать данными в режиме реального времени с помощью Spark Streaming .

  • DataFrames API , был вдохновлен кадров данных в R и Python (панды), но разработан с нуля, чтобы в качестве дополнения к существующей RDD API .

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

  • Использование Spark в RDD упрощает сложные операции, такие как join и groupBy, а в бэкэнде вы имеете дело с фрагментированными данными. Именно эта фрагментация позволяет Spark работать параллельно.

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

Надеюсь это поможет.

Автор: tharindu_DG Размещён: 14.12.2015 11:12
Вопросы из категории :
32x32