В мире науки о данных и обработки больших данных Ampool.io — это стартап, который делает все быстрее. Ampool — это хранилище данных, которое хранит данные в памяти (ОЗУ) для быстрых вычислений и аналитики в реальном времени. Это быстрее, чем распределенная файловая система Hadoop (отраслевой стандарт последних нескольких лет). Ampool построен с использованием Apache Geode и имеет интерактивный интерфейс, очень похожий на gfsh, который называется mash. Вы еще не можете выполнять специальные запросы (sql-запросы) к таблице данных, хранящейся в Ampool, но вы можете подключаться к локатору и серверам и хранить огромные наборы данных в легкодоступной распределенной системе данных.

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

Я работал со своими коллегами-стажерами (Рия Махиджани, Шантану Тулшибагвале) над созданием репозитория кода коннектора, который позволил бы ученым, работающим с данными, работающим на Python или R, взаимодействовать с хранилищем данных Ampool, написанным на Java. Spark (написанный на scala) уже может легко получить доступ к наборам данных Ampool.

Проект включал в себя написание Java-оболочки для внутреннего представления хранилища данных. Это также включало написание интерфейса соединителя Python и интерфейса соединителя R, сопоставление скомпилированного, объектно-ориентированного, широко типизированного языка с интерпретируемыми и частично функциональными языками в обоих случаях.

Оболочка Java начиналась как один интерфейсный класс, но позже она превратилась в 3 класса: прокси для подключения к хранилищу данных и создания/удаления таблиц, оболочка таблицы для изменения таблиц и итератор для передачи другим функциям ( позже итератор был объединен с оболочкой таблицы). То, что мы фактически написали (кредит Шан Тулшибагвале), является интерфейсом для клиентов, чтобы использовать чрезвычайно полезный продукт, над которым Ampool, Inc. работала в течение последнего года. Наша стажировка фактически совпала с годовщиной стартапа.

Класс коннектора Python был написан, чтобы сделать Java API доступным для пользователей Python (большинство специалистов по данным). Мы экспериментировали с Py4J и JPype в качестве соединителей между кодом Python и Java, прежде чем остановились на pyjnius, который использует Java Native Interface (JNI). JNI является общепринятым стандартом для общения с Java с использованием других языков.

Поскольку python — это интерпретируемый язык с функциональными и объектно-ориентированными возможностями, мы начали с простого написания функций, которые будут передавать данные в хранилище данных и из pandas. Pandas — это система обработки данных, которая чаще всего используется учеными, предпочитающими Python другим языкам. Существуют и другие пакеты (см. пакет datascience от Berkeley), но мы решили использовать pandas для охвата большей пользовательской базы.

Самая сложная часть языковых преобразований — это преобразования типов. Преобразование Python в Java было самым сложным для байтовых массивов. Pyjnius имеет свой собственный тип массива байтов, и преобразование стало трудным, если мы вручную не упаковали биты в массив в python (кредит Shan).

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

Коннектор R был написан, чтобы позволить пользователям R (большинству статистиков) извлекать и отправлять данные из Ampool и выполнять основные статистические функции с огромными наборами данных. В R вы можете получить среднее значение, медиану, стандартное отклонение, дисперсию, сумму и другие значения с учетом фрейма данных. С помощью нашего R-коннектора вы теперь можете запускать те же самые функции в огромном распределенном наборе данных. Чтобы это работало, нам пришлось реализовать не только функциональный API для взаимодействия с нашим объектно-ориентированным API Java, но также реализовать функции сопроцессора Java для распределения среднего/медианы и т.д. функции к распределенному набору данных. (Кредит Рия Махиджани)

Теперь пользователь R может установить наш пакет rampool и вызывать любые функции суммирования, а также любые функции прокси, таблиц и итераторов из интерфейса Java.

Я начал с намерения написать вариант использования машинного обучения для Ampool с использованием Spark, но такой вариант использования уже существовал. Вместо этого я работал над java, python и R, изучая ценные навыки у Шана, Рии и исполнительной команды в Санта-Кларе. Я также связался с разработчиками Ampool India за советом.

Я работал с Шаном над вариантом использования машинного обучения для соединителя Python, который он развил в механизм рекомендации фильмов на основе графа, который, как мы надеялись, будет лучше и быстрее, чем Netflix. Затем я работал с Рией над написанием коннектора R и репозитория функций сопроцессора для выполнения на стороне сервера.

