Абстрактный:

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

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

В этой статье мы будем сравнивать и противопоставлять Hadoop, чтобы понять, почему такой уровень сложности и ремонтопригодности не нужен. Чтобы быть ясным, я не против Hadoop, я люблю Hadoop, но есть лучшие, более простые и современные способы достижения аналитической производительности корпоративного уровня. Эти более современные подходы избавляют команды от утомительных выходных, требуемых для перебалансировки файловой системы, для поддержки кодирования стирания, наличия необходимости и понимания внешних инструментов (примеры: Apache Ranger, Apache Sentry и т. Д. .) для периферийной безопасности и так далее и так далее. Для управления метаданными вам нужно будет обратиться за помощью к другим инструментам, таким как Apache Atlas.

Вы когда-нибудь видели стабильную базу данных в мире, метаданные которой находятся в другой базе данных? Я не совсем понимаю, почему Улей был так спроектирован. Вам необходимо настроить внешнюю базу данных в качестве хранилища метаданных Hive - это может быть Derby или MySQL. Если ваши данные потеряны в HDFS, ваше мега-хранилище метаданных останется !. Скажем большое «нет» всем этим неприятностям и попробуем хранить метаданные вместе с данными, избегая установки Hadoop или Hive на предлагаемую нами платформу машинного обучения. Да, мы будем использовать Hive только в качестве интерфейса для проецирования наших данных, а также четко определенных отношений и кортежей (для неспециалистов это таблицы и строки).

Мы разделим содержание этой статьи следующим образом

1. Настройка MinIO

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

Для тех, кто плохо знаком с MinIO, я рекомендую две мои другие статьи, часть 1 и часть 2, для подробного изучения технологии.

Если он еще не установлен, возьмите нужную загрузку и следуйте руководству по быстрому запуску.

Это первый момент сравнения / контраста Hadoop. Каковы временные рамки, которые ваша организация потратит или собирается потратить, когда вы захотите обновить экосистему на основе Hadoop? Месяцы? Это, вероятно, предполагает, что все идет идеально. MinIO - даже для инфраструктуры peta / exascale занимает минуты.

Видите, что произошло, когда я запустил MinIO? У меня был старый экземпляр. На обновление до последней версии и начало работы ушло меньше минуты.

Теперь вы можете запустить сервер, следуя инструкциям:

Либо вы можете использовать MinIOClient (mc), либо S3CMD для создания сегментов и использования MinIO. В своей предыдущей статье я использовал mc. Здесь я использую s3cmd, чтобы продемонстрировать гибкость MinIO. Давайте создадим новую корзину под названием mldata с помощью s3cmd. Не забудьте создать файл .s3cfg на вашем локальном компьютере с данными сервера MinIO, которые у вас есть на экране выше.

Теперь создайте каталог и убедитесь, что он существует, перечислив его вниз:

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

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

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

Следующий шаг - поместить эти данные в нашу корзину. Для упрощения создания таблицы мы можем пропустить строку заголовка и называть наш CSV-файл как input.csv. Здесь нам помогут небольшие команды Unix, такие как sed.

Вы можете удалить эти данные, так как позже в этой статье мы будем использовать Presto для создания таблицы на лету из MySQL.

2. Настройка Presto

Следующее, что мы сделаем, - это Presto. Для начала перейдите на страницу Presto на GitHub и загрузите следующие файлы в свою систему.

  1. Сервер Presto
  2. Интерфейс командной строки Presto (CLI)
  3. Presto JDBC

Я помещаю эти файлы в каталог под названием MinIOlake. Извлеките указанный выше сервер (1) в эту папку. Здесь есть хорошие инструкции, которым нужно следовать. Шаги показаны ниже:

Вам потребуется три файла конфигурации и один каталог с именем «catalog» в новом каталоге «etc», который должен быть создан в извлеченной папке сервера. Шаги и файлы показаны ниже.

3. Настройка Presto для использования хранилища файловых метаданных и S3Select.

