Использование snowplow позволит сократить расходы на аналитику. Эта первая статья, с подробной инструкцием о том, как настроить весь процесс передачи событий из мобильного приложения в базу данных RedShift. В следующей статье подробно разберем как собрать дэшборд для просмотра собранных данных. Использование snowplow позволит сократить расходы на аналитику. Эта первая статья, с подробной инструкцием о том, как настроить весь процесс передачи событий из мобильного приложения в базу данных RedShift. В следующей статье подробно разберем как собрать дэшборд для просмотра собранных данных. В качестве вступления к статье отлично подходит содержание статьи от The Startup Founder’s Guide to Analytics Tristan Handy, на хабре есть перевод https://habr.com/ru/post/346326/
 Автор советует для аналитики использовать инструмент Snowplow: Будем считать, что звучит это достаточно убедительно. Есть замечательная инструкция Simo Ahava о настройке snowplow, которая нам сильно помогла, когда мы впервые настраивали snowplow Мы взяли эту статью за основу и адаптировали ее под использование snowplow для мобильного приложения и актуализировали некоторые детали, ибо за 2 года многое изменилось. Для всего процесса нам понадобятся: Вот схема того, что мы получим после выполнения всех инструкций в этой статье: Процесс будет описывать следующие шаги: Итак, весь процесс завершается на шаге сохранения данных в БД. Самое первое, что нужно сделать, это зарегистрироваться на Amazon Web Services и настроить IAM (Identity and Access Management) пользователя, от лица которого вы будете настраивать весь процесс. Итак, перейдите на https://aws.amazon.com/ и создайте бесплатную учетную запись. Бесплатная учетная запись дает вам доступ к бесплатному периоду пользования услугами, некоторые из которых также помогут снизить затраты. После того, как вы создали учетную запись, вы можете сделать первое важное действие при настройке конвейера: создать пользователя IAM. Для этих шагов мы будем следовать руководству по настройке IAM Snowplow. В меню Services выберите IAM из длинного списка элементов. Теперь в левом меню выберите «Policy». Теперь вернитесь в «Groups» из меню слева и щелкните имя группы «snowplow-setup», чтобы открыть ее настройки. Теперь выберите «Users» в левом меню и нажмите кнопку «Add user». На следующем экране вы увидите сообщение об успешном создании вашего пользователя, его идентификатор и ключи, которые вы должны скопировать в безопасное место – они вам скоро понадобятся. Вы также можете скачать их в виде файла CSV, нажав кнопку «Download .csv». Отлично, вы создали пользователя, с которым вы теперь будете работать. Когда вы все настроите, надо будет создать нового пользователя с меньшим количеством разрешений, но пока что все. Поздравляем, шаг 0 выполнен! Clojure Collector — это, по сути web-endpoint, на который вы будете отправлять события из приложения. То есть это такой масштабируемый веб-сервис, работающий на Apache Tomcat, который размещен на AWS Elastic Beanstalk. Clojure Collector настроен для автоматического экспорта логов Tomcat непосредственно в хранилище AWS S3, то есть всякий раз, когда приложение отправляет события в Clojure Collector, он регистрирует этот запрос как запись журнала доступа. Первое, что вам нужно сделать, это загрузить файл WAR Clojure Collector. Скачать файл вы можете по этой ссылке. В списке вы должны найти файл clojure-collector-1.X.X-standalone.war. После завершения скачивания файла, вы можете настроить приложение Elastic Beanstalk. В панеле AWS в меню Services и выберите раздел Elastic Beanstalk. На этом этапе обязательно проверьте, что все сервисы AWS, которые вы используете для Snowplow, расположены в одном регионе. Существуют различия в том, какие сервисы поддерживаются в зависимости от региона. Вы можете изменять параметры региона в правом верхнем углу. Вернемся к настройке Elastic Beanstalk Если Clojure Collector работает правильно, то вы должны увидеть пустую страницу с пикселем посередине. Откройте консоль в браузере, и во вкладке Applications в разделе cookie найдите файл с именем sp. Если вы его увидели, значит вы все сделали правильно. Поздравляю! Вы настроили Clojure Collector. Однако мы еще не закончили. Автоматическая запись логов Tomcat в S3 хранилище – неотъемлемая часть всего процесса. Мы будем работать с обычными логами веб-сервера, в которых подробно описаны все HTTP-запросы, отправленные на наш сервер, включая заголовки и тело запросов. Чтобы включить логирование в S3, вам необходимо настроить конфигурацию только что созданного приложения Elastic Beanstalk. Перейдите в ваше приложения в разделе Elastic Beanstalk в панели AWS. Это важный шаг, благодаря которому, все логи будут храниться в S3 готовые для ETL. Щелкните «Apply», чтобы применить изменение. С недавних пор, приложения Elastic Beanstalk по-умолчанию разворачивают в режиме auto-scalable, но стоит это проверить. Отлично, работаем дальше. Теперь приступим к настройке поддомена и его роутинга к созданному балансировщику нагрузки. Как видите, указаны четыре NS-записи для snowplow.denjoy.ru, каждая из которых указывает на один из четырех соответствующих адресов NS в зоне AWS. В течение некоторого времени ваш провайдер должен обновить данные и ваш хост будет доступен. Вы можете проверить обновились ли записи при помощи онлайн-сервисов, например, https://dnschecker.org/. Теперь, когда вы настроили записи собственного домена, указывающие на вашу зону хостинга Route 53, вас осталось выполнить всего одно действие. Вам нужно будет связать ваш домен, который уже адресован в Route 53 с приложением Elastic Beanstalk. Таким образом, при вводе URL-адреса snowplow.denjoy.ru в адресную строку браузера, запись DNS сначала направляет его в размещенную зону AWS, где новая А-запись перенаправляет трафик на Clojure Collector. Уф! Теперь, если вы откроете в браузере http://snowplow.denjoy.ru/i, вы должны увидеть тот же пиксель, что и при открытии страницы Clojure Collector. Итак, маршрутизация домена работает! Но мы ВСЕ ЕЩЕ не закончили. Для этого вам нужно будет сгенерировать (бесплатный) SSL-сертификат AWS и применить его к Load Balancer. К счастью, с помощью Route 53, это сделать легко и просто. В первую очередь надо сгенерировать сертификат SSL После нажатия на кнопку Create вы должны увидеть сообщение об успешном выполнении операции. Теперь вы можете нажать кнопку «Continue» в нижней части экрана. Подтверждение сертификата может занять до 30 минут, так что можете выпить чашечку кофе! На этом шаге вы также можете взглянуть на это руководство Snowplow для дальнейшей настройки Clojure Collector (например, настройки масштабирования балансировщика нагрузки). Все, что мы сделали на этом шаге может показаться запутанным, но в этом есть определенная логика. Однако настройка собственного домена — это немного сложная задача. Но если вы используете Route 53, то задача становится тривиальной. Установите приложение Android Tracker для тестирования. После установки откройте приложение Tracker Demo, у меня на устройстве постоянно всплывает ошибка, которую я просто игнорирую, просто нажимайте «Ok» при появлении уведомления. Введите ваш домен, в моем случае это https://snowplow.denjoy.ru, установите протокол HTTPS и отправьте тестовые события нажатием на кнопку «Start». Вы должны увидеть в логах сообщения об успешной отправке посылок. . Каждый час Clojure Collector, работающий в Elastic Beanstalk, выгружает все логи Tomcat в S3. Вы должны проверить, правильно ли сохраняются логи в S3 В S3 будет директория с префиксом elasticbeanstalk-region-id. В этой директории перейдите к папке resources / environment / logs / publish / (some ID) / (some ID). Some ID – это папка с именем, например, e-ab12cd23ef, а внутри нее будет папка с именем, например, i-1234567890. В этой конечной папке будут все ваши логи в формате gzip. Найдите те, которые называются _var_log_tomcat8_rotated_localhost_access_log.txt123456789.gz – это логи, которые ETL будет использовать для построения данных. Если вы откроете один из этих файлов, вы должны найти кучу запросов. Найдите запросы с HTTP-статусом 200. Если вы их видите, это означает, что Clojure Collector выполняет свою работу. Скачайте файл и откройте с помощью любого текстового редактора. Вы увидите примерно следующее: Если вы декодируете эту строку, вы должны увидеть JSON с параметрами запроса. Этот этап проще предыдущих. Вкратце, вот основные этапы, выполняемые сервисом AWS Elastic MapReduce (EMR). Сейчас мы подробно рассмотрим эти шаги. Важно понимать, что каждый шаг процесса ETL оставляет след в S3-бакетах. Это означает, что даже если вы решите применить текущий процесс к необработанным логам, вы можете повторно запустить обработку всей истории логов. Все логи Tomcat тоже сохраняются, поэтому вы всегда сможете начать весь процесс с нуля, используя все ваши старые данные. В этом процессе мы будем работать с запуском Java-приложения EmrEtlRunner с вашего локального компьютера. Это приложение инициирует и запускает процесс ETL с помощью Amazon Elastic MapReduce. Для работы в продакшен, вы можете запустить EmrEtlRunner на любой виртуальной машине. Таким образом, вы можете запланировать его запуск, скажем, каждые 60 минут и автоматически выгружать данные. ETL — это приложение для Unix, которое вы можете скачать по этой ссылке. Чтобы получить последнюю версию, найдите файл, который начинается с snowplow_emr_rXX, где XX — максимальное число. На момент написания самый последний двоичный файл snowplow_emr_r117_biskupin.zip. Если у вас не установлен Git, сейчас самое подходящее время для этого. В итоге у вас должна получиться такая структура папок и файлов: На этом этапе вам необходимо создать пару закрытых ключей в Amazon EC2. Процесс ETL будет выполняться на виртуальных машинах в облаке Amazon, и крутиться на Amazon EC2. Чтобы ETL имел полные права на создание этих машин и управления ими, вам необходимо предоставить ему права контроля доступа, а для этого нужна пара ключей. Теперь вам нужно создать несколько бакетов в Amazon S3. Они будут использоваться процессом для управления всеми вашими файлами данных на различных этапах процесса ETL. Вам понадобятся бакеты для следующего: Чтобы создать эти корзины, перейдите в S3, щелкнув Services в верхней панели навигации AWS и выберите S3. У вас уже должен быть ваш :raw:in бакет, оно начинается с elasticbeanstalk-. Начнем с создания нового бакета, который будет содержать все «вложенные папки» для ETL. Щелкните «Create bucket» и дайте имя бакету, например denjoy-snowplow-data. Имя бакета должно быть уникальным для глобального S3, поэтому вы не можете просто назвать его snowplow. Нажмите кнопку «Next» пару раз, а затем, наконец, «Create bucket». Теперь щелкните название вашего бакета, чтобы открыть его. Вы увидите: Нажмите «Create folder» и создайте три папки в этом пустом бакете: Затем в archive создайте следующие три папки: Затем, как в enriched, так и в shredded, создайте две папки: Таким образом, у вас должен получиться бакет, имеющий следующую структуру: Теперь создайте еще один бакет в S3 с именем denjoy-snowplow-log. Будем его использовать для логов, создаваемых ETL. Теперь нужно настроить EmrEtlRunner. Сейчас нам понадобится config.yml файл, который скопировали из репозитория snowplow в папку config/. Для конфига вам понадобятся следующее: После того, как вы установите awscli, вам нужно запустить aws configure в своем терминале и проследовать инструкции. Вам понадобится ваш идентификатор ключа доступа и секретный ключ доступа, а также название региона, у меня, например, eu-west-1. После запуска aws configure вам нужно будет выполнить следующую команду aws emr create-default-rules. Таким образом вы создадите роли по-умолчанию для EmrEtlRunner, чтобы он мог выполнять необходимые задачи в EC2. После этих шагов вы готовы к настройке EmrEtlRunner! EmrEtlRunner — это загруженная ранее утилита с именем файла snowplow-emr-etl-runner. EmrEtlRunner делает очень много чего полезного. См. этот репозиторий для более подробной информации. На этом этапе мы выполним все шаги, кроме шага 13, rdb_load. На этом этапе данные копируются в реляционную базу данных. Мы выполним эту задачу на следующем шаге. Конфигурация EmrEtlRunner настраивается с помощью файла config.yml, который вы скопировали в папку config. Я покажу вам конфигурацию, которую я использую, и покажу, что вам нужно изменить. Далее перечислены параметры, которые нужно изменить, с комментариями о том, как их редактировать. Все оставшиеся можно оставить со значениями по-умолчанию. Я настоятельно рекомендую вам прочитать документацию по конфигурации, чтобы узнать, за что отвечают оставшиеся параметры для более гибкой настройки. Отметим всего два момента. Во-первых, при копировании :aws:s3:buckets:raw:in пути не копируйте последнее имя папки. Это идентификатор экземпляра. Если для сборщика настроена среда с автоматическим масштабированием, в этом сегменте может быть несколько папок. Если вы укажете только одну папку, вы рискуете потерять данные. Параметр :aws:emr:ec2_subnet_id вы можете получить, открыв меню Services в AWS и нажав EC2. Щелкните ссылку «Instances», выберите единственный процесс и у вас откроется страница с параметрами. Скопируйте поле «subnet» и вставьте его в aws:emr:ec2_subnet_id. Если вы выполнили все этапы на этом шаге, то теперь все готово. Вы можете убедиться, что все работает, выполнив следующую команду в каталоге, где находится snowplow-emr-etl-runner. Если вы увидите ошибку в терминале Тогда воспользуйтесь инструкцией После успешного завершения ETL вы можете проверить бакеты S3. Теперь они должны содержать много новых папок и файлов. Если вы смогли запустить ETL, то в этом нудном руководстве остается только настроить AWS Redshift, в которой вы будете хранить свои аналитические данные! На этом этапе мы загрузим измельченные данные в таблицы Redshift. Redshift — это сервис хранилища данных, предлагаемый AWS. Мы будем использовать его в качестве базы данных, где каждая таблица хранит данные, извлеченные из логов Tomcat. С помощью SQL запросов мы сможем получать эти данные. Кстати, если вы не знакомы с SQL, то по ссылке замечательный курс Codecademy, который поможет вам начать работу с SQL! Сейчас последовательно будем выполнять пункты: После выполнения этих пунктов, каждый раз, когда будет запущен EmrEtlRunner, таблицы будут заполняться проанализированными данными трекера. Затем вы можете выполнить SQL-запросы к этим данным и использовать их для выполнения двух оставшихся шагов (не описанных в этом руководстве) Snowplow: моделирования и анализа данных. В сервисах AWS выберите Amazon Redshift. Очередной раз проверьте, что вы находитесь в правильном регионе (в том, где вы работали все время). Затем нажмите кнопку «Launch Cluster». Задайте кластеру идентификатор. Я назвал свой кластер snowplow-cluster. Введите имя базы данных. Я назвал snowplow. Значение Node type установите dc2.large, а Cluster type установите Single Node с 1 узлом. Порт для базы данных оставьте по-умолчанию (5439). Введите имя пользователя и пароль для своего супер-пользователя. Это пользователь, с которым вы сначала войдете в систему, и с ним вы создадите остальных пользователей и все необходимые таблицы. Не забудьте записать их где-нибудь — они вам понадобятся совсем скоро. В следующей форме оставьте для двух параметров значения по-умолчанию. Когда будете готовы, нажмите «Create cluster». Кластер начнет создаваться. Для запуска кластера потребуется несколько минут. Его статус вы можете видеть в панели управления Redshift. Первое, что вам нужно сделать, это убедиться, что кластер принимает входящее соединение с вашего локального компьютера. Для этого в разделе «Clusters» кликните по имени своего кластера, чтобы перейти на детальную страницу. Во вкладке «Properties» в разделе «Network and security» щелкните ссылку на VPC security groups (она должна называться примерно так sg-c3f5c687). Вы должны перейти в панель управления EC2. Внизу экрана должны быть видны настройки для выбранной вами группы безопасности. Выберите вкладку «Inbound rules» и убедитесь, что TCP-соединение установлено на порту 5439 и 0.0.0.0/0 в качестве источника. Это означает, что разрешены все входящие TCP-соединения (позже вы можете изменить политику доступа). Если значения отличаются, соответственно измените их. Пришло время подключиться к кластеру. Вернитесь в Amazon Redshift и откройте настройки кластера. Скопируйте ссылку на кластер из верхней части списка настроек. Затем откройте инструмент запросов SQL. Я использую Table Plus. Кликните «Create new connection» и создайте новое соединение со следующими настройками: В качестве имени пользователя и пароля введите имя и пароль супер-пользователя, которые вы назначили при создании кластера. Пример моих настроек: После этого вы можете нажать «Connect», и вы подключитесь к вашему кластеру и базе данных. После подключения вы можете отправить команду SELECT current_database(); и нажать кнопку «Run current», чтобы проверить, все ли работает. Вот что вы должны увидеть: Если вы увидите имя вашей базы данных – все готово! Во-первых, нам нужно создать таблицы, в которых будут храниться данные Android Tracker. Таблицы загружаются в виде .sql файлов, и эти файлы содержат конструкции DDL, которые создают все необходимые схемы и таблицы. Для этого вам нужны .sql файлы схемы, которые вы найдете в репозитории Snowplow: Сначала загрузите и запустите atomic-def.sql в Table Plus. Вы должны увидеть сообщение об успешном создании схемы atomic и таблицы atomic.events. Затем запустите manifest-def.sql. Вы также должны увидеть сообщение об успешном создании. Теперь вам нужно загрузить все DDL для схем мобильного трекера. Если вы не создадите эти таблицы, ETL будет падать в ошибку, когда утилита попытается импортировать события в несуществующие таблицы. Вы можете найти все необходимые .sql файлы по следующим ссылкам: Когда вы закончите, вы сможете запустить следующий SQL-запрос и увидеть список всех таблиц, которые вы только что создали : Теперь создадим трех пользователей: Скопируйте и вставьте следующие SQL-запросы. Для каждого из них придумайте пароль ($password) и убедитесь, что вы записали комбинации пользователь + пароль. Если все пройдет хорошо, вы должны увидеть сообщение о 12 успешных операциях. И, наконец, необходимо предоставить права на все таблицы в схеме atomic для пользователя storageLoader, потому что этому пользователю нужно будет запускать команды. Итак, сначала выполните запрос: В результатах запроса вы должны увидеть несколько запросов: Скопируйте эти строки и вставьте в поле запросов и запустите их. Теперь, если вы запустите команду вы должны увидеть все таблицы. Пользователи для базы данных созданы, теперь осталось только настроить EmrEtlRunner для выполнения последнего шага ETL, когда storageloader-пользователь копирует все данные из S3 в соответствующие таблицы Redshift. EmrEtlRunner будет копировать файлы в Redshift с помощью утилиты под названием RDB Loader (Загрузчик реляционной базы данных). Чтобы этому интрументы хватило прав на выполнение, вам необходимо создать новую IAM-роль, которая предоставляет кластеру Redshift доступ только для чтения к вашим S3-бакетам. Вернемся к нашему проекту, созданному на шаге 3, в каталоге вашего проекта config/ должна быть папка targets/ с файлом redshift.json. Откройте redshift.json и убедитесь, что он выглядит примерно так: Вот поля, которые вам нужно отредактировать: Все остальные параметры можно оставить со значениями по-умолчанию. Теперь, когда вы настроили все, вы готовы запустить EmrEtlRunner, который скопирует все данные в ваши таблицы Redshift. Команда, которую вам нужно запустить в корне папки вашего проекта (где находится snowplow-emr-etl-runner исполняемый
 файл): Эта команда обработает все данные в :raw:in бакете (тот, который содержит все ваши логи Tomcat) и приступит к их извлечению и преобразованию и, наконец, загрузит их в ваши таблицы Redshift. Процесс займет некоторое время, так что выпейте чашечку кофе. По завершению вы должны увидеть в командной строке что-то вроде этого: Подключитесь к базе данных под read_only пользователем. Откройте таблицы и вы увидите некоторые ваши данные Учитывая, сколько времени вы, вероятно, потратили на то, чтобы все заработало (при усердном следовании этому руководству), я искренне надеюсь, что все работает исправно и вы увидели данные Следуя этому руководству, вы сможете настроить пакетный конвейер Snowplow. Здесь так много нюансов и тонких деталей, что, возможно, в какой-то момент вы ошибетесь – тогда заново пройдитесь по этому руководству и проверьте, не пропустили ли вы что-нибудь. Не стесняйтесь задавать вопросы в комментариях, и, возможно, я или мои читатели сможем вам помочь. Вы также можете присоединиться к обсуждениям на сайте Discourse Snowplow — я уверен, что люди там будут более чем рады помочь вам, если у вас возникнут проблемы с настройкой. Удачи! Веб-студия