Модель данных для веб-страниц маяков - PullRequest
2 голосов
/ 10 февраля 2012

Я бы хотел хранить миллионы маяков веб-страниц в Кассандре, каждый из которых выглядит примерно так: JSON:

'{
  "uri": "http://foo.com/bar/index.html",
  "metric1": 74,
  "metric2": 123,
  "conntime": "2011-12-30T13:43:34",
  "city": "CAMBRIDGE",
  "state": "MA",
  "ua": "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/535.2 (KHTML, like Gecko) Chrome/15.0.874.121 Safari/535.2",
  "plat": "Win32"
 }'

Где строка содержит URI, ряд метрик, за которыми следуют данные гео / браузера / платформы. Как вы можете себе представить, будет меньше URI / UA / Plats / Cities / States, в то время как значение каждого показателя будет сильно различаться.

Я прочитал это и это , но мои запросы будут больше похожи на следующие, которые не подходят для счетчиков:

  • Что такое медиана 'metric1' для каждого ('ua', 'plat', 'state', 'city')?
  • Что такое 95-й процентиль 'metric2' в 'conntime' "2011-12-30T13: 43: 34"?

Возможно ли (и разумно) денормализовать мои данные в счетчики? Или есть лучший способ для моделирования данных?

Спасибо!

1 Ответ

1 голос
/ 12 февраля 2012

Это зависит от того, хорошо ли определены наборы индикаторов и измерений запроса (т. Е. Вам нужно только среднее значение, медиана для каждого «ua», «состояние». Оба набора могут быть довольно длинными, но конечными)

Аддитивные индикаторы могут храниться в столбцах счетчиков (если у вас есть счет и сумма, вы всегда можете рассчитать среднее):

CF[event.ua].metric1_sum += event.metric1;
CF[event.ua].metric1_count++;
CF[event.state].metric1_sum += event.metric1;
CF[event.state].metric1_count++;
....

Чтобы рассчитать медиану и процентили, я бы предложил создать суперколонку с контрколонками. Значения метрики - это имена вложенных столбцов, а число событий - это значения вложенных столбцов:

CF[event.ua].metric1_values[event.metric1]++;
CF[event.state].metric1_values[event.metric1]++;
...

В случае, если количество различных значений метрик будет слишком велико, возможно, было бы возможно округлить значения метрик без серьезной ошибки.

Для других типов индикаторов могут потребоваться другие оптимизации.

И все же, я бы предложил хранить отдельные события в денормализованной форме, аналогично упомянутому JSON. Кассандра очень быстро записывает данные. А наличие необработанных данных позволит вам рассчитать значения истории дополнительных индикаторов, запустив Map / Reduce для полного набора данных.

...