Теперь самое интересное. Мы оставили наш каталог каталога пока пустым. Это то место, где Presto понадобятся все ваши разъемы. Вы можете настроить коннектор Hive и подключиться к MinIO - об этом я рассказывал в своей статье Часть 2. Чтобы использовать хранилище метаданных Hive, Hive должен быть запущен, а служба хранилища метаданных должна быть запущена. У нас никогда не было возможности включить S3Select для включения предиката нажатия для нижележащего MinIO. Теперь этот подход унаследован :). Мы собираемся обновить архитектуру, чтобы адаптировать ее к последнему и лучшему. Давайте начнем с написания файла MinIO.properties в нашем каталоге каталога, чтобы включить хранилище метаданных файлов и S3Select. Ну вот:

Вышеупомянутая конфигурация - самая важная часть этой статьи. Предпочтительно обратите внимание на две строки, отмеченные как 1, и последнюю строку, отмеченную как 2. Остальные строки тривиальны.

В строке 1 мы использовали коннектор hive-hadoop2 в Presto, но мы говорим, что вместо традиционного хранилища метаданных Hive на основе экономичности используйте корзину MinIO S3 (созданную на шаге 1) в качестве хранилища метаданных. При этом вам не нужно иметь никаких следов Hadoop или Hive для установки в вашем машинном обучении или экосистеме данных.

Во второй части мы включаем S3Select в Presto. Всего с помощью одной строчки кода MinIO может позаботиться о запросе предиката push down. Если этот параметр не включен, все данные будут поступать в Presto, включая фильтрацию, что отрицательно скажется на производительности вашего запроса, особенно когда он содержит условия и соединения из нескольких таблиц, хранящихся в корзине.

Закройте файл. Теперь вы можете запустить сервер Presto. Я предполагаю, что ваш сервер MinIO работает. Запустите Presto, введя приведенную ниже команду из каталога вашего сервера.

Мы создали лучшую в своем классе базу данных.

Затем мы создадим таблицу, указывающую на наш файл «input.csv», который существует в ведре «mldata», созданном на шаге 1. Мы будем использовать Presto CLI (интерфейс командной строки, мы уже загрузили этот jar в наш « MinIOlake »). Введите команду ниже, чтобы создать таблицу. Здесь я предполагаю, что у нас есть таблица в MYSQL в схеме, называемой «игры».

(Используйте стандартные SQL-запросы для создания таблицы из наших данных о статистике баскетбольных игр, которые обсуждались ранее), и мы будем использовать команду Presto CTAS (Create Table As…) для создания эквивалентной таблицы в MinIO. Это подчеркивает возможности Presto по извлечению данных из существующих баз данных и их переносу в MinIO. Это делается так:

Имея таблицу в S3: // mldata, мы готовы к следующим шагам. Обратите внимание на название таблицы выше - MinIO.games.gamestats, что означает, что у нас есть коннектор MinIO (указывающий на S3: //, хранилище MinIO), схема с именем «games», и у нас есть таблица в этой схеме с именем «gamestats». . Очевидно, что хранилище метаданных находится в корзине MinIO «mldata».

Абсолютно нет хранилища метаданных Hive, нет Hadoop и, следовательно, нет службы хранилища метаданных, запускаемой извне.

Наконец, запустите приведенную ниже команду в Presto и посмотрите результат

explain select * from MinIO.games.gamestats where outcome = ‘yes’

Обратите внимание на выделенный фрагмент кода выше. Мы видим здесь использование «фильтра сканирования» по сравнению с «сканированием таблиц». Поскольку Presto работает только с релевантной информацией, аналитический рабочий процесс значительно повышает эффективность. В этом сила логики предикатов pushdown и то, что делает S3 Select таким эффективным.

В этом примере использовались три машины DL-380, 6 процессоров, каждый с 1 ТБ и 32 ГБ ОЗУ для теста производительности с MinIO, по отфильтрованным запросам с различными размерами данных. Ось X представляет размер (в ГБ) запросов, а ось Y представляет время. Чтобы обеспечить наилучшую производительность в сети, я использовал выделенный RDMA между узлами и дисками NVMe. Пропускная способность сети приблизилась к 65 ГБ / с. Вот результат:

Как можно видеть, улучшения производительности действительно начинают проявляться по мере того, как объем данных начинает расти, в конечном итоге обеспечивая улучшение от 40% до 50% всего на 350 ГБ.

4. Интеграция Weka с Presto JDBC

