HyperLogLog: как найти уникальные значения в терабайте данных, не храня их

Представим задачу: хайлоад-сервис гонит поток данных — логи, IP-адреса, ID пользователей, миллиарды записей в сутки. Ваша задача — посчитать количество уникальных посетителей за неделю. Первым решением может показаться завести HashSet и кидать туда ключи, а в конце посмотреть размер. Решение неплохое, но когда речь заходит о миллиардах записей — память будет слабым местом. Один IP-адрес (4 байта) как ключ в HashSet потянет за собой накладные расходы на ноды, указатели и хеши. На практике один элемент сжирает не меньше 50–100 байт. Поток в миллиард уникальных записей потребует под сотню гигабайт оперативной памяти. Это дорого, а если инстансов десять — то просто нереально. Но существует алгоритм, который способен решить эту задачу примерно в 1.5 килобайта памяти с погрешностью около 2%? Без хранения самих данных и гигантских кластеров. Достаточно одного прохода по потоку и пары битовых трюков — именно так и работает HyperLogLog, алгоритм родом из математической статистики, который перевернул подход к подсчёту уникальности в Big Data. HyperLogLog используют в Redis, BigQuery, ClickHouse, Presto. В этой статье мы разберем и реализуем этот алгоритм на C, а также узнаем его предысторию.

https://habr.com/ru/companies/timeweb/articles/1046345/

#c #hyperloglog #loglog #оптимизация #алгоритмы #ненормальное_программирование #программирование #timeweb_статьи

HyperLogLog: как найти уникальные значения в терабайте данных, не храня их

Представим задачу: хайлоад-сервис гонит поток данных — логи, IP-адреса, ID пользователей, миллиарды записей в сутки. Ваша задача — посчитать количество уникальных посетителей за неделю. Первым...

Хабр

HyperLogLog: как найти уникальные значения в терабайте данных, не храня их

Представим задачу: хайлоад-сервис гонит поток данных — логи, IP-адреса, ID пользователей, миллиарды записей в сутки. Ваша задача — посчитать количество уникальных посетителей за неделю. Первым решением может показаться завести HashSet и кидать туда ключи, а в конце посмотреть размер. Решение неплохое, но когда речь заходит о миллиардах записей — память будет слабым местом. Один IP-адрес (4 байта) как ключ в HashSet потянет за собой накладные расходы на ноды, указатели и хеши. На практике один элемент сжирает не меньше 50–100 байт. Поток в миллиард уникальных записей потребует под сотню гигабайт оперативной памяти. Это дорого, а если инстансов десять — то просто нереально. Но существует алгоритм, который способен решить эту задачу примерно в 1.5 килобайта памяти с погрешностью около 2%? Без хранения самих данных и гигантских кластеров. Достаточно одного прохода по потоку и пары битовых трюков — именно так и работает HyperLogLog, алгоритм родом из математической статистики, который перевернул подход к подсчёту уникальности в Big Data. HyperLogLog используют в Redis, BigQuery, ClickHouse, Presto. В этой статье мы разберем и реализуем этот алгоритм на C, а также узнаем его предысторию.

https://habr.com/ru/companies/timeweb/articles/1046345/

#c #hyperloglog #loglog #оптимизация #алгоритмы #ненормальное_программирование #программирование #timeweb_статьи

HyperLogLog: как найти уникальные значения в терабайте данных, не храня их

Представим задачу: хайлоад-сервис гонит поток данных — логи, IP-адреса, ID пользователей, миллиарды записей в сутки. Ваша задача — посчитать количество уникальных посетителей за неделю. Первым...

Хабр

@m This log is in the Botanisk Have, ved Den Gamle By. But it delights me to think that our local logs in Aarhus are so excellent that we recognise them and know their locations. I do know of a similarly fine log in the Marselisborg woods, but not the Moesgaard one you mention. We clearly do need, as has been suggested, a log log.

#Log
#LogLog

@njoseph

Linked article (which makes good points about too much centralisation) says:

> Frankly, this distribution is closer to the Dirac delta function than a power law.

This may be a throwaway line and I may be showing excess pedantry, but here goes:

My analysis shows that it actually *is* quite close to a power law, very approximately:
active_users = 30000 * x ** -1.3
where x is the rank of the instance (x=1 is the largest instance)

data from:
https://instances.social/api/1.0/instances/list?min_users=1&count=0 (with my API token, retrieved tonight)

piped through:
``
`tr "," "\n" |
grep active_users |
sed "s/.*://g" |
sed "s/}.*//g" |
sort -nr |
grep -v null > instances.dat
```

log-log plotted with gnuplot, the line of fit is guesstimated by hand because I still haven't figured out how to get #gnuplot to do #loglog #curve #fitting with (in?)appropriate weighting of data