Выбор БД, OLAP-решений для быстрой веб-аналитики (большой массив данных) - PullRequest
1 голос
/ 05 августа 2011

У меня следующая проблема: моя система ежедневно собирает около 300 миллионов обращений с разных сайтов. У каждого есть время, идентификатор пользователя, тип (реклама или обычный), http-адрес, идентификатор сайта.

Существует также массив пользователей ~ 200M, который имеет пол, возрастную группу и страну.

Требуется для разработки системы, основанной на данных о попаданиях, которая может в реальном времени предоставлять отчеты о попаданиях различных групп пользователей. Как и решения OLAP: -)

Например, построить график по хитам для девушек 15-25 лет, из Великобритании, с октября по сентябрь 2011 года.

Какую базу данных вы рекомендуете выбрать и решение для построения кубов OLAP?

Я ищу решение с открытым исходным кодом, такое как HBase (+ zohmg или каскадный), Hypertable или что-то еще (бесплатный DWH: -)).

Ответы [ 2 ]

1 голос
/ 05 августа 2011

Это огромный объем данных, 300 миллионов ежедневных обращений, он доступен только для нескольких секторов. Это около 100 тера (10e2 * 10e9) хитов в год, вау!

Я не знаю ни одного OLAP-подобного решения, которое могло бы обрабатывать такой объем данных без предварительной агрегации, даже с учетом платных решений. Возможно, вы работаете над сокращением информации о вашей аналитической системе (она же OLAP): избавлением или уменьшением размеров измерений user_id, http address и id сайта.

Было бы любопытно, как вы решаете свою проблему и как вы узнали пол, возрастную группу ваших 200M пользователей: -).

0 голосов
/ 10 августа 2011

Возможно, вы сможете сделать это в режиме реального времени.Вы можете предварительно агрегировать за каждый день.Представьте себе следующее материализованное представление:

CREATE VIEW preAggregatedByDate
SELECT gender, ageGroup, country, date, COUNT(*) AS dailyCount
FROM myTable
GROUP BY date;

Итак, у вас есть счетчик для каждой комбинации ваших параметров (пол, возрастная группа и страна) за каждую дату.Для вашего запроса вы должны сделать что-то вроде:

SELECT COUNT(*)
FROM preAggregatedByDate
WHERE gender = 'Female' AND ageGroup = '15_25' AND country = 'UK' AND
    date >= '20110901' AND date < '20111101';

Очевидно, что это не будет так просто (и вы можете не использовать SQL и материализованные представления), но это может быть лучшим способомпредставить это, если вы знакомы с обычными базами данных.Ваш фактический запрос извлекает данные только из сильно сокращенного, предварительно агрегированного источника данных.

Если вы не против подождать несколько часов после окончания дня, чтобы выполнить запросы в этот день,Самым простым решением может быть использование Hadoop для вычисления предварительно агрегированных данных и помещения их в какую-то обычную базу данных, к которой затем можно запускать запросы.

...