Как использовать терабайты данных с помощью Java RESTful-клиента - PullRequest
2 голосов
/ 16 декабря 2011

Может ли кто-нибудь указать мне правильное направление о том, как спроектировать / построить клиент веб-службы, который будет потреблять терабайты данных и выполнять некоторые вычисления для извлеченных данных?

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

Процесс получения данных включает получение некоторых данных из веб-службы A, B, C и использование ответа для повторного запроса к веб-службе X, Y & Z. (мы не контролируем производителей веб-сервисов). Текущая реализация очень медленная, в большинстве случаев нам не хватает памяти, когда мы пытаемся выполнить некоторые вычисления для извлеченных данных. Данные в терабайтах или больше. Текущая реализация использует maven / spring.

Я нахожусь в стадии разработки нового дизайна для этого проекта (немного кеширования и т. Д.), Но мне потребуются некоторые предложения от любого, кто сталкивался с подобной проблемой раньше.

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

Ответы [ 2 ]

1 голос
/ 16 декабря 2011

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

Не покладая рук, я бы порекомендовалпросматривая Cassandra или HDFS для распределенной сетки данных (кластер NoSQL), затем Hadoop для создания заданий для запроса / агрегирования / манипулирования этими данными.

Надеюсь, это поможет.

0 голосов
/ 16 декабря 2011

Всегда неудобно иметь дело с терабайтами данных, потому что вы не можете одновременно хранить все это в памяти. (Ну, не без абсолютно нелепой машины.) Поэтому вместо этого вы должны спросить, нужно ли сразу хранить все эти данные - или даже просто большую их часть - в памяти. Это может быть обработано немного за один раз? (Несколько МБ считаются «маленькими» в наши дни; не беспокойтесь о сворачивании всего до степени n th .) Если это возможно, перепроектируйте приложение и его развертывание (с этим данных, вы не можете их разделить), чтобы данные были в проводном или дисковом формате.

Вы, вероятно, хотите думать с точки зрения потоковых фильтров и преобразований; Алгоритмы на основе MapReduce - хороший план. Вы уже смотрели на Hadoop? Да, я знаю, что вы не заинтересованы в создании чего-то подобного, но у вас действительно есть большой объем данных, и вы должны думать с точки зрения правильной работы. Тем не менее, MapReduce - это только один способ настройки шаблона фильтров и преобразований; Есть и другие тоже. Например, вы можете рассматривать последующие запросы на обслуживание как тип преобразования, хотя при наличии такого большого количества данных вам нужно быть осторожным, чтобы владелец службы не относился к вам как к атаке типа «отказ в обслуживании»! Возможно, вы захотите использовать научную систему документооборота ( Kepler , Taverna ), так как они предназначены для выполнения одного и того же набора задач в длинном списке вещей.

Вы также должны быть осторожны с передачей данных; с таким большим количеством данных стандартные алгоритмы контрольной суммы, встроенные в TCP / IP, имеют удивительно высокую вероятность чего-то упустить. (К счастью, фактическое количество ошибок на современном оборудовании в основном на самом деле низкое…) Кроме того, при обработке такого большого количества данных вы должны быть очень осторожны, чтобы избежать утечек памяти. Даже утечка в 1% из 1%, вероятно, будет означать общую утечку размером в ГБ, что может быть очень заметно.

...