Инструкция настройка Snowplow для мобильной аналитики


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

В качестве вступления к статье отлично подходит содержание статьи от The Startup Founder’s Guide to Analytics Tristan Handy, на хабре есть перевод https://habr.com/ru/post/346326/

Автор советует для аналитики использовать инструмент Snowplow:

«Мигрируйте из существующих систем аналитики и отслеживания событий в Snowplow Analytics. Snowplow делает всё, что делают платные инструменты, но это продукт с открытым исходным кодом. Вы можете либо хостить его самостоятельно (и просто оплачивать расходы на свои экземпляры EC2), либо платить за размещение сборщика событий в Snowplow или Fivetran. Если вы не сделаете переход на этом этапе, вам не удастся собрать гораздо более подробные данные, и приготовьтесь к реально огромным счетам из Segment, Heap или Mixpanel в ближайшем будущем. Когда вы пройдете этот этап, платные инструменты могут с легкостью брать с вас по 10 000 долларов в месяц.»

Будем считать, что звучит это достаточно убедительно. Есть замечательная инструкция Simo Ahava о настройке snowplow, которая нам сильно помогла, когда мы впервые настраивали snowplow

Мы взяли эту статью за основу и адаптировали ее под использование snowplow для мобильного приложения и актуализировали некоторые детали, ибо за 2 года многое изменилось.

Начало

Для всего процесса нам понадобятся:

  • Командная строка Linux / Unix (легко доступна через приложение Terminal в Mac OS X).
  • Клиент Git - не обязательно, но он упрощает клонирование репозитория Snowplow.
  • Новая учетная запись Amazon Web Services с бесплатным периодом пользования первые 12 месяцев.
  • Кредитная карта.
  • Доменное имя моего собственного (я использовал snowplow.denjoy.ru), чьи DNS записи можно изменить (можно пропустить).
  • Устройство Android с установленным приложением Snowplow Tracker
  • Много времени.

Что мы получим в итоге?

Вот схема того, что мы получим после выполнения всех инструкций в этой статье:

image5

Процесс будет описывать следующие шаги:

  • Приложение будет отправлять данные коллектору, написанному с помощью Clojure Collector.
  • Коллектор работает как веб-сервис на AWS Elastic Beanstalk, на который приложение отправляет зашифрованные данные от моего личного доменного имени с помощью AWS Route 53.
  • Данные журнала из коллектора хранятся в AWS S3.
  • Утилита периодически выполняется на моей локальной машине, которая работает в ETL (extract, transform, load), используя AWS EMR, который в свою очередь обрабатывает и сохраняет данные в S3.
  • Эта же утилита сохраняет обработанные файлы данных в реляционных таблицах в AWS Redshift.

Итак, весь процесс завершается на шаге сохранения данных в БД.

Шаг 0: Зарегистрируйтесь на AWS и настройте IAM-роли

Что вам понадобится для этого шага

Зарегистрируйтесь на AMR

Самое первое, что нужно сделать, это зарегистрироваться на Amazon Web Services и настроить IAM (Identity and Access Management) пользователя, от лица которого вы будете настраивать весь процесс.

Итак, перейдите на https://aws.amazon.com/ и создайте бесплатную учетную запись.

image12

Бесплатная учетная запись дает вам доступ к бесплатному периоду пользования услугами, некоторые из которых также помогут снизить затраты.

Создание пользователя для управления идентификацией и учетными записями (IAM)

После того, как вы создали учетную запись, вы можете сделать первое важное действие при настройке конвейера: создать пользователя IAM. Для этих шагов мы будем следовать руководству по настройке IAM Snowplow.

В меню Services выберите IAM из длинного списка элементов.

image39
  • В меню слева выберите «Groups».
  • Щелкните «Create new group» в открывшемся представлении.
image24
  • Назовите группу snowplow-setup и кликните «Next step».
  • Пропустите шаг «Attach Policy», нажав кнопку «Next step».
  • Щелкните «Create Group».

Теперь в левом меню выберите «Policy».

  • Щелкните «Create Policy».
image17
  • Выберите вкладку JSON и замените содержимое следующим:
  {
    "Version": "2012-10-17",
    "Statement": [
      { "Effect":
        "Allow",
        "Action": [
          "acm:*",
          "autoscaling:*",
          "aws-marketplace:ViewSubscriptions",
          "aws-marketplace:Subscribe",
          "aws-marketplace:Unsubscribe",
          "cloudformation:*",
          "cloudfront:*",
          "cloudwatch:*",
          "ec2:*",
          "elasticbeanstalk:*",
          "elasticloadbalancing:*",
          "elasticmapreduce:*",
          "es:*",
          "iam:*",
          "rds:*",
          "redshift:*",
          "s3:*",
          "sns:*"
        ],
        "Resource": "*"
      }
    ]
  }
image49
  • Затем нажмите кнопку «Review policy».
  • Назовите политику snowplow-setup-policy-infrastructure.
  • Нажмите «Create Policy».

Теперь вернитесь в «Groups» из меню слева и щелкните имя группы «snowplow-setup», чтобы открыть ее настройки.

image37
  • Перейдите на вкладку Permissions и нажмите «Attach Policy».
  • В открывшемся списке выберите Snowplow-setup-policy-Infrastructure и нажмите «Attach Policy».
image19 image20

