Почему не использовать что-то вроде MapReduce?
Мы можем ссылаться на системы вроде MapReduce как на распределенные вычислительные системы, в которых операция reduce основана на распределенной сортировке. Наиболее распространенным решением с открытым исходным кодом в этом классе является Apache Hadoop.
Эти системы не подходят для онлайн-запросов из-за их высокой задержки. Другими словами, их нельзя использовать в качестве бэкенда для веб-интерфейса. Такие системы не полезны для обновления данных в реальном времени. Распределенная сортировка не является оптимальным способом выполнения операций reduce, если результат операции и все промежуточные результаты (если они есть) находятся в ОЗУ одного сервера, что обычно бывает для онлайн-запросов. В таком случае хеш-таблица является оптимальным способом выполнения операций reduce. Общий подход к оптимизации задач map-reduce заключается в предварительной агрегации (частичном reduce) с использованием хеш-таблицы в ОЗУ. Пользователь выполняет эту оптимизацию вручную. Распределенная сортировка является одной из основных причин снижения производительности при выполнении простых задач map-reduce.
Большинство реализаций MapReduce позволяют выполнять произвольный код на кластер. Но декларативный язык запросов лучше подходит для OLAP, чтобы быстро проводить эксперименты. Например, Hadoop имеет Hive и Pig. Также рассмотрите Cloudera Impala или Shark (устаревший) для Spark, а также Spark SQL, Presto и Apache Drill. Производительность при выполнении таких задач значительно ниже, чем у специализированных систем, но относительно высокая задержка делает использование этих систем в качестве бэкенда для веб-интерфейса нереалистичным.