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