Я вытащил несколько проектов с открытым исходным кодом из github г-на Пранаба Гоша, чтобы посмотреть, смогу ли я заменить части хаупа в его примерах аналитики машинного обучения в реальном времени на Ampool. Я настроил песочницу Hortonworks, чтобы играть с Ambari, Zeppelin и Spark на своем локальном компьютере, и узнал о сценариях bash и трюках Ubuntu через CentOS. Я все еще изучаю Spark и различные механизмы потоковой передачи, но настройка среды научила меня большему о моем компьютере, чем я узнал за всю среднюю школу и один год в Калифорнийском университете в Беркли. Я также узнал о шагах, которые предпринимают специалисты по данным, чтобы перейти от данных к полезным результатам.

В каждом проекте данные где-то хранились (обычно это hadoop/hdfs). Доступ к данным был получен откуда-то (обычно из Spark). Spark использует пакетную обработку, поэтому для аналитики в реальном времени данные нужно было передавать в потоковом режиме (Spark Streaming, Apex и т. д.). Затем данные были разделены на наборы для обучения, тестирования и проверки, прежде чем модель была построена с использованием набора для обучения.

После экспериментов с Mr. Гоша (avenir, beymani, chombo, ruscello и т. д.) в песочнице Hortonworks, я взглянул на другой вариант использования обнаружения аномалий г-на Майкла Вогиациса. В проекте использовалась модель нормального распределения по количеству измерений, позволяющих обнаруживать выбросы. Однако он был реализован в режиме пакетной обработки, и модификация его для работы с Ampool, Spark Streaming и Kafka научила меня многому в практическом машинном обучении и самих инструментах.

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

[Потраченная сумма, расстояние от зарегистрированного местоположения пользователя]

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

Моя работа заключалась в том, чтобы изменить характер пакетной обработки его проекта, чтобы создать искровое потоковое приложение, которое классифицировало бы точки данных по мере их поступления во время моделирования в реальном времени. Для имитации генерируемых транзакций я модифицировал java-программу генерации данных для создания строк формата:

«имя пользователя, метка времени, сумма, расстояние»

Строки были опубликованы как сообщения в тему Кафки. Затем я разделил исходный класс драйвера на 3 программы: LoadData, GenerateModel и MainRun. Первый загружает данные обучения и перекрестной проверки из CSV-файлов в Ampool. (Ampool здесь не сильно ускоряется, но почему бы и нет?) Второй извлекает данные и генерирует модель, которую оптимизирует, используя данные перекрестной проверки. Третья программа запускает поток kafka, который ждет появления сообщений в «теме» или виртуальном месте, куда я их публикую из java. Я запускаю java-программу, как только программа MainRun останавливается, ища данные в потоке. Java-программа бесконечно отправляет сообщения в поток MainRun, и программа классифицирует каждую входящую точку как выброс или не выброс.

Хотя выполнение простое, мне потребовалось некоторое время, чтобы понять совместимость между версиями Spark, Kafka и Scala. Я проникся вновь обретенным уважением к Hortonworks, чья цель состоит в том, чтобы упаковывать службы, которые хорошо работают вместе, с версиями, совместимыми друг с другом. Делать это самому было, мягко говоря, захватывающими американскими горками. После того, как я настроил эту систему, я провел день или два, изучая все тонкости Kafka, что оказалось очень полезным для симуляции.

Изучение Scala было опытом обучения на рабочем месте. Очевидно, что есть разница между переменными, объявленными как val, и переменными, объявленными как var в Scala. Изменяемы только var. Синтаксис в Scala также представляет собой странную смесь python и java с операторами def и освежающим отсутствием точек с запятой, смешанных с объектами и классами.

Чтобы заставить эти инструменты работать вместе, я также научился использовать Maven, как работать с файлом pom.xml, как писать Makefile, как писать bash-скрипт, как работать с SBT (Scala Build Tool), как написать файл сборки sbt, как настроить среду Unix, как взаимодействовать с виртуальной машиной через SSH, как передавать файлы с помощью SCP (протокола защищенной передачи) и как объяснить мой код кому-то еще таким образом, чтобы имеет смысл. Мне также дали мудрый совет научиться изображать мой мыслительный процесс на схеме (очевидно, прямоугольники и стрелки являются отраслевым стандартом).

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