Count-Min Sketch: как посчитать частоту миллиарда событий в 10 килобайт
Самый наивный подход к подсчёту частот — завести хеш-таблицу: ключ — элемент, значение — счётчик. Пришёл запрос — инкрементировали. В конце работы выгрузили топ. Это работает ровно до тех пор, пока множество уникальных ключей умещается в оперативной памяти.
Как только мы выходим за пределы сотен мегабайт или говорим о потоке, который идёт бесконечно, хеш-таблица перестаёт быть решением, ибо в ней надо хранить сами ключи. Каждый уникальный IP (4 байта) превращается в 50–100 байт из-за оверхеда структур данных и выравнивания. Если ключ — это URL длиной 100 байт, и таких URL миллионы, — память улетает в гигабайты.
В офлайне вы можете запустить MapReduce, распараллелить, подождать немного и получить точный результат. Но, увы, в реальном времени это не работает. Никто не будет ждать час, чтобы узнать, какие сейчас самые активные пользователи.
Предыдущие статьи этой серии решали похожие проблемы — для проверки наличия элемента и для подсчёта уникальности. HyperLogLog отвечает на вопрос «сколько уникальных элементов мы видели?» и не говорит ничего про частоты. Фильтр Блума говорит «есть / нет», но не умеет считать.
Сегодня мы добавим в этот набор ещё один инструмент, который делает ровно то, что нужно для потоковых частот: фиксированная память, константное время на операцию и строгая вероятностная гарантия — Count-Min Sketch.
https://habr.com/ru/companies/timeweb/articles/1070742/
https://habr.com/ru/companies/timeweb/articles/1070742/
https://habr.com/ru/companies/timeweb/articles/1070742/
Самый наивный подход к подсчёту частот — завести хеш-таблицу: ключ — элемент, значение — счётчик. Пришёл запрос — инкрементировали. В конце работы выгрузили топ. Это работает ровно до тех пор, пока множество уникальных ключей умещается в оперативной памяти.
Как только мы выходим за пределы сотен мегабайт или говорим о потоке, который идёт бесконечно, хеш-таблица перестаёт быть решением, ибо в ней надо хранить сами ключи. Каждый уникальный IP (4 байта) превращается в 50–100 байт из-за оверхеда структур данных и выравнивания. Если ключ — это URL длиной 100 байт, и таких URL миллионы, — память улетает в гигабайты.
В офлайне вы можете запустить MapReduce, распараллелить, подождать немного и получить точный результат. Но, увы, в реальном времени это не работает. Никто не будет ждать час, чтобы узнать, какие сейчас самые активные пользователи.
Предыдущие статьи этой серии решали похожие проблемы — для проверки наличия элемента и для подсчёта уникальности. HyperLogLog отвечает на вопрос «сколько уникальных элементов мы видели?» и не говорит ничего про частоты. Фильтр Блума говорит «есть / нет», но не умеет считать.
Сегодня мы добавим в этот набор ещё один инструмент, который делает ровно то, что нужно для потоковых частот: фиксированная память, константное время на операцию и строгая вероятностная гарантия — Count-Min Sketch.
https://habr.com/ru/companies/timeweb/articles/1070742/
https://habr.com/ru/companies/timeweb/articles/1070742/
https://habr.com/ru/companies/timeweb/articles/1070742/