Всем привет! Давно я тут не показывался, но как стало нужно с кем-то умным посоветоваться - сразу вспомнил про наш старый добрый форум..
Суть проблемы: у меня есть клиент, для которого я в одиночку разрабатываю сервис. В целом идея мне понятна, но не хватает опыта работы с инструментами для BigData. Сейчас готов работающий прототип, который может что-то делать с не очень большими данными (1-2 Гб). Довольно много ограничений, которые, впрочем, решаются.
Мне необходима помощь в обсуждении архитектуры и рекомендации инструментов/технологий для следующей версии.
Общая идея сервиса - хранить различные DataSet для юзеров, давать возможность ими управлять - загружать новые, удалять, импортировать из разных источников, бэкапы-шмэкапы, импорт-экспорт..
Вторая фича - обработка этих датасетов. Некие определяемые юзерами процедуры для удобной обработки этих данных.
Для пользователя: грубо говоря - если вы Data Scientist и у вас есть некоторые массивы информации - от гигабайта до терабайта - вы хотите строить модели, анализировать информацию, строить графики и все такое. Вы не хотите поднимать свои фермы серверов и их обслуживать, настраивать базы данных и следить за ними. Вы знаете в каких-то пределах R или Python или Java или еще какие-то языки (хоть Fortran) и хотите использовать то, что вам удобно. Возможно у вас баннерная сеть и вы раз в час хотите получать сводную статистику о новых кликах и показывать ее на сайте, и тп..
Вы подписываетесь на удобный сервис, импортируете ваши данные или каким-то образом настраиваете авто-импорт, потом пишете т.наз. Transformation - одну или цепочку процедур для обработки этих данных с организацией промежуточных результатов, а потом запускаете это время от времени.
В принципе, похоже на Google BigQuery, только свое
Сейчас для первого раунда сделан прототип на базе AWS(EC2+S3)/Django+Celery/Python/MongoDB: юзер загружает данные, например, из CSV или JSON, они кладутся в MongoDB и там хранятся. Юзер имеет возможность написать функцию на Python, которая через определенный интерфейс принимает входные датасеты (Pandas или list/dict) и может делать что угодно с ними, а потом сохраняет обратно.
Функция в виде файла заружается в систему, там проверяется на безопасность операций. После этого юзер может ее запустить на выделенном сервере, который специально для этого поднимается на AWS.
Очевидные недостатки понятны (и обсуждены с клиентом, но как прототип для демо пока его это устраивает).
Датасет ограничен по размерам оперативной памятью для обработки. Если загрузка-выгрузка сделаны поточными и, в принципе, способны засосать довольно большой объем, то для обработки все закачивается в память одного сервера и необходимо что-то делать в этой области. Это было изначально сделано для удобства юзера и для безопасности - чтобы не передавать ему открытый курсор к живой базе. Но, видимо, придется для каждой сессии создавать отдельного юзера и давать доступ только к нужным датасетам, а потом ео прибивать. Это несложно. Тогда клиенты смогут обращаться непосредственно к базе и строить запросы там (что я пытался избежать изначально).
Для обработки очень хочется не завязываться на какую-то конкретную технологию, а дать юзеру выбор. Например, сейчас у меня только разрешен Python с кучей запрещенных модулей для использования. Но юзер может хотеть работать с R, Go или еще чем-то.
Как вариант я сейчас думаю о том чтобы запускать на сервере Docker-контейнер, а внутри разрешить все что угодно - хоть shell-скрипты. Подготовить несколько базовых image (python, R, Go, Java) и пусть пишут как хотят. Можно подотовить некую клиентскую API-библиотеку с базовыми функциями для core-сервиса (типа, getDataSet, saveDataSet, etc)
В целом еще много мелочей, которые хотелось бы предусмотреть, но основные проблемы сейчас - это обработка и хранение больших объемов данных. Причем подешевле. Мой стек разработки сейчас - в основном Python backend, то есть желательно близко к нему все делать.
Я с BigData практически не работал плотно. Сейчас смотрю на Hadoop, Apache Spark. Думаю о возможности сделать все на MongoDB или даже на файлах в S3 или взять AWS RDS и в нее все запихать. Возможно, стоит для разных данных использовать разные сервисы..
В общем, хотелось бы получить консультацию у людей, чуть более хорошо разбирающихся в этой области. Для серьезных консультаций я даже готов потом немного заплатить, но пока хочется собрать мнения.