November 22, 2019

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


used: https://stackoverflow.com/questions/35479876/why-does-spark-save-map-phase-output-to-local-disk/41088478#41088478

also look on related links in answers