Теперь выберите «Users» в левом меню и нажмите кнопку «Add user».

  • Назовите пользователя snowplow-setup.
  • Установите чекбокс «Programmatic access».
  • Щелкните «Next: Permissions».
  • В секции «Add user to group», выберите чекбокс рядом с snowplow-setup, и нажмите кнопку «Next: Tags»
  • В следующем разделе оставьте все поля пустыми и кликните «Next: Tags»
  • Нажмите «Create user».
image58

На следующем экране вы увидите сообщение об успешном создании вашего пользователя, его идентификатор и ключи, которые вы должны скопировать в безопасное место – они вам скоро понадобятся. Вы также можете скачать их в виде файла CSV, нажав кнопку «Download .csv».

image61

Отлично, вы создали пользователя, с которым вы теперь будете работать. Когда вы все настроите, надо будет создать нового пользователя с меньшим количеством разрешений, но пока что все.

Поздравляем, шаг 0 выполнен!

Что у вас должно получиться после этого шага

  • Вы должны были успешно зарегистрировать новую учетную запись в AWS.
  • У вас должен быть новый IAM-пользователь snowplow-setup со всеми правами доступа.

Шаг 1: Clojure collector

Что вам понадобится для этого шага

  • Ваше доменное имя и доступ к его конфигурации DNS

Приступим

Clojure Collector - это, по сути web-endpoint, на который вы будете отправлять события из приложения. То есть это такой масштабируемый веб-сервис, работающий на Apache Tomcat, который размещен на AWS Elastic Beanstalk. Clojure Collector настроен для автоматического экспорта логов Tomcat непосредственно в хранилище AWS S3, то есть всякий раз, когда приложение отправляет события в Clojure Collector, он регистрирует этот запрос как запись журнала доступа.

Настройка Clojure Collector

Первое, что вам нужно сделать, это загрузить файл WAR Clojure Collector.

Скачать файл вы можете по этой ссылке. В списке вы должны найти файл clojure-collector-1.X.X-standalone.war.

После завершения скачивания файла, вы можете настроить приложение Elastic Beanstalk.

В панеле AWS в меню Services и выберите раздел Elastic Beanstalk.

image26

На этом этапе обязательно проверьте, что все сервисы AWS, которые вы используете для Snowplow, расположены в одном регионе. Существуют различия в том, какие сервисы поддерживаются в зависимости от региона. Вы можете изменять параметры региона в правом верхнем углу.

image9

Вернемся к настройке Elastic Beanstalk

  • Щелкните ссылку «Create Application».
  • Введите имя приложения (например, Snowplow Clojure Collector).
  • В разделе Platform выберите Tomcat, Tomcat 8.5 with Java 8 running on 64bit Amazon Linux
  • В разделе Application Code выберите «Upload your code» и в поле ниже загрузите скачанный ранее WAR-файл.
image31 image46
  • Кликните по кнопку «Create application»
  • После этого вас перекинет на экран установки, дождитесь завершения
image50 image28

Если Clojure Collector работает правильно, то вы должны увидеть пустую страницу с пикселем посередине. Откройте консоль в браузере, и во вкладке Applications в разделе cookie найдите файл с именем sp. Если вы его увидели, значит вы все сделали правильно.

image6

Поздравляю! Вы настроили Clojure Collector.

Однако мы еще не закончили.

Логирование в S3

Автоматическая запись логов Tomcat в S3 хранилище – неотъемлемая часть всего процесса. Мы будем работать с обычными логами веб-сервера, в которых подробно описаны все HTTP-запросы, отправленные на наш сервер, включая заголовки и тело запросов.

Чтобы включить логирование в S3, вам необходимо настроить конфигурацию только что созданного приложения Elastic Beanstalk. Перейдите в ваше приложения в разделе Elastic Beanstalk в панели AWS.

  • Затем выберите Конфигурация в левом меню.
  • Щелкните по кнопке «Edit» в блоке «Software Configuration».
image3
  • В разделе «S3 log storage» установите флажок «Rotate logs».
image1

Это важный шаг, благодаря которому, все логи будут храниться в S3 готовые для ETL.

Щелкните «Apply», чтобы применить изменение.

Настройка балансировщика

С недавних пор, приложения Elastic Beanstalk по-умолчанию разворачивают в режиме auto-scalable, но стоит это проверить.

  • Еще раз перейдите в раздел «Configuration» вашего приложения.
  • Найдите раздел «Capacity» и кликните по кнопке «Edit».
  • В меню «Environment Type» убедитесь, что выбран тип «Load balanced», если нет, то установите тип и сохраните настройки.
image54

Отлично, работаем дальше.

Создание поддомена для приложения Elastic Beanstalk и выпуск SSL сертификата

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

  • Откройте меню Services в консоли AWS и выберите «Route 53» из списка.
  • На открывшейся странице кликните «Create hosted zone».
  • В поле Domain Name введите домен, который вы будете использовать. В примере snowplow.denjoy.ru. Выберите тип «Public Hosted Zone» и нажмите «Create hosted zone».
image21
  • На открывшейся странице вы увидите настройки для вашего домена. Обратите внимание на четыре записи NS. Они понадобятся вам на следующем шаге.
image33
  • Теперь перейдите к регистратору домена или в сервис, где вы управляете NS записями домена, в моем случае это cloudflare.
  • Добавьте 4 NS-записи к своему домену. Вот как будут выглядеть изменения в моей панели управления CloudFlare:
image47

