Использование Hadoop для хранения тиковых данных фондового рынка
Я получаю удовольствие, узнавая о Hadoop и различных проектах вокруг него, и в настоящее время у меня есть 2 разные стратегии, о которых я думаю для построения системы для хранения большой коллекции рыночных тиковых данных. Я только начинаю работать с Hadoop/HDSF. и HBase, но надеется, что кто-то может помочь мне посадить семена системы, которые мне не понадобятся позже, используя эти технологии. Ниже приведена схема моей системы и требований с некоторыми вариантами использования запросов и данных и, наконец, мое текущее мышление о наилучшем подходе из небольшой документации, которую я прочитал. Это открытый вопрос, и мне с удовольствием понравится любой проницательный ответ, и я приму лучший, не стесняйтесь комментировать любой или все пункты ниже. - Дункан Кребс
Системные требования - уметь использовать хранилище данных для исторического бэк-тестирования систем, построения исторических данных и последующего извлечения данных. После сохранения данные всегда будут доступны только для чтения, быстрый доступ к данным желателен, но не обязателен при бэк-тестировании.
Статическая схема - очень простая, я хочу захватить 3 типа сообщений из ленты:
- Отметка времени, включающая дату, день, время
- Цитата, включая символ, метку времени, спросить,askSize, ставку,bidSize, объем....(около 40 столбцов данных)
- Торговля, включая символ, метку времени, цену, размер, обмен....(около 20 столбцов данных)
Варианты использования вставки данных - либо из потока данных реального рынка или поиска через API брокера
Варианты использования запроса данных - ниже показано, как я хотел бы логически запрашивать мои данные.
Get me all Quotes,Trades,Timestamps for GOOG on 9/22/2014
Get me all Trades for GOOG,FB BEFORE 9/1/2014 AND AFTER 5/1/2014
Get me the number of trades for these 50 symbols for each day over the last 90 days.
Святой Грааль - можно ли использовать MapReduce для следующих случаев использования?
Генерация метаданных из необработанных рыночных данных через распределенных агентов. Например, напишите задание, которое будет вычислять средний объем торговли с интервалом в 1 минуту для всех акций и всех сессий, хранящихся в базе данных. Создайте задание, чтобы иметь агента для каждого запаса / сеанса, для которого я сообщаю, для какого запаса и сеанса он должен вычислять это значение. (Это то, что MapReduce может сделать???)
На пути к классам агентов я могу добавить свой собственный код утилит, чтобы приведенный выше пример использования мог опубликовать его значение на центральном сервере репо или на сервере обмена сообщениями? Могу ли я развернуть агент как пакет OSGI?
Создавать разные типы агентов для разных типов метрик и баллов, которые выполняются каждое утро перед предпродажной торговлей?
Высокочастотная торговля
Мне также интересно, может ли кто-нибудь поделиться своим опытом использования 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 является линейно масштабируемым и может также помочь в обработке событий на лету во время передачи.
В целом, сочетание нескольких технологий больших данных может обеспечить действительно достойное решение предложенной вами проблемы, и это решение будет масштабироваться до огромных объемов данных.