Is Spark really in-memory?
#becomeDataEngineer
Когда врубаешься в тему инструментов для Big Data узнаешь, что сначала был Hadoop, который все мог, с помощью map reduce можно запилить любой пайплайн обработки данных.
Но эра Hadoop продолжалась недолго (см в Google Trands), и в какой-то момент Apache Spark вытеснил его как наиболее крутой инструмент. Основное достоинство - Spark умеет делать операции в in-memory и не нужно постоянно использовать hdfs в ходе выполнения какой-то джобы.
Однако когда читаешь доку Spark видишь что-то про запись каких-то файлов на диск, думаешь “было же in-memory”. Ну если все же нет, то куда эти файлы пишутся: на hdfs или disk space воркеров?
Дело в том, что важным процессом в работе Spark является shuffle
- процесс когда данные перераспределяются с воркеров на воркеры. Это он пишет результаты на диск. Рекомендую посмотреть картинки про shuffle
если вы не в курсе про него. Вкратце это перераспределение данных между воркерами, а значит жирная операция по IO.
- Как
shuffle
пишет файлы и можно ли этого не делать? - В чем преимущество перед Hadoop в таком случае?
- Где тогда in-memory в Spark?
- Shuffle пишет файлы в памяти воркеров. Это кеширование делается чтобы переиспользовать эти данные, если дальше по процессу нужно снова этот RDD использовать. В памяти же их хранить не хочется, потому что память более ценный ресурс, и она активно используется для других текущих операций (не shuffle)
- Преимущество над Hadoop в том, что Spark умеет объединять стадии джобы в одну таску (которым не требуется shuffle), тогда как Hadoop не умеет и будет использовать hdfs между выполнениями этих стадий.
- Где тогда in-memory в Spark? В отличие от Hadoop, Spark при объединении стадий джобы не записывает их результаты на диск (тем более в hdfs). В этом смысле Spark быстрее и круче чем Hadoop
also look on related links in answers