Как видите, указаны четыре NS-записи для snowplow.denjoy.ru, каждая из которых указывает на один из четырех соответствующих адресов NS в зоне AWS. В течение некоторого времени ваш провайдер должен обновить данные и ваш хост будет доступен.

Вы можете проверить обновились ли записи при помощи онлайн-сервисов, например, https://dnschecker.org/.

Теперь, когда вы настроили записи собственного домена, указывающие на вашу зону хостинга Route 53, вас осталось выполнить всего одно действие. Вам нужно будет связать ваш домен, который уже адресован в Route 53 с приложением Elastic Beanstalk. Таким образом, при вводе URL-адреса snowplow.denjoy.ru в адресную строку браузера, запись DNS сначала направляет его в размещенную зону AWS, где новая А-запись перенаправляет трафик на Clojure Collector. Уф!

  • Итак, в созданной зоне нажмите «Create Record».
image32
  • На следующей странице выберите «Simple Routing»
  • В следующем разделе кликните «Define simple record»
  • В открывшемся окне поле Record name оставьте пустым, в поле Value/Route traffic to выберите «Alias to Elastic Beanstalk environment», в следующем поле выберите регион, в поле Record type выберите «A-records» и кликните по кнопке «Define simple record» в нижнем углу окна
image7
  • После закрытия окна кликните по кнопке «Create records»
  • Теперь, если вы откроете в браузере http://snowplow.denjoy.ru/i, вы должны увидеть тот же пиксель, что и при открытии страницы Clojure Collector. Итак, маршрутизация домена работает!

    Но мы ВСЕ ЕЩЕ не закончили.

    Настройка HTTPS для Clojure Collector

    Для этого вам нужно будет сгенерировать (бесплатный) SSL-сертификат AWS и применить его к Load Balancer. К счастью, с помощью Route 53, это сделать легко и просто. В первую очередь надо сгенерировать сертификат SSL

    • В разделе Services найдите и выберите AWS Certificate Manager. Под разделом «Provision certificates» нажмите на кнопку «Get started»
    • На следующей странице выберите «Request a public certificate» и переходите дальше
    • Введите домен, для которого вы хотите выпустить сертификат. То есть в моем случае snowplow.denjoy.ru и нажмите «Next»
    • В следующем разделе выберите «DNS validation»
    • На следующей странице Tags можете оставить все поля пустыми
    • Нажмите «Review» и на следующей странице кликните «Confirm and request»
    • Теперь вам необходимо подтвердить право на домен. К счастью, в экосистеме AWS сделать это достаточно просто, кликните по кнопке «Create record in Route 53»
    image40
    • После открытия окна нажмите на кнопку «Create»
    image35

    После нажатия на кнопку Create вы должны увидеть сообщение об успешном выполнении операции. Теперь вы можете нажать кнопку «Continue» в нижней части экрана. Подтверждение сертификата может занять до 30 минут, так что можете выпить чашечку кофе!

    Меняем настройка Load Balancer для поддержки HTTPS

    • Откройте Elastic Beanstalk, выберите свое приложение и перейдите в раздел «Configuration». Вы уже должны уметь делать с закрытыми глазами!
    • В блоке «Load balancer» нажмите «Edit»
    • В открывшейся форме в разделе «Listeners» нажмите на кнопку «Add listener»
    • В открывшемся окне в поле Port введите 443, выберите только что созданный сертификат и нажмите «Add».
    image25
    • После закрытия окна внизу странице нажмите «Apply»

    Все сделано!

    На этом шаге вы также можете взглянуть на это руководство Snowplow для дальнейшей настройки Clojure Collector (например, настройки масштабирования балансировщика нагрузки).

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

    Однако настройка собственного домена - это немного сложная задача. Но если вы используете Route 53, то задача становится тривиальной.

    Что у вас должно получиться после этого шага

    • Запущен Clojure Collector, работающий в среде Elastic Beanstalk.
    • Ваш собственный домен, настроенный в Amazon Route 53.
    • Настроен SSL-сертификат для вашего домен.
    • Автоматический экспорт логов Tomcat в S3. Логи выгружаются в S3 каждый час.

    Шаг 2: трекер

    Установите приложение Android Tracker для тестирования. После установки откройте приложение Tracker Demo, у меня на устройстве постоянно всплывает ошибка, которую я просто игнорирую, просто нажимайте «Ok» при появлении уведомления.

    Введите ваш домен, в моем случае это https://snowplow.denjoy.ru, установите протокол HTTPS и отправьте тестовые события нажатием на кнопку «Start». Вы должны увидеть в логах сообщения об успешной отправке посылок.

    .

    Каждый час Clojure Collector, работающий в Elastic Beanstalk, выгружает все логи Tomcat в S3. Вы должны проверить, правильно ли сохраняются логи в S3

    image16

    В 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 будет использовать для построения данных.

    image13

    Если вы откроете один из этих файлов, вы должны найти кучу запросов. Найдите запросы с HTTP-статусом 200. Если вы их видите, это означает, что Clojure Collector выполняет свою работу. Скачайте файл и откройте с помощью любого текстового редактора. Вы увидите примерно следующее:

    image27

    Если вы декодируете эту строку, вы должны увидеть JSON с параметрами запроса.

    image51

    Шаг 3. Настройте процесс ETL

    Что вам понадобится для этого шага

    • Настроенный Clojure Collector.
    • Идентификатор ключа доступа и секретный ключ доступа для пользователя IAM, созданные на 0 шаге.

    Начнем

    Этот этап проще предыдущих.

    Вкратце, вот основные этапы, выполняемые сервисом AWS Elastic MapReduce (EMR).

    • Каждую итерацию очищает старые логи Tomcat.
    • Дополнительное обогащение данных при обработке, например парсинг геолокации на основе IP-адреса.
    • Измельчает данные на маленькие части на основании заданных правил, которые описываются при помощи schema в формате JSON.
    • Наконец, импортирует измельченные данные в базу данных, созданную в Amazon Redshift.

    Сейчас мы подробно рассмотрим эти шаги. Важно понимать, что каждый шаг процесса ETL оставляет след в S3-бакетах. Это означает, что даже если вы решите применить текущий процесс к необработанным логам, вы можете повторно запустить обработку всей истории логов. Все логи Tomcat тоже сохраняются, поэтому вы всегда сможете начать весь процесс с нуля, используя все ваши старые данные.

    В этом процессе мы будем работать с запуском Java-приложения EmrEtlRunner с вашего локального компьютера. Это приложение инициирует и запускает процесс ETL с помощью Amazon Elastic MapReduce. Для работы в продакшен, вы можете запустить EmrEtlRunner на любой виртуальной машине. Таким образом, вы можете запланировать его запуск, скажем, каждые 60 минут и автоматически выгружать данные.

    Создание проекта EmrEtlRunner

    ETL - это приложение для Unix, которое вы можете скачать по этой ссылке. Чтобы получить последнюю версию, найдите файл, который начинается с snowplow_emr_rXX, где XX - максимальное число. На момент написания самый последний двоичный файл snowplow_emr_r117_biskupin.zip.

    • Загрузите этот ZIP-файл и скопируйте snowplow-emr-etl-runner в новую папку на жестком диске. Эта папка с вашим проектом.
    • На этом этапе вы также должны клонировать репозиторий Snowplow Github в эту же папку, тут же мы будем хранить все шаблоны файлов конфигурации и файлы SQL, которые понадобятся позже.
    • Итак, перейдите в каталог, в который вы скопировали snowplow-emr-etl-runner файл, и выполните следующую команду:
    git clone https://github.com/snowplow/snowplow.git

    Если у вас не установлен Git, сейчас самое подходящее время для этого.

    image56
    • Теперь у вас должен быть snowplow-emr-etl-runner и папка snowplow в одном каталоге.
    • Затем создайте новую папку с именем config и в ней новую папку с именем targets.
    • Затем выполните следующие операции копирования:
      • Скопируйте snowplow/3-enrich/emr-etl-runner/config/config.yml.sample в config/config.yml.
      • Скопируйте snowplow/3-enrich/config/iglu_resulver.json в config/iglu_resulver.json.
      • Скопируйте snowplow/4-storage/config/targets/redshift.json в config/targets/redshift.json.
    image55

    В итоге у вас должна получиться такая структура папок и файлов:

      |-- snowplow-emr-etl-runner
      |-- snowplow
      | |-- -SNOWPLOW GIT REPO HERE-
      |-- config
      | |-- iglu_resolver.json
      | |-- config.yml
      | |-- targets
      | | |-- redshift.json
      

    Создание ключей EC2

    На этом этапе вам необходимо создать пару закрытых ключей в Amazon EC2. Процесс ETL будет выполняться на виртуальных машинах в облаке Amazon, и крутиться на Amazon EC2. Чтобы ETL имел полные права на создание этих машин и управления ими, вам необходимо предоставить ему права контроля доступа, а для этого нужна пара ключей.

    • В AWS выберите Services нажмите EC2. В меню слева найдите «Key Pairs» и щелкните ссылку.
    • Сначала убедитесь, что вы работаете в том же регионе, в котором вы работали ранее. Регион выбирается в верхнем правом углу.
    • Убедившись, что вы выбран правильный регион, нажмите «Create key pair».
    image8
    • Задайте имя. Я назвал свою пару denjoy-snowplow.
    • Выберите тип pem
    • Когда вы закончите, вы увидите свою новую пару ключей в списке, и браузер автоматически загрузит файл <key pair name>.pem на ваш компьютер.
    image30

    Создание структуры S3

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

    Вам понадобятся бакеты для следующего:

    • :raw:in - он уже создан. Это идентификатор-региона elasticbeanstalk, созданный Clojure Collector’ом, работающим в Elastic Beanstalk.
    • :processin - промежуточный бакет для файлов логов перед их обогащением.
    • :archive - вам понадобятся три разных сегмента архива: :raw (для необработанных файлов лога), :enriched (для расширенных файлов) :shredded (для измельченных файлов).
    • :enriched - вам понадобятся два бакета для обогащенных данных: :good (для успешно обогащенных наборов данных), :bad (для тех, которые не смогли обогатить).
    • :shredded - вам также понадобятся два бакета для измельченных данных: :good (для наборов данных, успешно измельченных), :bad (для тех, которые не удалось измельчить).
    • :log - корзина для журналов, созданных процессом ETL.

    Чтобы создать эти корзины, перейдите в S3, щелкнув Services в верхней панели навигации AWS и выберите S3.

    У вас уже должен быть ваш :raw:in бакет, оно начинается с elasticbeanstalk-.

    Начнем с создания нового бакета, который будет содержать все «вложенные папки» для ETL.

    Щелкните «Create bucket» и дайте имя бакету, например denjoy-snowplow-data. Имя бакета должно быть уникальным для глобального S3, поэтому вы не можете просто назвать его snowplow. Нажмите кнопку «Next» пару раз, а затем, наконец, «Create bucket».

    Теперь щелкните название вашего бакета, чтобы открыть его. Вы увидите:

    image10

    Нажмите «Create folder» и создайте три папки в этом пустом бакете:

    • archive
    • shredded
    • enriched
    image15

    Затем в archive создайте следующие три папки:

    • raw
    • enriched
    • shredded

    Затем, как в enriched, так и в shredded, создайте две папки:

    • good
    • bad

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

      |-- elasticbeanstalk-region-id
      |-- denjoy-snowplow-data
      | |-- archive
      | | |-- raw
      | | |-- enriched
      | | |-- shredded
      | |-- encriched
      | | |-- good
      | | |-- bad
      | |-- shredded
      | | |-- good
      | | |-- bad
      

    Теперь создайте еще один бакет в S3 с именем denjoy-snowplow-log. Будем его использовать для логов, создаваемых ETL.

    Подготовка к настройке EmrEtlRunner

    Теперь нужно настроить EmrEtlRunner. Сейчас нам понадобится config.yml файл, который скопировали из репозитория snowplow в папку config/. Для конфига вам понадобятся следующее:

    • Идентификатор ключа доступа и секретный ключ доступа для snowplow-setup пользователя, которого создали еще на шаге 0. Если вы не сохранили их, вы можете создать новый ключ доступа через AWS IAM.
    • Нужно будет загрузить и установить интерфейс командной строки AWS. Вы можете использовать официальное руководство, чтобы установить его с помощью Python/pip, но если вы используете Mac OS X, я рекомендую вместо этого использовать Homebrew. После того, как вы установили Homebrew, вам просто нужно запустить brew install awscli для установки клиента AWS.

    После того, как вы установите awscli, вам нужно запустить aws configure в своем терминале и проследовать инструкции. Вам понадобится ваш идентификатор ключа доступа и секретный ключ доступа, а также название региона, у меня, например, eu-west-1.

      $ aws configure
      AWS Access Key ID: 
      AWS Secret Access Key: 
      Default region name: 
      Default output format: 
      

    После запуска aws configure вам нужно будет выполнить следующую команду aws emr create-default-rules. Таким образом вы создадите роли по-умолчанию для EmrEtlRunner, чтобы он мог выполнять необходимые задачи в EC2.

    После этих шагов вы готовы к настройке EmrEtlRunner!

    Настройка EmrEtlRunner

    EmrEtlRunner - это загруженная ранее утилита с именем файла snowplow-emr-etl-runner.

    EmrEtlRunner делает очень много чего полезного. См. этот репозиторий для более подробной информации. На этом этапе мы выполним все шаги, кроме шага 13, rdb_load. На этом этапе данные копируются в реляционную базу данных. Мы выполним эту задачу на следующем шаге.

    Конфигурация EmrEtlRunner настраивается с помощью файла config.yml, который вы скопировали в папку config. Я покажу вам конфигурацию, которую я использую, и покажу, что вам нужно изменить.

      aws:
        access_key_id: AKIAIBAWU2NAYME55123
        secret_access_key: iEmruXM7dSbOemQy63FhRjzhSboisP5TcJlj9123
        s3:
          region: eu-west-1
          buckets:
            assets: s3://snowplow-hosted-assets
            jsonpath_assets:
            log: s3://simoahava-snowplow-log
            raw:
              in:
                - s3://elasticbeanstalk-eu-west-1-375284143851/resources/environments/logs/publish/e-f4pdn8dtsg
              processing: s3://simoahava-snowplow-data/processing
              archive: s3://simoahava-snowplow-data/archive/raw
            enriched:
              good: s3://simoahava-snowplow-data/enriched/good
              bad: s3://simoahava-snowplow-data/enriched/bad
              errors:
                archive: s3://simoahava-snowplow-data/archive/enriched
            shredded:
              good: s3://simoahava-snowplow-data/shredded/good
              bad: s3://simoahava-snowplow-data/shredded/bad
              errors:
                archive: s3://simoahava-snowplow-data/archive/shredded
        emr:
          ami_version: 5.9.0
          region: eu-west-1
          jobflow_role: EMR_EC2_DefaultRole
          service_role: EMR_DefaultRole
          placement:
            ec2_subnet_id: subnet-d6e91a9e
            ec2_key_name: simoahava
          bootstrap: []
          software:
            hbase:
            lingual:
          jobflow:
            job_name: Snowplow ETL
            master_instance_type: m1.medium
            core_instance_count: 2
            core_instance_type: m1.medium
            core_instance_ebs:
              volume_size: 100
              volume_type: "gp2"
              volume_iops: 400
            ebs_optimized: false
            task_instance_count: 0
            task_instance_type: m1.medium
            task_instance_bid: 0.015
          bootstrap_failure_tries: 3
          configuration:
            yarn-site:
              yarn.resourcemanager.am.max-attempts: "1"
            spark:
              maximizeResourceAllocation: "true"
          additional_info:
        collectors:
          format: clj-tomcat
        enrich:
          versions:
            spark_enrich: 1.12.0
          continue_on_unexpected_error: false
          output_compression: NONE
        storage:
          versions:
            rdb_loader: 0.14.0
            rdb_shredder: 0.13.0
            hadoop_elasticsearch: 0.1.0
        monitoring:
          tags: {}
          logging:
            level: DEBUG
      

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

    Ключ Комментарий
    :aws:access_key_id Скопируйте и вставьте сюда идентификатор ключа доступа вашего пользователя IAM.
    :aws:secret_access_key Скопируйте и вставьте сюда секретный ключ доступа вашего пользователя IAM.
    :aws:s3:region Установите здесь регион, в котором расположены ваши бакеты S3.
    :aws:s3:buckets:log Измените это на имя бакета S3, который вы создали для логов ETL.
    -:aws:s3:buckets:raw:in Это бакет с папкой, в который автоматически помещаются логи Tomcat. Вам не нужно указывать последнюю папку в пути. Важно! Сохраните дефис в начале строки, как в примере файла конфигурации!
    :aws:s3:buckets:raw:processing Укажите путь для обработки данных во время выполнения процесса.
    :aws:s3:buckets:raw:archive Бакет для необработанных данных.
    :aws:s3:buckets:enriched:good Бакет для успешно обогащенных данных.
    :aws:s3:buckets:enriched:bad Бакет для неуспешно обработанных данных.
    :aws:s3:buckets:enriched:errors Оставьте этот параметр пустым.
    :aws:s3:buckets:enriched:archive Архив для обогащенных данных.
    :aws:s3:buckets:shredded:good Бакет для успешно измельченных данных.
    :aws:s3:buckets:shredded:bad Бакет для неуспешно измельченных данных.
    :aws:s3:buckets:shredded:errors Оставьте этот параметр пустым.
    :aws:s3:buckets:shredded:archive Бакет для архива измельченных данных
    :aws:emr:region Регион, в котором будет выполняться процесс EC2.
    :aws:emr:placement Оставьте этот параметр пустым.
    :aws:emr:ec2_subnet_id Идентификатор подсети виртуального частного облака VDS, в котором будет выполняться процесс. Вы можете использовать тот же идентификатор подсети, который использует EC2, на котором запущен ваш процесс.
    :aws:emr:ec2_key_name Имя созданной вами ранее пары ключей EC2.
    :collectors:format Введите clj-tomcat.
    :monitoring:snowplow Удалите этот ключ и все его дочерние (:method, :app_id и :collector).

    Отметим всего два момента.

    Во-первых, при копировании :aws:s3:buckets:raw:in пути не копируйте последнее имя папки. Это идентификатор экземпляра. Если для сборщика настроена среда с автоматическим масштабированием, в этом сегменте может быть несколько папок. Если вы укажете только одну папку, вы рискуете потерять данные.

    image38

    Параметр :aws:emr:ec2_subnet_id вы можете получить, открыв меню Services в AWS и нажав EC2. Щелкните ссылку «Instances», выберите единственный процесс и у вас откроется страница с параметрами. Скопируйте поле «subnet» и вставьте его в aws:emr:ec2_subnet_id.

    image48

    Если вы выполнили все этапы на этом шаге, то теперь все готово.

    Вы можете убедиться, что все работает, выполнив следующую команду в каталоге, где находится snowplow-emr-etl-runner.

    ./snowplow-emr-etl-runner run -c config/config.yml -r config/iglu_resulver.json
    image57

    Если вы увидите ошибку в терминале

    Invalid InstanceProfile: EMR_EC2_DefaultRule.

    Тогда воспользуйтесь инструкцией

    После успешного завершения ETL вы можете проверить бакеты S3. Теперь они должны содержать много новых папок и файлов.

    Если вы смогли запустить ETL, то в этом нудном руководстве остается только настроить AWS Redshift, в которой вы будете хранить свои аналитические данные!

    Что у вас должно получиться после этого шага

    • snowplow-emr-etl-runner сконфигурирован.
    • Созданы новые S3-бакеты.
    • Процесс ETL выполняется без ошибок и корректно создает полезные файлы в S3.

    Шаг 4: Загрузка данных в Redshift

    Что вам понадобится для этого шага

    • ETL настроен и вы можете его запустить из коммандной строки.
    • Измельченные данные хранятся в S3-бакете.
    • GUI SQL-запросов. Я рекомендую Table Plus, есть бесплатная ограниченная версия, но нам будет достаточно ее функционала. В руководтсве я использую именно ее.

    Приступим к последнему шагу

    На этом этапе мы загрузим измельченные данные в таблицы Redshift. Redshift - это сервис хранилища данных, предлагаемый AWS. Мы будем использовать его в качестве базы данных, где каждая таблица хранит данные, извлеченные из логов Tomcat. С помощью SQL запросов мы сможем получать эти данные. Кстати, если вы не знакомы с SQL, то по ссылке замечательный курс Codecademy, который поможет вам начать работу с SQL!

    Сейчас последовательно будем выполнять пункты:

    • Создание нового кластера и базы данных в Redshift.
    • Добавим пользователей и все необходимые таблицы в базу данных.
    • Настроим EmrEtlRunner для автоматической загрузки данных в таблицы Redshift.

    После выполнения этих пунктов, каждый раз, когда будет запущен EmrEtlRunner, таблицы будут заполняться проанализированными данными трекера. Затем вы можете выполнить SQL-запросы к этим данным и использовать их для выполнения двух оставшихся шагов (не описанных в этом руководстве) Snowplow: моделирования и анализа данных.

    Создание кластера

    В сервисах AWS выберите Amazon Redshift.

    Очередной раз проверьте, что вы находитесь в правильном регионе (в том, где вы работали все время). Затем нажмите кнопку «Launch Cluster».

    image52

    Задайте кластеру идентификатор. Я назвал свой кластер snowplow-cluster. Введите имя базы данных. Я назвал snowplow.

    Значение Node type установите dc2.large, а Cluster type установите Single Node с 1 узлом.

    Порт для базы данных оставьте по-умолчанию (5439).

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

    В следующей форме оставьте для двух параметров значения по-умолчанию.

    Когда будете готовы, нажмите «Create cluster».

    image53

    Кластер начнет создаваться.

    Для запуска кластера потребуется несколько минут. Его статус вы можете видеть в панели управления Redshift.

    image18

    Настройка кластера и подключение к нему

    Первое, что вам нужно сделать, это убедиться, что кластер принимает входящее соединение с вашего локального компьютера.

    Для этого в разделе «Clusters» кликните по имени своего кластера, чтобы перейти на детальную страницу.

    Во вкладке «Properties» в разделе «Network and security» щелкните ссылку на VPC security groups (она должна называться примерно так sg-c3f5c687).

    image2

    Вы должны перейти в панель управления EC2.

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

    Выберите вкладку «Inbound rules» и убедитесь, что TCP-соединение установлено на порту 5439 и 0.0.0.0/0 в качестве источника. Это означает, что разрешены все входящие TCP-соединения (позже вы можете изменить политику доступа).

    Если значения отличаются, соответственно измените их.

    image29

    Пришло время подключиться к кластеру. Вернитесь в Amazon Redshift и откройте настройки кластера. Скопируйте ссылку на кластер из верхней части списка настроек.

    image41

    Затем откройте инструмент запросов SQL. Я использую Table Plus. Кликните «Create new connection» и создайте новое соединение со следующими настройками:

    • Драйвер : Amazon Redshift (com.amazon.redshift.jdbc.Driver)
    • Host : ваш endpoint
    • User : awsuser
    • Password : master_password
    • Database: snowplow
    • В качестве имени пользователя и пароля введите имя и пароль супер-пользователя, которые вы назначили при создании кластера.

      Пример моих настроек:

      image34

      После этого вы можете нажать «Connect», и вы подключитесь к вашему кластеру и базе данных.

      После подключения вы можете отправить команду SELECT current_database(); и нажать кнопку «Run current», чтобы проверить, все ли работает. Вот что вы должны увидеть:

      image60

      Если вы увидите имя вашей базы данных – все готово!

      Создание таблицы базы данных

      Во-первых, нам нужно создать таблицы, в которых будут храниться данные Android Tracker. Таблицы загружаются в виде .sql файлов, и эти файлы содержат конструкции DDL, которые создают все необходимые схемы и таблицы.

      Для этого вам нужны .sql файлы схемы, которые вы найдете в репозитории Snowplow:

      Сначала загрузите и запустите atomic-def.sql в Table Plus. Вы должны увидеть сообщение об успешном создании схемы atomic и таблицы atomic.events.

      image22

      Затем запустите manifest-def.sql. Вы также должны увидеть сообщение об успешном создании.

      Теперь вам нужно загрузить все DDL для схем мобильного трекера. Если вы не создадите эти таблицы, ETL будет падать в ошибку, когда утилита попытается импортировать события в несуществующие таблицы.

      Вы можете найти все необходимые .sql файлы по следующим ссылкам:

      Когда вы закончите, вы сможете запустить следующий SQL-запрос и увидеть список всех таблиц, которые вы только что создали :

      SELECT * FROM pg_tables WHERE schemaname='atomic';
      image63

      Создание пользователей базы данных

      Теперь создадим трех пользователей:

      • storageloader, который будет отвечать за процесс ETL.
      • power_user, у которого будут права администратора, поэтому вам больше не нужно будет входить в систему с данными супер-пользователя.
      • read_only, который может запрашивать данные и создавать свои собственные таблицы.

      Скопируйте и вставьте следующие SQL-запросы. Для каждого из них придумайте пароль ($password) и убедитесь, что вы записали комбинации пользователь + пароль.

        CREATE USER storageloader PASSWORD '$password';
        GRANT USAGE ON SCHEMA atomic TO storageloader;
        GRANT INSERT ON ALL TABLES IN SCHEMA atomic TO storageloader;
        CREATE USER read_only PASSWORD '$password';
        GRANT USAGE ON SCHEMA atomic TO read_only;
        GRANT SELECT ON ALL TABLES IN SCHEMA atomic TO read_only;
        CREATE SCHEMA scratchpad;
        GRANT ALL ON SCHEMA scratchpad TO read_only;
        CREATE USER power_user PASSWORD '$password';
        GRANT ALL ON DATABASE snowplow TO power_user;
        GRANT ALL ON SCHEMA atomic TO power_user;
        GRANT ALL ON ALL TABLES IN SCHEMA atomic TO power_user;
        

      Если все пройдет хорошо, вы должны увидеть сообщение о 12 успешных операциях.

      image59

      И, наконец, необходимо предоставить права на все таблицы в схеме atomic для пользователя storageLoader, потому что этому пользователю нужно будет запускать команды.

      Итак, сначала выполните запрос:

        SELECT 'ALTER TABLE atomic.' || tablename ||' OWNER TO storageloader;'
        FROM pg_tables WHERE schemaname='atomic' AND NOT tableowner='storageloader';
        

      В результатах запроса вы должны увидеть несколько запросов:

      ALTER TABLE atomic.* OWNER TO storageloader;

      Скопируйте эти строки и вставьте в поле запросов и запустите их.

      image64

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

      SELECT * FROM pg_tables WHERE schemaname='atomic' AND tableowner='storageloader';

      вы должны увидеть все таблицы.

      Пользователи для базы данных созданы, теперь осталось только настроить EmrEtlRunner для выполнения последнего шага ETL, когда storageloader-пользователь копирует все данные из S3 в соответствующие таблицы Redshift.

      Создание новой IAM-роли для загрузчика базы данных

      EmrEtlRunner будет копировать файлы в Redshift с помощью утилиты под названием RDB Loader (Загрузчик реляционной базы данных). Чтобы этому интрументы хватило прав на выполнение, вам необходимо создать новую IAM-роль, которая предоставляет кластеру Redshift доступ только для чтения к вашим S3-бакетам.

      • Итак, в AWS нажмите Services и выберите IAM.
      • На панели навигации слева выберите Rules. Нажмите кнопку «Create rule».
      • В форме «Select type of trusted entity» оставьте выбранным сервис AWS по-умолчанию и выберите Redshift из списка сервисов. В списке «Select your use case» выберите «Redshift - Customizable и нажмите «Next: permissions».
      image14
      • На следующем экране найдите политику с именем AmazonS3ReadOnlyAccess и установите рядом с ней чекбокс. Щелкните «Next: Tags».
      image43
      • Кликните «Next: review»
      • Назовите роль, например, RedshiftS3Access и нажмите «Create Rule».
      • Вы увидите список ролей. Щелкните только что созданную RedshiftS3Access роль, чтобы увидеть ее конфигурацию. Скопируйте значение в поле Rule ARN. Оно вам очень скоро понадобится.
      image11
      • Перейдите в Amazon Redshift и перейдите к списку запущенных кластеров.
      • Установите флажок рядом с кластером Snowplow и нажмите «Управление ролями IAM».
      image23
      • В списке «Available IAM rules» выберите только что созданную роль, кликните «Add IAM rule» и нажмите «Done», чтобы применить эту роль к кластеру.
      image36

      Редактирование конфигурации Redshift

      Вернемся к нашему проекту, созданному на шаге 3, в каталоге вашего проекта config/ должна быть папка targets/ с файлом redshift.json.

      Откройте redshift.json и убедитесь, что он выглядит примерно так:

        {
          "schema": "iglu:com.snowplowanalytics.snowplow.storage/redshift_config/jsonschema/2-1-0",
          "data": {
            "name": "AWS Redshift enriched events storage",
              "host": "ADD HERE",
              "database": "ADD HERE",
              "port": 5439,
              "sslMode": "DISABLE",
              "username": "ADD HERE",
              "password": "ADD HERE",
              "roleArn": "ADD HERE",
              "schema": "atomic",
              "maxError": 1,
              "compRows": 20000,
              "sshTunnel": null,
              "purpose": "ENRICHED_EVENTS"
            }
          }
        

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

      • host : URL-адрес вашего кластера Redshift
      • database : имя базы данных
      • username : storageloader
      • password : пароль storageloader
      • ruleArn : ARN IAM-роли, которую вы создали на предыдущем шаге.

      Все остальные параметры можно оставить со значениями по-умолчанию.

      Повторный запуск EmrEtlRunner

      Теперь, когда вы настроили все, вы готовы запустить EmrEtlRunner, который скопирует все данные в ваши таблицы Redshift.

      Команда, которую вам нужно запустить в корне папки вашего проекта (где находится snowplow-emr-etl-runner исполняемый файл):

      ./snowplow-emr-etl-runner run -c config/config.yml -r config/iglu_resulver.json -t config/targets

      Эта команда обработает все данные в :raw:in бакете (тот, который содержит все ваши логи Tomcat) и приступит к их извлечению и преобразованию и, наконец, загрузит их в ваши таблицы Redshift. Процесс займет некоторое время, так что выпейте чашечку кофе.

      По завершению вы должны увидеть в командной строке что-то вроде этого:

      image62

      Тестирование

      Подключитесь к базе данных под read_only пользователем. Откройте таблицы и вы увидите некоторые ваши данные

      image42

      Учитывая, сколько времени вы, вероятно, потратили на то, чтобы все заработало (при усердном следовании этому руководству), я искренне надеюсь, что все работает исправно и вы увидели данные

      Завершение

      Следуя этому руководству, вы сможете настроить пакетный конвейер Snowplow.

      • Мобильное приложение отправляет данные в Amazon, используя собственное доменное имя, DNS записи которого вы делегировали AWS.
      • Clojure Collector - это сборщик, который регистрирует все HTTP-запросы в журналы Tomcat и сохраняет их в S3-бакет.
      • Затем запускается процесс ETL, обогащающий данные и измельчающий их до атомарных наборов данных, которые снова сохраняются в S3.
      • Наконец, процесс ETL копирует данные в таблицы, которые вы настроили в новой реляционной базе данных, работающей в AWS Redshift.

      Здесь так много нюансов и тонких деталей, что, возможно, в какой-то момент вы ошибетесь – тогда заново пройдитесь по этому руководству и проверьте, не пропустили ли вы что-нибудь.

      Вы также можете присоединиться к обсуждениям на сайте Discourse Snowplow - я уверен, что люди там будут более чем рады помочь вам, если у вас возникнут проблемы с настройкой.

      Удачи!