Использование Hadoop для хранения тиковых данных фондового рынка


Я получаю удовольствие, узнавая о Hadoop и различных проектах вокруг него, и в настоящее время у меня есть 2 разные стратегии, о которых я думаю для построения системы для хранения большой коллекции рыночных тиковых данных. Я только начинаю работать с Hadoop/HDSF. и HBase, но надеется, что кто-то может помочь мне посадить семена системы, которые мне не понадобятся позже, используя эти технологии. Ниже приведена схема моей системы и требований с некоторыми вариантами использования запросов и данных и, наконец, мое текущее мышление о наилучшем подходе из небольшой документации, которую я прочитал. Это открытый вопрос, и мне с удовольствием понравится любой проницательный ответ, и я приму лучший, не стесняйтесь комментировать любой или все пункты ниже. - Дункан Кребс

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

Статическая схема - очень простая, я хочу захватить 3 типа сообщений из ленты:

  1. Отметка времени, включающая дату, день, время
  2. Цитата, включая символ, метку времени, спросить,askSize, ставку,bidSize, объем....(около 40 столбцов данных)
  3. Торговля, включая символ, метку времени, цену, размер, обмен....(около 20 столбцов данных)

Варианты использования вставки данных - либо из потока данных реального рынка или поиска через API брокера

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

  1. Get me all Quotes,Trades,Timestamps for GOOG on 9/22/2014
  2. Get me all Trades for GOOG,FB BEFORE 9/1/2014 AND AFTER 5/1/2014
  3. Get me the number of trades for these 50 symbols for each day over the last 90 days.

Святой Грааль - можно ли использовать MapReduce для следующих случаев использования?

  1. Генерация метаданных из необработанных рыночных данных через распределенных агентов. Например, напишите задание, которое будет вычислять средний объем торговли с интервалом в 1 минуту для всех акций и всех сессий, хранящихся в базе данных. Создайте задание, чтобы иметь агента для каждого запаса / сеанса, для которого я сообщаю, для какого запаса и сеанса он должен вычислять это значение. (Это то, что MapReduce может сделать???)

  2. На пути к классам агентов я могу добавить свой собственный код утилит, чтобы приведенный выше пример использования мог опубликовать его значение на центральном сервере репо или на сервере обмена сообщениями? Могу ли я развернуть агент как пакет OSGI?

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

Высокочастотная торговля
Мне также интересно, может ли кто-нибудь поделиться своим опытом использования Hadoop в контексте высокочастотных торговых систем. Просто начав знакомство с этой технологией, я изначально чувствовал, что Hadoop может быть полезен для хранения и обработки больших объемов исторических тиковых данных, если кто-то использует это для торговли в реальном времени, мне было бы интересно узнать больше! - Дункан Кребс

1 ответ

Решение

Основываясь на моем понимании ваших требований, Hadoop был бы действительно хорошим решением для хранения ваших данных и выполнения ваших запросов с помощью Hive.

Хранение: Вы можете хранить данные в Hadoop в структуре каталогов, например:

~/stock_data/years=2014/months=201409/days=20140925/hours=01/file

Внутри папки часов могут находиться данные, относящиеся к этому часу дня.

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

Create external table stock_data (schema) PARTITIONED BY (years bigint, months bigint, days bigint, hours int) ROW FORMAT DELIMITED   FIELDS TERMINATED BY '\t' LOCATION
  '~/stock_data'

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

Получить мне все котировки, сделки, метки времени для GOOG на 9/22/2014

select * from stock_data where stock = 'GOOG' and days = 20140922

Сделай мне все сделки на GOOG,FB ДО 1.09.2014 И ПОСЛЕ 1.05.2014

select * from stock_data where stock in ('GOOG', 'FB') and days > 20140501 and days < 20140901)

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

Чтобы получить более быстрые результаты, вы можете использовать некоторые проекты в памяти, такие как Impala или Spark. Я сам использовал Impala для выполнения запросов к моим таблицам улья, и я увидел значительное улучшение во времени выполнения моих запросов (около 40x). Также вам не нужно вносить какие-либо изменения в структуру данных.

Варианты использования для вставки данных: вы можете использовать такие инструменты, как Flume или Kafka, для вставки данных в реальном времени в Hadoop (и, следовательно, в таблицы кустов). Flume является линейно масштабируемым и может также помочь в обработке событий на лету во время передачи.

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

Другие вопросы по тегам