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

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

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

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

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


person 卢声远 Shengyuan Lu    schedule 04.03.2015    source источник
comment
Сколько компьютеров вы использовали?   -  person member555    schedule 30.08.2015


Ответы (3)


Во-первых, время запуска. Запуск задания 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. В Spark RDD нет никакой магии, связанной с этим вопросом.

person 0x0FFF    schedule 04.03.2015
comment
Вы имеете в виду, что есть 47 потоков для обработки файлов? Если это так, компьютер имеет 8-ядерный ЦП, невозможно одновременно запустить 47 потоков на 8-ядерном ЦП, верно? - person 卢声远 Shengyuan Lu; 06.03.2015
comment
Вы имеете в виду, что вычисления выполняются на одной машине? 8-ядерный Xeon обрабатывает 16 параллельных потоков, при наличии достаточного количества оперативной памяти весь файл будет кэшироваться и считываться из памяти (и даже с дисками хороший рейд дает сравнимую производительность при последовательном вводе-выводе). - person 0x0FFF; 06.03.2015

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

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

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

person Manmohan    schedule 04.03.2015
comment
Ссылка AFAIK Реализация Hadoop WordCount по умолчанию поставляется с объединителем: hadoop.apache.org/docs/current/hadoop-mapreduce-client/ - person 0x0FFF; 05.03.2015
comment
Но он не упомянул, что использовал эту реализацию Wordcount для сравнения с производительностью Spark. - person Manmohan; 05.03.2015
comment
Это типично для бенчмаркинга: показывая, что инструмент А лучше инструмента Б, люди обычно показывают лучший случай для инструмента А по сравнению с худшим случаем для инструмента Б. Чтобы было ясно, никто не будет использовать подсчет слов в продакшене без комбинатора. - person 0x0FFF; 05.03.2015
comment
Вы сделали несколько предположений. Он не упомянул, что использовал Wordcount для производственной программы или что-то в этом роде. Концепция комбинирования в Spark — важная функция, и кто-то, кто не знаком со Spark, может заметить, что знает об этом. - person Manmohan; 05.03.2015

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

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

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

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

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

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

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

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

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

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

person tharindu_DG    schedule 14.12.2015