Давайте перейдем на новый уровень. Теперь мы собираемся немного написать код на Java, чтобы интегрировать Weka с Presto, который, в свою очередь, имеет готовый соединитель для MinIO с включенным S3Select. Нам нужно будет внести некоторые изменения в код Weka, чтобы легко интегрировать Presto JDBC. Шаги для этого проиллюстрированы ниже:

Шаг 1. Убедитесь, что у вас установлен Java 8 SDK. Загрузите снимок Weka отсюда. Извлеките загруженный файл, чтобы получить следующие файлы:

Шаг 2. Войдите в каталог weka. Распакуйте файл weka-src.jar следующим образом:

Шаг 3. Скопируйте файл jar presto-jdbc из каталога MinIOlake в папку lib в извлеченном источнике.

Шаг 4: перейдите к шагу 2, папка weka. Откройте build.xml. Найдите цель ant (Apache ANT - это инструмент сборки, используемый Weka для создания jar-файла выпуска) с именем «compile». Добавьте следующие строки, чтобы разбить файл JDBC jar на классы, чтобы последний jar также содержал наш JDBC. Добавьте выделенную часть. Вы можете опустить это, если знаете, как управлять путем к классам в Java.

Шаг 5: Создайте копию файла ниже

Здесь необходимо небольшое пояснение. Weka не понимает всех типов данных всех баз данных во вселенной. Нам нужно предоставить файл сопоставления, который определяет, как должен интерпретироваться тип исходной базы данных. Также в этом файле указаны названия драйверов и их части. Поскольку наши типы данных очень похожи на Oracle, мы создали копию. Опытные пользователи могут создавать свои собственные.

Шаг 6: Отредактируйте указанный выше файл, чтобы добавить имена драйверов и сведения о сервере / порте, как показано ниже, и сохраните файл как DatabaseUtils.props. Также проверьте типы данных, показанные на следующем снимке экрана. У Weka будет этот файл, но вы можете его перезаписать:

Шаг 7. Создайте новый файл jar. Перейдите к шагу 2, папку weka и введите ant exejar. Предположение: у вас установлен ANT. Если вы не сдаете в аренду, следуйте инструкциям здесь ».

Как видите, ANT создал новую папку с именем dist и предоставил файл jar с именем weka.jar. Эту банку мы будем использовать для следующих шагов.

5. Машинное обучение: дерево решений с Weka на данных из MinIO

На данный момент у нас есть мощная современная платформа сбора данных и аналитики. Давайте применим один из основных алгоритмов классификации, деревья решений, к нашим выборочным данным с помощью Weka. Поскольку мы создали коннектор для Presto, Weka будет подключаться к Presto, извлекая данные из MinIO. Прежде чем мы перейдем к следующим шагам, просто проверим: у вас должны быть запущены и MinIO, и Presto:

Шаг 1: Запустите Weka из каталога dist, в котором мы создали наш дистрибутив jar:

java -jar weka.jar

Щелкните «Explorer».

Перейдите под окном:

Вы увидите окно SQL-Viewer. В URL-адресе будет отображаться jdbc: presto: // @ servername: 8080. Измените @servername на localhost, поскольку наш Presto работает локально. Вы можете установить часы на первой кнопке справа, чтобы установить имя пользователя и пароль. Дайте любое имя пользователя (в моем случае MinIO) и оставьте пароль пустым. Если вы включите аутентификацию в Presto и настроите https, вам нужно будет указать действительные ИД пользователя и пароль.

Шаг 2. После того, как вы нажмете «ОК», а затем вторую кнопку справа, вы увидите, что на панели «Информация» отображается статус. Теперь напишем наш запрос.

select * from minio.games.gamestats //Do not put semicolon at end

Нажмите кнопку «Выполнить». Вуаля! Наш первый браузер MinIO в действии.

Нажмите кнопку «ОК». Вы не должны получать никаких ошибок, связанных с типом данных. Если вы видите, что что-то не так, просмотрите еще раз DatabaseUtils.props, который мы изменили ранее, и еще раз проверьте еще раз.

Теперь у вас есть мощный экран «Предварительная обработка» Weka, на котором вы увидите:

Шаг 3. Давайте приступим к нашим действиям по машинному обучению. Часто, когда вы переносите данные, как указано выше, может быть сочетание столбцов с разными типами данных. Некоторые из столбцов могут быть категориальными (где вы перечисляете возможные значения, обычно это строки) или непрерывными (дискретные числа). Вам может потребоваться очистка и преобразование данных. Weka поддерживает это с помощью потрясающего набора фильтров для этой цели. Вы можете увидеть это, нажав «Фильтр». Даже мы можем использовать параметры для замены некоторых значений на нули, если ваши данные разрежены, или вы можете удалить нерелевантные значения, которые могут не добавить никакой ценности в вашу логику машинного обучения. Например, идентификатор сотрудника может не играть никакой роли в прогнозировании результатов кредитной заявки. Вы используете StringIndexer в Spark для преобразования типов данных.

Чтобы открыть дерево решений, нажмите кнопку «классифицировать». Вы увидите окно слева со всеми видами алгоритмов, поддерживаемых Weka. Выберите «деревья» и выберите J48.

Щелкните «Пуск». Оставшиеся параметры оставьте по умолчанию. Вы, как эксперт по машинному обучению, знаете, что это такое. Посмотрите, что мы создали модель с точностью 70%. Для небольшого набора экспериментальных данных, подобных нашим, это нормально, поскольку я не собираюсь настраивать его дальше.

Сохраните модель в папке MinIOlake (не в хранилище MinIO, поскольку Weka не может читать протокол S3: //). Назовите его «MinIOdtree.nodel».

6. Тестирование нашей модели дерева решений

Теперь давайте протестируем нашу модель. Для этого мы создадим файл с двумя строками, в котором мы не знаем нашего прогноза. Назовите этот файл Test.csv. Это дано ниже.

Обратите внимание на "?" Метки. Мы не знаем, каков будет результат, и хотим, чтобы Weka сообщила нам, используя созданную нами модель.

Шаг 1. Запустите Weka. Просто нажмите кнопку «Файл» и укажите любой файл. Мы не собираемся использовать этот файл. Если вы читаете файл CSV, измените тип файла. В Weka, если вы не укажете какой-либо входной файл, вы не сможете открыть раздел «Классификация». В Classify перейдите в окно «Список результатов», щелкните правой кнопкой мыши и загрузите модель, которую вы сохранили в последнем разделе. Это показано ниже:

Выберите «MinIOdtree.model». Затем щелкните «Поставляемый набор тестов» в «Параметры тестирования». Перейдите в папку MinIOlake и введите «Test.csv» в качестве входных данных.

Теперь нажмите «Дополнительные параметры». Убедитесь, что тип вывода - «Обычный текст».

Сделав это, щелкните правой кнопкой мыши панель «Список результатов». Щелкните «Переоценить модель на текущем наборе тестов».

Вот и все. Вы предсказали результаты, используя нашу модель:

Наконец, вы можете визуализировать дерево в Wek. Щелкните правой кнопкой мыши панель «Список результатов» и выберите «Визуализировать дерево», чтобы увидеть, как будет оцениваться ваша модель.

Бонус: Подключите MinIO от R

Некоторые из вас могут быть заядлыми программистами на R, и внедрение Weka может их не заинтересовать. Идея для тех, кто любит R, вот в чем:

  • Загрузите пакет RPresto и установите его в свою среду R.
  • Убедитесь, что Presto и MinIO запущены. Опять же, НЕТ Улья.
  • Ниже приведен код:
install.packages(“RPresto”)
install.packages(“dplyr”)
install.packages(“dbplyr”)
my_db <- src_presto(catalog = “MinIO”, schema = “games”, user = “ravi”, host = “localhost”, port = 8080, session.timezone=’US/Eastern’)
my_tbl <- dplyr.tbl(my_db, “gamestats”)
my_tbl

4. Создается следующий вывод:

С переменной my_tble теперь вы можете писать все свои любимые вещи на R.

Подводя итог, давайте представим архитектурную схему того, что мы сделали.

Я использовал сервер на 64 ГБ и мог моделировать примерно 1,2 миллиарда строк с 8 атрибутами. Вы можете кластеризовать MinIO, кластер Presto для дополнительных улучшений. Вы можете использовать диски NVMe с разъемами RDMA для повышения пропускной способности.

Надеюсь, этот пост продемонстрировал, насколько простой и мощной может быть структура расширенной аналитики с объектным хранилищем MinIO. Если вы хотите получить дополнительную поддержку или продолжить разговор, свяжитесь со мной в LinkedIn.