запросы / агрегирование в реальном времени миллионов записей - hadoop?HBase?Cassandra? - PullRequest
7 голосов
/ 26 июля 2011

У меня есть решение, которое можно распараллелить, но у меня (пока) нет опыта работы с hadoop / nosql, и я не уверен, какое решение лучше всего подходит для моих нужд.Теоретически, если бы у меня было неограниченное количество процессоров, мои результаты должны возвращаться мгновенно.Таким образом, любая помощь будет оценена.Спасибо!

Вот что у меня есть:

  • 1000с наборов данных
  • ключи набора данных:
    • все наборы данных имеют одинаковые ключи
    • 1 миллион ключей (это может быть позже 10 или 20 миллионов)
  • столбцы набора данных:
    • каждый набор данных имеет одинаковые столбцы
    • От 10 до 20 столбцов
    • большинство столбцов являются числовыми значениями, для которых нам нужно агрегировать (avg, stddev и использовать R для вычисления статистики)
    • несколько столбцов являются столбцами "type_id",поскольку в конкретный запрос мы можем включить только определенные type_ids
  • веб-приложение
    • , пользователь может выбрать, какие наборы данных ему интересны (от 15 до1000)
    • приложение должно представить: ключевые и агрегированные результаты (avg, stddev) каждого столбца
  • обновления данных:
    • всегоНабор данных может быть добавлен, удален или заменен / обновлен
    • было бы здорово, чтобы иметь возможность добавлять столбцы.Но, если требуется, можно просто заменить весь набор данных.
    • никогда не добавлять строки / ключи в набор данных - поэтому не требуется система с большим количеством быстрых записей
  • инфраструктура:
    • в настоящее время две машины с 24 ядрами в каждом
    • в конце концов, хотите иметь возможность запускать это на amazon

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

  • разделы хороши, так как могут легко добавлять / удалять / заменять разделы
  • база данныххорошо подходит для фильтрации по базам данных type_id
  • , для написания параллельных запросов нелегко * базы данных 1065 *
  • хороши для структурированных данных, а мои данные не структурированы

Asподтверждение концепции, которую я опробовал hadoop:

  • создал файл с разделением табуляцией для каждого набора данных для определенного type_id
  • , загруженного в hdfs
  • map: получил значение /столбец для каждого ключа
  • уменьшить: вычисленное среднее и стандартное отклонение

Из моего грубого подтверждения концепции я вижу, что это будет хорошо масштабироваться, но я могу видеть hadoop / hdfsимеет время ожидания, я читал, что он обычно не используется для запросов в режиме реального времени (хотя я в порядке с возвращением результатов пользователям через 5 секунд).

Любое предложение о том, как я должен подходить к этому?Я думал о том, чтобы попробовать HBase, чтобы почувствовать это.Стоит ли мне вместо этого смотреть на Улей?Cassandra?Волдеморт?

спасибо!

Ответы [ 5 ]

6 голосов
/ 27 июля 2011

Улей или Свинья, похоже, не помогут вам. По сути, каждый из них компилируется в одно или несколько заданий сопоставления / сокращения, поэтому ответ не может быть получен в течение 5 секунд

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

проверить http://en.wikipedia.org/wiki/Standard_deviation

stddev (X) = sqrt (E [X ^ 2] - (E [X]) ^ 2)

это означает, что вы можете получить stddev of AB, выполнив

SQRT (E [AB ^ 2] - (E [AB]) ^ 2). E [AB ^ 2] есть (сумма (A ^ 2) + сумма (B ^ 2)) / (| A | + | B |)

4 голосов
/ 27 января 2012

Поскольку ваши данные кажутся в значительной степени однородными, я бы определенно взглянул на Google BigQuery - вы можете принимать и анализировать данные без шага MapReduce (с вашей стороны) и API RESTfulпоможет вам создать веб-приложение на основе ваших запросов.Фактически, в зависимости от того, как вы хотите создать свое приложение, вы можете создать приложение «в реальном времени».

2 голосов
/ 16 ноября 2011

Если я вас правильно понимаю, и вам нужно агрегировать только по одному столбцу за раз Вы можете хранить свои данные по-разному для лучших результатов в HBase это будет выглядеть примерно так таблица на столбец данных в сегодняшней настройке и еще одна таблица для полей фильтрации (type_ids) строка для каждого ключа в сегодняшней настройке - вы можете подумать, как включить поля фильтра в ключ для эффективной фильтрации - в противном случае вам придется выполнить двухфазное чтение ( столбец для каждой таблицы в сегодняшней настройке (то есть несколько тысяч столбцов) HBase не возражает против добавления новых столбцов и является редким в том смысле, что он не хранит данные для несуществующих столбцов. Когда вы читаете строку, вы получите все соответствующие значения, которые вы можете сделать в среднем. и т.д. довольно легко

2 голосов
/ 28 июля 2011

Это серьезная проблема без непосредственного хорошего решения в открытом пространстве. В коммерческом пространстве базы данных MPP, такие как greenplum / netezza, должны делать. В идеале вам понадобится Google Dremel (движок за BigQuery). Мы разрабатываем клон с открытым исходным кодом, но это займет некоторое время ... Независимо от используемого движка, я думаю, решение должно включать хранение всего набора данных в памяти - оно должно дать представление о том, какой размер кластера вам нужен.

0 голосов
/ 15 марта 2012

Вы можете использовать для этого простую старую базу данных.Не похоже, что у вас есть транзакционная система.В результате вы, вероятно, можете использовать только одну или две большие таблицы.У SQL возникают проблемы, когда вам нужно объединить большие данные.Но поскольку ваш набор данных не звучит так, как будто вам нужно присоединиться, у вас все будет хорошо.Вы можете настроить индексы для поиска набора данных и сделать это в SQL или в приложении математика.

...