Почему Spark работает быстро при подсчете слов?
1388 просмотра
3 ответа
Тестовый пример: подсчет слов в данных 6G за 20+ секунд по Spark.
Я понимаю MapReduce , FP и модели потокового программирования, но не мог понять, что подсчет слов настолько быстр, что удивительно.
Я думаю, что в данном случае это интенсивный ввод-вывод, и невозможно сканировать файлы 6G за 20 с лишним секунд. Я предполагаю, что перед подсчетом слов выполняется индекс, как это делает Lucene. Волшебство должно заключаться в дизайне RDD (Resilient Distributed Datasets), который я недостаточно хорошо понимаю.
Я ценю, если кто-нибудь может объяснить RDD для случая подсчета слов. Спасибо!
Автор: 卢声远 Shengyuan Lu Источник Размещён: 13.11.2019 11:47Ответы (3)
4 плюса
Во-первых, время запуска. Для запуска задания 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:530 плюса
Помимо факторов, упомянутых в 0x0FFF, локальное объединение результатов также повышает эффективность подсчета слов при запуске. Spark по умолчанию объединяет результаты на каждом узле перед отправкой результатов на другие узлы.
В случае задания подсчета слов Spark рассчитывает количество для каждого слова в узле, а затем отправляет результаты в другие узлы. Это уменьшает объем данных, передаваемых по сети. Для достижения той же функциональности в Hadoop Map-Reduce необходимо указать класс комбинера.job.setCombinerClass(CustomCombiner.class)
Используя combineByKey()
в Spark, вы можете указать пользовательский объединитель.
0 плюса
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Вопросы из категории :
- parallel-processing Параллельное выполнение процессов оболочки
- parallel-processing В чем разница между параллелизмом и параллелизмом?
- parallel-processing Как ждать завершения всех потоков, используя ExecutorService?
- parallel-processing Как ждать завершения ряда потоков?
- streaming Как защитить паролем потоковое видео с помощью php
- streaming Потоковая передача через RTSP или RTP в HTML5
- streaming Воспроизведение видео с YouTube с помощью MPMoviePlayerController вместо UIWebView
- streaming Загрузка файла, чтение в память и использование в качестве текстового файла - есть ли лучший способ?
- apache-spark Как сделать акулу / искру очистить кеш?
- apache-spark (PySpark) Вложенные списки после reduByKey
- apache-spark Spark java.lang.OutOfMemoryError: пространство кучи Java
- apache-spark Apache Spark: map vs mapPartitions?
- bigdata Вычисление и сохранение пространства в PostgreSQL
- bigdata Запрос Elasticsearch для возврата всех записей
- bigdata POC для Hadoop в режиме реального времени
- bigdata Как ускорить оценку GLM в r?
- rdd Модифицировать коллекцию внутри каждого Spark RDD
- rdd Преобразование простой строки строки в RDD в Spark
- rdd Какая разница между кешем и персистом?