Импорт данных Яндекс Директа из Yandex Object Storage, их обработка и экспорт в ClickHouse
Подробный гайд по получению данных из Яндекс Директа и их загрузке в ClickHouse, который показывает процесс выгрузки данных с использованием API, сохранения их в CSV-файлах, загрузки в Object Storage, последующей обработки и преобразования в формат Parquet с дальнейшей загрузкой в ClickHouse.
Материал основан на официальном руководстве Yandex Cloud под названием «Импорт данных из Yandex Object Storage, обработка и экспорт в Yandex Managed Service for ClickHouse®». Оно, в свою очередь, основано на сценарии компании Data Stories по построению аналитического стека на базе сервисов Yandex Cloud. В качестве примера используются две CSV-таблицы, которые нужно объединить в одну, импортировать в формат Parquet и передать в Managed Service for ClickHouse.
Описанное ниже решение стоит денег. Стоимость поддержки включает в себя:
- плата за кластер Managed Service for ClickHouse®: использование вычислительных ресурсов, выделенных хостам (в том числе хостам ZooKeeper), и дискового пространства (см. тарифы Managed Service for ClickHouse®);
- плата за кластер Yandex Data Processing: использование вычислительных ресурсов ВМ и сетевых дисков Compute Cloud, а также сервиса Cloud Logging для работы с логами (см. тарифы Yandex Data Processing);
- плата за использование публичных IP-адресов для хостов кластера (см. тарифы Virtual Private Cloud);
- плата за бакеты Object Storage: хранение данных и выполнение операций с ними (см. тарифы Object Storage);
- плата за NAT-шлюз (см. тарифы Virtual Private Cloud).
Пожалуйста, учитывайте эти расходы до этапа настройки.
Примечание: у меня есть подробный онлайн-курс (с видео), пройдя который вы научитесь выгружать данные из Яндекс Директа с помощью Python, чтобы не зависеть от других сервисов, переносить их в собственную базу данных (ClickHouse, MySQL, PostgreSQL), а также в Google Таблицы без помощи разработчиков и строить любые автоматические отчеты в инструментах визуализации данных Yandex DataLens для своих клиентов. Да, маркетолог тоже может писать код!
Давайте рассмотрим каждый шаг из официального руководства Yandex Cloud более подробно.
Регистрация приложения
Для регистрации приложения вам понадобится учетная запись Яндекса (Яндекс ID). Для этого перейдите по адресу https://passport.yandex.ru/auth/reg и пройдите несложную процедуру регистрации.
Вам понадобится номер мобильного телефона, куда будут приходить СМС с кодами для входа в аккаунт. Если у вас уже есть аккаунт в Яндексе, вы можете использовать его, а не создавать новый.
После создания аккаунта перейдите по адресу https://oauth.yandex.ru/client/new. В открывшемся окне на вопрос Какое приложение хотите создать? выберите Для доступа к API или отладки:
Нажмите Перейти к созданию.
В Название сервиса введите название приложения, которое будет использоваться. Вы можете задать произвольное имя. Например, YandexDirect:
Затем укажите почту компании или свою. Яндекс будет оповещать вас об изменениях во внешней авторизации:
В разделе Доступ к данным отметьте значение Использование API Яндекс Директа (direct:api), введя его в поле ниже:
В дальнейшем вы можете изменить параметры приложения.
В самом конце после выбора соответствующего доступа к данным в Redirect URI для веб-сервисов будет автоматически подставлена строка:
|
1 |
https://oauth.yandex.ru/verification_code |
Изменить ее нельзя. В завершение нажмите кнопку Создать приложение.
В последнее время Яндекс дополнительно просит пройти верификацию с помощью вашего аккаунта на Госуслугах для того, чтобы:
- на приложениях не было подписи, что сервис не верифицирован;
- иметь возможность подключить оплату с Яндекс Пэй;
- можно было создать больше приложений.
Несмотря на то что большинство этих пунктов нам не актуальны, рекомендую пройти верификацию и больше к этому не возвращаться.
В результате регистрации Яндекс ID сгенерирует и отобразит на странице идентификатор и пароль приложения. Идентификатор приложения необходимо указать при создании заявки на доступ к API. Идентификатор и пароль приложения необходимы для получения авторизационного токена, разрешающего приложению доступ к данным конкретного пользователя.
Список зарегистрированных вами приложений доступен на странице https://oauth.yandex.ru/. Вы можете узнать идентификатор и пароль приложения, изменить параметры приложения, а также удалить приложение.
Через некоторое время напротив вашего приложения будет отображаться статус Подключен. Это означает, что приложение подключено, работает и получает авторизации.
Получение OAuth-токена
Когда вы будете выгружать данные из Яндекс Директа, в каждом запросе к API необходимо указывать авторизационный токен (он же OAuth-токен). В токене зашифрована информация как о приложении, так и о пользователе. Токен используется для того, чтобы определить:
- от имени какого пользователя Директа приложение выполняет запрос;
- действительно ли пользователь разрешил этому приложению доступ к своим данным в Директе;
- есть ли у самого пользователя нужные полномочия для работы с теми рекламными материалами, к которым он обращается.
Таким образом, при работе с Директом через API нет необходимости передавать пароль от аккаунта пользователя. Достаточно передать OAuth-токен, что делает процесс работы с API Директа более безопасным. Но важно понимать, что для каждого пользователя в приложении требуется получить отдельный токен.
На начальных этапах разработки приложения достаточно вручную получить так называемый отладочный токен. Он ничем не отличается от токена, полученного в автоматическом режиме. Токен дает возможность управлять реальными рекламными материалами пользователя, независимо от способа, которым этот токен получен.
Для того, чтобы мы могли получить токен для доступа к API Директа ваших рекламных кампаний, у вас должен быть доступ к аккаунту Яндекс Директа с этими кампаниями.
Перед тем, как вы авторизуетесь под аккаунтом, на котором у вас размещены рекламные кампании Яндекс Директа, зайдите под аккаунтом, на котором вы создавали ваше приложение. Перейдите на страницу https://oauth.yandex.ru/ и выберите свое приложение:
Скопируйте идентификатор вашего приложения из раздела ClientID:
Сохраните его в обычном блокноте. Он вам понадобится чуть позже в запросах для получения OAuth-токена.
Теперь авторизуйтесь под учетной записью Яндекса, на которой у вас есть рекламный кабинет Яндекс Директа и из которого вы планируете выгружать данные. Затем перейдите по ссылке, вставив ее в адресную строку браузера:
|
1 |
https://oauth.yandex.ru/authorize?response_type=token&client_id=<идентификатор приложения> |
, где вместо <идентификатор приложения> вставьте идентификатор вашего приложения, скопированного на предыдущем шаге.
У вас должно открыться окно авторизации для аккаунта Яндекс Директа. Нажмите кнопку Войти как… и тогда ваше приложение получит доступ к использованию API Яндекс Директа.
На следующей странице отобразится ваш Oauth-токен. Он будет также добавлен в адресную строку. Некоторые браузеры могут обрезать часть ссылки, поэтому если вы не видите токен в URL, скопируйте его со страницы.
Сохраните его, никому не показывайте и не передавайте. С его помощью можно получить доступ к данным пользователя в Директе. Сервис Яндекс OAuth не хранит выдаваемые токены в публичном доступе. Вы не сможете найти их в личном кабинете. Если вы не сохранили токен, вы можете получить его вручную еще раз. Примерный срок жизни токена ~ 1 год.
Таким образом, для получения отладочного токена вам необходимо было войти на Яндекс под тем логином Директа, для которого вы хотите выгружать статистику рекламных кампаний, а также знать идентификатор приложения, взятый из настроек приложения раздела ClientID.
Создание заявки на доступ к API
Чтобы иметь полный доступ и расширенные возможности выгрузки данных из вашего рекламного кабинета Яндекс Директа, вам необходимо подать заявку в интерфейсе системы.
Примечание: заявка создается в том рекламном аккаунте Яндекс Директа, в котором было создано приложение. Для этого решения можно использовать и песочницу, но я рекомендую получать заявку сразу на полный доступ к API.
Для этого в Яндекс Директе откройте раздел Инструменты и выберите API:
API дает возможность разработчикам создавать собственные программные приложения для работы с Яндекс Директом. С его помощью можно эффективно управлять большим количеством рекламных кампаний, точнее прогнозировать бюджеты и своевременно получать статистические отчеты.
Чтобы получить доступ к странице настроек API, необходимо создать хотя бы одну рекламную кампанию в веб-интерфейсе Директа.
Нажмите на ссылку Получить доступ к API:
Примите пользовательское соглашение об использовании API Сервиса “Яндекс Директ”, установив переключатель рядом с Я согласен и нажав на кнопку Принять соглашение:
В открывшемся окне перейдите в меню Мои заявки:
Создайте новую заявку на полный доступ:
Заполните заявку на получение полного доступа к Яндекс Директу:
Все поля, отмеченные звездочками *, обязательны к заполнению:
- заявка для приложения, которое вы создали на предыдущеми шаге (введите application_id или выберите его из списка, если у вас несколько приложений в аккаунте);
- один или несколько контактов, по которым с вами быстро сможет связаться служба поддержки в случае каких-либо вопросов;
- в специфике работы вы можете выбрать Разработчик программного обеспечения и ваш основной бизнес не связан с работой с клиентами-рекламодателями;
- в технических данных о приложении в поле языка программирования напишите Python, а в протоколе поставьте галочку рядом с JSON;
API Директа поддерживает два формата:
1. JSON (англ. JavaScript Object Notation) – текстовый формат обмена данными;
2. SOAP (англ. Simple Object Access Protocol) – протокол обмена структурированными сообщениями в формате XML.
- поскольку вы впервые создаете приложение, которое нигде ранее не использовалось, в пункте Для примера успешной работы приложения, укажите один или несколько логинов в Директе, для которых оно используется можете написать Приложение новое, пока нигде не использовалось
- ваше приложение будет предназначено для выгрузки данных для анализа рекламных кампаний, поэтому в предназначении программы вы можете указать именно это;
- в основных функциях приложения выберите Получение статистики и отчетов:
- в возможностях вашего приложения добавьте такой текст – Автоматически выгружает данные по рекламным кампаниям на компьютер пользователя для использования их в анализе и при создании графических отчетов Yandex DataLens:
- в описании схемы взаимодействия вашего приложения с Директом опишите основной функционал приложения.
Лучше использовать свой уникальный текст, поскольку Яндекс тщательно проверяет все заявки. В моей практике было такое, что при вводе одного и того же текста заявка модерация отклонялась. Поэтому напишите своими словами о том, как ваше приложение будет взаимодействовать с Директом. Можете приложить ссылку на официальное решение от Yandex Cloud.
- спецификации и скриншоты интерфейса тоже обязательны для успешного прохождения модерации. Просто загрузите несколько скриншотов кода вашей программы, чтобы у сотрудников Яндекса не возникло лишних вопросов к заявке:
Демо-доступ к программе можно не предоставлять. В завершение согласитесь с правилами разработки Приложений для взаимодействий с API Сервиса "Яндекс.Директ", установив переключатель рядом с Согласен, а затем нажмите на кнопку Отправить:
Заявка рассматривается до 7 рабочих дней (именно рабочих!). Среднее время рассмотрения обращения ~ 1-3 дня, при условии, что вы не попали в праздничные дни. Если вы все сделали так, как было показано в данном руководстве, то проблем с получением доступа у вас быть не должно.
Через некоторое время в разделе Инструменты – API – Мои заявки вы увидите статус заявки Одобрена и полный доступ:
Создание облака в Yandex Cloud
Yandex Cloud – облачная платформа, где каждый может создавать и совершенствовать свои цифровые сервисы, используя инфраструктуру и уникальные технологии Яндекса.
В состав Yandex Cloud входят продукты, сервисы для управления данными, инструменты для разработки облачных приложений, моделей машинного обучения и собственные сервисы на основе ML.
Для того чтобы начать работу в Yandex Cloud, вам необходим аккаунт Яндекса. Это может быть аккаунт от другой почты, никак не связанный с вашим рекламном кабинетом Яндекс Директа, из которого вы выгружаете данные. Создать новый аккаунт можно по ссылке.
После создания аккаунта (или использования текущего) перейдите по адресу yandex.cloud. Нажмите на кнопку Попробовать бесплатно:
Чтобы использовать возможности Yandex Cloud, вам необходимо создать рабочее пространство. По умолчанию будет создана новая организация с префиксом organization- и названием вашего аккаунта. Вы можете создать новую организацию, а также изменить название облака.
Проделав это, нажмите кнопку Создать:
При регистрации в Yandex Cloud для пользователя будет создано облако – отдельное рабочее пространство, для которого этот пользователь будет назначен владельцем. В облаке будет создан каталог default и сеть default.
Создание платежного аккаунта
Для новых клиентов Yandex Cloud предоставляется пробный период. Он позволяет вам получить практический опыт использования сервисов, не оплачивая потребленные ресурсы. В рамках пробного периода вашему платежному аккаунту выдается стартовый грант сроком действия 60 дней.
Стартовый грант может быть выдан физическому лицу или юридическому лицу, владельцем которого является то же физическое лицо, только один раз. Например, если физическое лицо уже получило грант, то его юридическому лицу грант выдан не будет. Стартовый грант начисляется при создании первого платежного аккаунта, если ранее вы:
- Никогда не приобретали услуг Yandex Cloud.
- Не активировали пробный период.
- При создании платежного аккаунта привязали банковскую карту.
Вы не сможете получить грант, если привяжете карту после создания аккаунта. И условия использования стартового гранта различаются для личных и бизнес-аккаунтов.
После того, как вы создали свое первое облако, добавьте платежный аккаунт, нажав на кнопку Создать аккаунт:
Либо же перейдите в сервис Yandex Cloud Billing и создайте аккаунт через эту страницу. На вкладке Аккаунт нажмите кнопку Создать аккаунт.
В открывшемся окне:
В поле Имя аккаунта задайте имя платежного аккаунта. Имя будет отображаться в списке ваших платежных аккаунтов и поможет выбрать нужный.
В поле Организация выберите организацию, для которой будет создан платежный аккаунт. В рамках одного пользовательского аккаунта все плательщики должны осуществлять оплату в одной и той же валюте.
В поле Тип аккаунта выберите Физическое лицо / Юридическое лицо или ИП и нажмите кнопку Вперед. В зависимости от того, какой тип аккаунта вы будете использовать, продолжите заполнение по нижеприведенной инструкции:
Рассмотрим способ создания типа аккаунта Физическое лицо. На странице Персональные данные укажите ваши фамилию и имя и нажмите кнопку Вперед.
На странице Платежные данные привяжите вашу банковскую карту к создаваемому платежному аккаунту:
- Нажмите кнопку Добавить карту.
- Укажите данные карты: 16-значный номер, срок действия, код CVV (с обратной стороны карты).
- Нажмите кнопку Привязать.
Если к аккаунту пользователя уже привязаны банковские карты, вы можете выбрать одну из них, не добавляя новую.
Принимаются банковские карты Мир, Visa и MasterCard.
- Резиденты Российской Федерации ведут расчеты в RUB и могут использовать для оплаты карты, выпущенные только российскими банками.
- Резиденты Республики Казахстан ведут расчеты в KZT и могут использовать для оплаты карты, выпущенные только нероссийскими банками.
- Нерезиденты Российской Федерации и Республики Казахстан ведут расчеты в USD и могут использовать для оплаты карты, выпущенные только нероссийскими банками.
Для проверки валидности карты на вашем счете будет заблокирована незначительная сумма, 11 рублей. Эти средства не списываются и будут снова доступны после завершения проверки и разблокировки. Срок разблокировки несписанных средств зависит от условий работы вашего банка.
Ваш аккаунт будет создан с платным потреблением: после использования стартового гранта с карты начнут списываться средства за используемые ресурсы сервисов Yandex Cloud.
Закончив с добавлением банковской карты, нажмите кнопку Вперед.
В форме создания платежного аккаунта шаг привязки банковской карты опционален, и вы можете не привязывать карту. Однако необходимо помнить, что в этом случае вы не сможете получить стартовый грант, даже если привяжете карту позднее. Возможность работы с платными ресурсами в облаке появится только после того, как вы пополните лицевой счет.
Если это ваш первый платежный аккаунт в Yandex Cloud, вам будет доступно подключение пробного периода. Для этого обязательно поставьте галочку Включить пробный период:
После создания платежного аккаунта пробный период активируется автоматически.
Включение пробного периода происходит только на этапе создания первого платежного аккаунта в консоли управления Yandex Cloud.
Стартовый грант действует 60 дней. Размер и валюта гранта зависят от страны, в которой вы проживаете:
- для резидентов Российской Федерации (РФ), а также налоговых резидентов Республики Беларусь (РБ) размер гранта составляет не менее 4 000 ₽ с учетом НДС;
- для резидентов Республики Казахстан (РК) размер гранта составляет не менее 20 000 ₸ с учетом НДС;
- для нерезидентов Российской Федерации и Республики Казахстан размер гранта составляет не менее 30 $, без учета налогов и сборов.
Подключая пробный период, помните, что после его завершения ваши ресурсы будут приостановлены. Для возобновления работы потребуется перейти на платную версию.
На странице Контакты укажите актуальные адрес электронной почты и телефон. Контактные данные нужны не только для связи с вами, но и для выставления счетов и финансовых документов. Если контактные данные уже заполнены, проверьте их актуальность.
Нажмите кнопку Создать.
При создании платежного аккаунта вам автоматически выдается роль владельца billing.accounts.owner. Любой пользователь с ролью billing.accounts.owner может удалить эту роль у создателя платежного аккаунта и изменить владельца.
На вкладке Аккаунт интерфейса Yandex Cloud Billing в блоке Привязанные облака и сервисы отображаются все подключенные облака и сервисы, например DataSphere и др. Если аккаунт добавлен в организацию, ее идентификатор также будет показан в блоке Привязанные облака и сервисы.
На главной странице сервиса отображаются платежные аккаунты всех ваших организаций, а также аккаунты, к которым у вас есть доступ.
После этого вас перенаправит на страницу Биллинга, на которой будут отображены ваши платежные реквизиты и уведомление об активированном пробном периоде:
На электронную почту также придет письмо о завершении регистрации и активации пробного периода. А информация о стартовом гранте и вашем балансе будет представлена на странице биллинга. Статус вашего платежного аккаунта будет Active:
Этот грант в дальнейшем вы можете использовать для Yandex Managed Service for ClickHouse и других сервисов, входящих в данную реализацию.
Создание каталога
Каталог – это пространство, в котором создаются и группируются ресурсы Yandex Cloud.
Ресурсы Yandex Cloud – виртуальные машины, диски, сети и другие – размещаются в каталогах. При создании ресурса указывается каталог, в котором он будет создан. Каждый каталог принадлежит одному облаку. Не существует каталогов вне облака. Нельзя создать каталог внутри другого каталога. Облака принадлежат организациям.
Чтобы создать новый каталог, перейдите по ссылке console.yandex.cloud в консоль управления и напротив вашего облака нажмите на иконку с тремя точками и выберите Создать каталог:
Введите имя каталога (например: firstbuild). Описание можно оставить пустым. В настройках Дополнительно оставьте активной галочку Создать сеть по умолчанию:
В завершение нажмите кнопку Создать.
Будет создана сеть с подсетями в каждой зоне доступности. Также в этой сети будет создана группа безопасности по умолчанию, внутри которой весь сетевой трафик разрешен.
Облачная сеть – это аналог традиционной локальной сети в дата-центре. Облачные сети создаются в каталогах и используются для передачи информации между облачными ресурсами и связи ресурсов с интернетом.
Для виртуальных машин Yandex Compute Cloud и хостов баз данных доступ из интернета и в интернет открыт через публичные IP-адреса.
Если у вас длительное время не появляется меню создания каталога, а рядом с облаком отображается иконка с часами, то значит вы не привязали облако к платежному аккаунту:
Сделайте это, и тогда возможность создания каталога станет доступна.
Создание сервисного аккаунта
Теперь вам необходимо создать сервисный аккаунт. Перейдите в свой каталог Yandex Cloud и откройте раздел Сервисные аккаунты:
Далее перейдите в Identity and Access Management:
Нажмите кнопку Создать сервисный аккаунт.
Введите имя сервисного аккаунта dataproc-s3-sa. Нажмите Добавить роль и назначьте сервисному аккаунту роли:
- dataproc.agent
- dataproc.provisioner
Нажмите кнопку Создать.
Создание бакетов в Object Storage
Бакет (Bucket) - это выделенная часть хранилища Object Storage для пользовательских данных. Каждый бакет в Yandex Cloud имеет уникальное название, по которому выполняются запросы к Object Storage. Данные в бакетах хранятся в виде объектов. Вы можете логически структурировать данные с помощью нескольких бакетов или с помощью папок (префиксов) внутри одного бакета. Также бакеты можно использовать для хостинга статических сайтов.
Подробнее о том, как начать работу с Yandex Object Storage, читайте в официальной документации Yandex Cloud.
Для создания бакета выберите каталог (см. выше), в котором вы будете создавать бакет, а затем перейдите в сервис Object Storage.
Создайте свой первый бакет:
Создайте бакет для исходных данных, назначив ему имя (например, bucket-initial-data). Никаких других настроек не производите. Нажмите Сохранить.
Предоставьте сервисному аккаунту кластера разрешение READ для этого бакета. Для этого откройте Object Storage - Бакеты и напротив созданного бакета нажмите на меню с тремя точками, выбрав пункт Настроить ACL:
В открывшемся окне добавьте свой сервисный аккаунт dataproc-s3-sa, назначив ему разрешение READ:
Сохраните изменения.
Теперь создайте еще один бакет, но только уже для результатов обработки (для выходных данных). Назначьте ему имя (например, bucket-processing-result). Никаких других настроек не производите. Нажмите Сохранить.
Предоставьте сервисному аккаунту кластера разрешение READ и WRITE для этого бакета:
Сохраните изменения.
Создание облачной сети
После того, как вы создали каталог в Yandex Cloud, внутри нее была создана сеть с подсетями в каждой зоне доступности. Ее имя - default:
Согласно официальной документации Yandex Cloud, мы должны создать облачную сеть с другими именем. Для этого откройте сервис Virtual Private Cloud и в правом верхнем углу нажмите Создать сеть:
Задайте ей название dataproc-network, убрав галочку Создать подсети:
Нажмите кнопку Создать сеть. Теперь сеть default теперь можно удалить, она не будет участвовать в наших процессах:
Создание подсети
Откройте созданную сеть dataproc-network и создайте внутри нее подсеть:
Сделайте это в любой зоне доступности. Значение CIDR обязательно к указанию, но по инструкции нет особых пометок. В таком случае можно указать любой диапазон из частных IPv4-адресов, определенных в RFC 1918:
- 10.0.0.0/8
- 172.16.0.0/12
- 192.168.0.0/16
Например, 192.168.0.0/24:
Нажмите Создать подсеть.
Настройка NAT-шлюза для подсети
На панели слева вашей облачной сети выберите Шлюзы:
Нажмите кнопку Создать.
Задайте имя шлюза (например - gateway):
На панели слева выберите Таблицы маршрутизации. Нажмите на кнопку Создать таблицу маршрутизации:
Задайте имя таблицы (например - routing-table), а также укажите сеть dataproc-network:
Затем нажмите на кнопку Добавить маршрут. В открывшемся окне в поле Next hop выберите Шлюз. В поле Шлюз укажите созданный NAT-шлюз. Префикс назначения заполнится автоматически.
Нажмите кнопку Добавить, а затем Создать таблицу маршрутизации.
Затем привяжите таблицу маршрутизации к одной из подсетей, чтобы направить трафик из нее через NAT-шлюз. Для этого на панели слева выберите Подсети. В строке нужной подсети нажмите на иконку с тремя точками и выберите пункт Привязать таблицу маршрутизации:
В открывшемся окне выберите созданную таблицу в списке. Нажмите кнопку Привязать.
Создание группы безопасности
Группы безопасности действуют по принципу «запрещено все, что не разрешено». Если назначить сетевому интерфейсу виртуальной машины (ВМ) группу безопасности без правил, ВМ не сможет передавать и принимать трафик. А нам нужно создать по одному правилу для входящего и исходящего служебного трафика.
Для этого откройте свою подсеть и перейдите на вкладку Группы безопасности. Создайте новую группу безопасности:
Задайте имя dataproc-sg:
Создайте по одному правилу для входящего и исходящего служебного трафика со следующей конфигурацией:
- Диапазон портов - 0-65535
- Протокол - Любой (Any)
- Источник / Назначение - Группа безопасности
- Группа безопасности - Текущая (Self)
Для этого сначала на вкладке Входящий трафик добавьте правило:
Задайте настройки и сохраните:
То же самое правило добавьте для исходящего трафика, перейдя на вкладку Исходящий трафик и добавив правило на ней:
Добавьте еще одно правило для исходящего HTTPS-трафика с такой конфигурацией:
- Диапазон портов - 443
- Протокол - TCP
- Назначение - CIDR
- CIDR блоки - 0.0.0.0/0
В интерфейсе это будет выглядеть так:
Сохраните правило.
Добавьте еще одно правило для исходящего трафика по протоколу TCP на порт 8443 для доступа к ClickHouse:
- Диапазон портов - 8443
- Протокол - TCP
- Назначение - CIDR
- CIDR блоки - 0.0.0.0/0
В интерфейсе это будет выглядеть так:
Сохраните правило. В результате у вас должно быть создано 3 правила для исходящего трафика и 1 правило для входящего трафика.
Сохраните группу безопасности.
Создание кластера Yandex Data Processing
Yandex Data Processing - сервис для обработки многотерабайтных массивов данных с использованием инструментов с открытым исходным кодом, таких как Apache Spark, Apache Hadoop, Apache HBase, Apache Zeppelin и других сервисов экосистемы Apache.
Кластер Yandex Data Processing должен состоять из подкластера с хостом-мастером и как минимум из одного подкластера для хранения или обработки данных.
Для создания кластера Yandex Data Processing вашему аккаунту в Yandex Cloud нужны роли:
- dataproc.editor - чтобы создать кластер;
- vpc.user - чтобы работать с сетью кластера;
- iam.serviceAccounts.user - чтобы привязать сервисный аккаунт к кластеру и создавать ресурсы от имени этого сервисного аккаунта.
Сервисному аккаунту кластера Yandex Data Processing должны быть назначены роли:
- dataproc.agent - чтобы сервисный аккаунт мог получать информацию о состоянии хостов кластера, заданиях и лог-группах.
- dataproc.provisioner - чтобы сервисный аккаунт мог взаимодействовать с автоматически масштабируемой группой ВМ. Тогда будет доступно автомасштабирование подкластеров.
В консоли управления выберите каталог, в котором нужно создать кластер Yandex Data Processing. Нажмите кнопку Создать ресурс и выберите Кластер Yandex Data Processing в выпадающем списке:
Создайте кластер с любой подходящей конфигурацией хостов и следующими настройками:
- Окружение - PRODUCTION;
- Сервисы - SPARK, YARN, HDFS;
Чтобы использовать самую свежую версию образа, укажите значение 2.0:
Обязательным полем для заполнения является SSH-ключ. Для подключения к ВМ по SSH используется пара ключей: открытый ключ размещается на ВМ, а закрытый ключ хранится у пользователя. Этот способ безопаснее, чем подключение по логину и паролю.
Далее демонстрация будет идти для операционной системы Windows 10 и новее. Инструкции по получению SSH-ключа для других ОС вы можете найти в официальной документации Yandex Cloud.
Откройте меню Пуск на своем компьютере и начните вводить powershell. В появившихся результатах нажмите на приложение Windows PowerShell:
Откроется окно командной строки. Скопируйте нижеприведенный текст в PowerShell и нажмите Enter:
|
1 |
ssh-keygen -t ed25519 |
После этого еще раз несколько раз нажмите на клавишу Enter, пока вы не получите следующее окно:
После этого окно можно закрыть. Ваши ключи будут созданы в директории C:\Users\<имя_пользователя>\.ssh\
Откройте с помощью блокнота или любого другого текстового редактора (например, Notepad++) файл с расширением .pub:
Скопируйте содержимое файла и вставьте его в поле SSH-ключ создания кластера Yandex Data Processing:
Далее укажите следующие настройки:
- Сервисный аккаунт - dataproc-s3-sa;
- Имя бакета - бакет, который вы создали для выходных данных (в нашем примере - это bucket-processing-result);
- Сеть - dataproc-network;
- Группы безопасности - dataproc-sg;
- Настройка UI Proxy включена.
Для работы сервиса HDFS нужны подкластеры с хостом-мастером и DataNode. Поэтому в блоке Подкластеры добавьте Data подкластер:
Задайте DataNode для HDFS и выберите любую конфигурацию подкластера. Например, Intel Cascade Lake с 2 ядрами и 8 ГБ памяти (s2.micro):
Поскольку суммарный объем SSD-дисков в одном облаке не должен превышать 200 ГБ, используйте network-hdd. Например - 64 ГБ:
В сетевых настройках обязательно укажите свою подсеть:
Нажмите Добавить.
Примечание: подробнее о правилах тарификации для Yandex Data Processing читайте в официальной документации.
В завершение нажмите кнопку Создать кластер.
После создания кластера подождите некоторое время, пока он не будет полностью готов. Как только процесс завершится, ваш кластер появится в общем списке с возможностью немедленного использования:
Создание кластера ClickHouse
Подробно весь этот процесс описан в руководстве 5.1.4. Создание кластера ClickHouse нашей онлайн-документации. Единственное, что требуется соблюсти согласно официальному руководству - это:
- создание кластера ClickHouse должно быть с публичным доступом к хостам кластера;
- сетевые настройки (сеть и группы безопасности) должны быть заданы для dataproc-network и dataproc-sg соответственно;
- имя БД - db1;
- имя пользователя - user1;
- сервисный аккаунт - dataproc-s3-sa.
Примечание: для создания кластера Managed Service for ClickHouse нужна роль vpc.user и роль managed-clickhouse.editor или выше.
В консоли управления выберите каталог, в котором нужно создать кластер БД. Нажмите Создать ресурс - Кластер ClickHouse:
Чтобы начать работу, просто нажмите Создать кластер:
На открывшейся странице настроек кластера заполните все необходимые данные. В разделе Базовые параметры введите имя кластера в поле Имя кластера. Оно должно быть уникальным в рамках каталога. Например, directClickHouse:
При желании вы можете добавить описание. Допустимая длина – до 256 символов.
Выберите окружение, в котором нужно создать кластер (после создания кластера окружение изменить невозможно):
- PRODUCTION – для стабильных версий ваших приложений.
- PRESTABLE – для тестирования. Prestable-окружение аналогично Production-окружению и на него также распространяется SLA, но при этом на нем раньше появляются новые функциональные возможности, улучшения и исправления ошибок. В Prestable-окружении вы можете протестировать совместимость новых версий с вашим приложением.
Мы рекомендуем выбрать PRODUCTION:
Теперь выберите версию ClickHouse, которую будет использовать кластер Managed Service for ClickHouse. Для большинства кластеров рекомендуется выбрать самую новую LTS-версию.
На момент выхода этого руководства самой новой/последней LTS-версией является 25.8 LTS. Выберите ее из выпадающего списка:
В блоке Ресурсы необходимо выбрать платформу, тип виртуальной машины и класс хостов – он определяет технические характеристики виртуальных машин, на которых будут развернуты хосты БД.
Примечание: все доступные варианты перечислены в разделе Классы хостов.
Платформа определяет тип физического процессора и набор допустимых конфигураций vCPU и RAM.
- Intel Broadwell соответствует процессору Intel Xeon Processor E5-2660 v4;
- Intel Cascade Lake соответствует процессору Intel Xeon Gold 6230;
- Intel Ice Lake соответствует процессору Intel Xeon Gold 6338.
Типы конфигураций:
- s1, s2, s3 – стандартные конфигурации с соотношением количества гигабайт RAM к количеству vCPU 4:1;
- m2, m3 – конфигурации с увеличенным соотношением количества гигабайт RAM к количеству vCPU (8:1). Такие конфигурации могут быть полезны для кластеров с повышенными требованиями к кешу;
- c3 – конфигурации с уменьшенным соотношением количества гигабайт RAM к количеству vCPU (2:1). Такие конфигурации могут быть полезны для кластеров с повышенными требованиями к производительности процессора;
- b1, b2, b3 – конфигурации с гарантированной долей vCPU ниже 100%. Этот класс хостов предназначен для тестовой нагрузки, минимальная рекомендуемая конфигурация хоста для продакшн-решений – 2 vCPU с гарантированной долей 50%.
При изменении класса хостов для кластера меняются характеристики всех уже созданных экземпляров. Для тестовых версий, небольших баз данных и рекламных аккаунтов, в которых не так много статистики в Яндекс Директе, должно хватить и самой простой машины.
В блоке Ресурсы из выпадающего списка Платформы выберите Intel Cascade Lake:
А тип виртуальной машины – burstable:
А класс хоста – b2.medium:
Для данного типа и платформы в блоке Размер хранилища можно выбрать тип хранилища:
- сетевые HDD-диски (network-hdd) – самый экономичный вариант для кластеров, не требовательных к скорости записи и чтения;
- сетевые SSD-диски (network-ssd) – компромиссный вариант: медленнее, чем локальные SSD-диски, но, в отличие от них, обеспечивают сохранность данных при выходе из строя оборудования Yandex Cloud.
Есть и другие варианты хранилища:
- нереплицируемые SSD-диски (network-ssd-nonreplicated) – сетевые диски с повышенной производительностью, реализованной за счет устранения избыточности;
- сверхбыстрые сетевые SSD-диски с тремя репликами (network-ssd-io-m3) – сетевые диски с теми же скоростными характеристиками, что и нереплицируемые. Этот тип диска обеспечивает избыточность;
- локальные SSD-диски (local-ssd) – самые быстрые диски.
От выбранного типа дисков зависит, с каким шагом можно будет изменить размер хранилища:
- хранилище на локальных SSD-дисках для платформ Intel Broadwell и Intel Cascade Lake – с шагом 100 ГБ;
- хранилище на локальных SSD-дисках для платформы Intel Ice Lake – с шагом 368 ГБ;
- хранилище на нереплицируемых SSD-дисках – с шагом 93 ГБ.
Поскольку вы создаете свой первый кластер ClickHouse на базе Yandex Cloud, вы можете взять самый простой тип диска (network-hdd) и минимальное по объему хранилище (на 10 ГБ). Это позволит вам удешевить итоговый тариф на аренду вычислительных ресурсов. В дальнейшем вы сможете поменять конфигурацию и увеличить размер хранилища, если объем вашей статистики из Яндекс Директа будет превышать выбранный.
Выбрав данную конфигурацию, справа вы увидите итоговую стоимость обслуживания (аренды):
В блоке Сетевые настройки укажите Сеть и Группы безопасности, которые вы создали на предыдущих шагах:
В разделе Хосты напротив созданного хоста нажмите иконку карандаша и в открывшемся окне включите настройку публичного доступа:
Сохраните изменения.
В разделе Настройки СУБД задайте следующую конфигурацию:
- Управление пользователями через SQL – Выключено;
- Управление базами данных через SQL – Выключено (автоматически);
- Имя пользователя – user1 (оставьте по умолчанию);
- Пароль – минимум 8 символов (можно ввести вручную, а можно сгенерировать автоматически);
- Имя БД – db1 (оставьте по умолчанию);
- Движок – оставьте по умолчанию (изменить нельзя);
- Гибридное хранилище – нет.
В разделе Сервисные настройки обязательно поставьте галочки
- Доступ из DataLens – позволяет строить визуализации на основе данных из кластера, собирать дашборды и делиться полученными результатами;
- Доступ из WebSQL – позволяет исполнять запросы, делиться ими, просматривать и изменять схему баз данных;
- Сервисный аккаунт - укажите dataproc-s3-sa.
В завершение нажмите кнопку Создать кластер. После создания кластера ClickHouse вы увидите его в списке доступных:
Выполнив все эти шаги, мы с вами подготовили только инфраструктуру, без данных. Теперь будем работать со статистикой Яндекс Директа.
Подготовка данных Яндекс Директа
Подробно весь процесс написания программы и итоговой выгрузки данных Яндекс Директа локально на компьютер в формате csv представлен в нашей онлайн-документации. К сожалению, в этом руководстве не представляется возможным описать это все, поскольку тогда этот гайд будет выглядеть не как методическое пособие, а как целая книга на несколько сотен страниц.
Я предполагаю, что до этого шага вы дошли самостоятельно и выгрузили нужные данные из Яндекс Директа с помощью API. Первый файл с примером, который я буду использовать - это статистика рекламных кампаний, полученная с помощью сервиса Reports:
Второй файл - это дополнительные сведения о рекламных кампаниях, которые выгружены с помощью сервиса Campaigns и метода get:
Нам необходимо подготовить CSV к загрузке, а именно:
- проверить кодировку (CSV должен быть в UTF-8);
- убедиться, что разделитель - запятая.
Загрузка CSV в Object Storage
Согласно официальному руководству, необходимо создать в бакете для входных данных папку csv и загрузить в нее CSV-файлы.
Примечание: в примере Yandex Cloud используются две таблицы в формате CSV:
- coords.csv - содержит информацию о географических координатах автомобиля;
- sensors.csv - содержит информацию о скорости и рабочих параметрах автомобиля.
Однако такие данные мало пригодны для наглядного показа обработки статистики из Яндекс Директа и ее выгрузки из Object Storage в ClickHouse. Поэтому я использовал реальные данные из рабочего кабинета одного из своих клиентов.
Для этого перейдите в сервис Object Storage. Выберите бакет, в который нужно загрузить объект. В нашем примере - bucket-initial-data:
В открывшемся окне в правом верхнем углу нажмите Создать папку:
Укажите имя папки csv и нажмите кнопку Создать:
После создание папки перейдите в нее и нажмите Загрузить объекты:
В появившемся окне выберите файл со статистикой Яндекс Директа и нажмите Открыть:
Консоль управления отобразит все объекты, выбранные для загрузки и предложит для каждого из них выбрать класс хранилища. Класс хранилища по умолчанию определяется настройкой бакета:
Нажмите Загрузить.
После этого вы увидите в списке всех объектов ваш загруженный файл csv:
Загрузите второй файл с параметрами кампаний таким же способом:
Обработка данных в Yandex Data Processing
Теперь нам необходимо объединить данные из двух таблиц в одну и загрузить ее в формате Parquet в бакет, который вы ранее создали для результатов обработки. В нашем примере - bucket-processing-result.
Создайте локально файл с именем join-tables.py и скопируйте в него следующий скрипт:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 |
from pyspark.sql import SparkSession from pyspark.sql.functions import col # ===================== # Spark-сессия # ===================== spark = SparkSession.builder \ .appName("JoinReportsWithCampaigns") \ .getOrCreate() # ===================== # Пути к бакетам # ===================== INPUT_BUCKET = "<имя_входного_бакета>" OUTPUT_BUCKET = "<имя_выходного_бакета>" reports_path = f"s3a://{INPUT_BUCKET}/csv/reports.csv" campaigns_path = f"s3a://{INPUT_BUCKET}/csv/campaigns.csv" # ===================== # Чтение CSV # ===================== reports_df = spark.read \ .option("header", True) \ .option("inferSchema", True) \ .csv(reports_path) campaigns_df = spark.read \ .option("header", True) \ .option("inferSchema", True) \ .csv(campaigns_path) # ===================== # Приведение схемы campaigns # ===================== campaigns_df = campaigns_df \ .withColumnRenamed("campaign_id", "CampaignId") \ .withColumnRenamed("campaign_name", "campaign_name_meta") # ===================== # LEFT JOIN по CampaignId # ===================== joined_df = reports_df.join( campaigns_df, on="CampaignId", how="left" ) # ===================== # Сохранение в Parquet # ===================== joined_df.write \ .mode("overwrite") \ .parquet(f"s3a://{OUTPUT_BUCKET}/parquet/") |
, где вместо:
- INPUT_BUCKET задайте имя входного бакета, в котором хранятся исходные CSV-таблицы (в нашем примере - это bucket-initial-data);
- OUTPUT_BUCKET укажите имя выходного бакета, в который будет сохранен Parquet-файл с объединенными данными (в нашем примере - это bucket-processing-result).
На компьютере это может выглядеть так (в зависимости от того, какую IDE или программу вы используете для написания кода):
Этот скрипт в среде Yandex Data Processing читает два CSV-файла (reports.csv со статистикой и campaigns.csv со справочными данными кампаний) из Yandex Object Storage, приводит названия полей в campaigns.csv к общей схеме, затем выполняет LEFT JOIN по идентификатору кампании (CampaignId), обогащая статистику метаданными кампаний. Результат объединения сохраняется обратно в Object Storage в формате Parquet, готовом для дальнейшей загрузки в ClickHouse или аналитической обработки.
После этого создайте в бакете для входных данных (в нашем примере - это bucket-initial-data) папку scripts:
И загрузите в нее файл join-tables.py:
Создание задания PySpark
Перейдите в сервис Yandex Data Processing, нажмите на имя нужного кластера. Выберите вкладку Задания и создайте задание:
Задайте такие настройки:
- Имя - произвольное (например - Задание PySpark);
- Тип задания - PySpark;
- Main python файл - укажите путь к файлу скрипта join-tables.py.
|
1 |
s3a://<имя_входного_бакета>/scripts/join-tables.py |
В интерфейсе Yandex Cloud это будет выглядеть так:
Нажмите кнопку Создать задание.
Дождитесь завершения задания:
А затем проверьте, что в выходном бакете в папке parquet появился Parquet-файл part-00000-***:
Экспорт данных в ClickHouse
Осталось только перенести объединенную таблицу из Object Storage в кластер ClickHouse. Для этого локально создайте еще один файл с именем parquet-to-ch.py и скопируйте в него следующий скрипт:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
from pyspark.sql import SparkSession # Создание Spark-сессии spark = SparkSession.builder.appName("ParquetClickhouse").getOrCreate() # Чтение данных из Parquet-файла parquetFile = spark.read.parquet("s3a://<имя_выходного_бакета>/parquet/*.parquet") # Указание порта и параметров кластера ClickHouse® jdbcPort = 8443 jdbcHostname = "<идентификатор_кластера>.rw.mdb.yandexcloud.net" jdbcDatabase = "db1" jdbcUrl = f"jdbc:clickhouse://{jdbcHostname}:{jdbcPort}/{jdbcDatabase}?ssl=true" # Перенос таблицы из Parquet-файла в ClickHouse®-таблицу с именем measurements parquetFile.write.format("jdbc") \ .mode("error") \ .option("url", jdbcUrl) \ .option("dbtable", "measurements") \ .option("createTableOptions", "ENGINE = MergeTree() ORDER BY CampaignId") \ .option("user","user1") \ .option("password","<пароль_пользователя_ClickHouse®>") \ .save() |
Укажите в скрипте:
- в <имя_выходного_бакета> имя бакета, в котором лежит Parquet-файл (в нашем примере - это bucket-processing-result);
- в параметре jdbcHostname идентификатор кластера Managed Service for ClickHouse;
- в <пароль_пользователя_ClickHouse®> пароль пользователя ClickHouse.
Итоговый скрипт:

Пример созданного скрипта на компьютере (программа PyCharm)
Загрузите файл parquet-to-ch.py в бакет для входных данных в папку scripts:
Создание задания PySpark
Перейдите в сервис Yandex Data Processing и создайте еще одно задание. Задайте такие настройки:
- Имя - произвольное (например - Задание PySpark 2);
- Тип задания - PySpark;
- Main python файл - укажите путь к файлу скрипта parquet-to-ch.py.
|
1 |
s3a://<имя_входного_бакета>/scripts/parquet-to-ch.py |
В интерфейсе Yandex Cloud это будет выглядеть так:
Нажмите кнопку Создать задание.
Дождитесь завершения задания:
И убедитесь, что объединенная таблица с названием measurements перенесена в кластер. Для этого вы можете воспользоваться WebSQL, подключившись к ClickHouse, используя логин и пароль от БД:
Удаление созданных ресурсов
Как вы уже знаете, некоторые ресурсы Yandex Cloud платные. Чтобы за них не списывалась плата, удалите те, которые вы больше не будете использовать. Удалите объекты из бакетов и остальные ресурсы в зависимости от способа их создания:
- кластер Managed Service for ClickHouse;
- кластер Yandex Data Processing;
- бакеты Object Storage;
- подсеть;
- таблицу маршрутизации;
- NAT-шлюз;
- облачную сеть;
- сервисный аккаунт.
Итоги
Выполнение данного руководства позволяет не просто настроить автоматизацию, но и подняться на новую ступень в работе с маркетинговыми данными. То, как это нужно делать "по науке".
Чему вы научились?
- Работа с API. Вы освоили процесс регистрации приложений, получения OAuth-токенов и взаимодействия с API Яндекс Директа;
- Облачная инфраструктура. Вы научились разворачивать и связывать между собой сервисы Yandex Cloud: бакеты Object Storage, кластеры ClickHouse и среду обработки данных Yandex Data Processing;
- ETL-процессы. Вы усвоили механику трансформации данных из отдельных таблиц CSV в оптимизированный формат Parquet с последующей загрузкой в базу данных;
- Визуализация. Вы подготовили фундамент для создания автоматических отчетов в Yandex DataLens на основе готового подключения к ClickHouse, что позволяет презентовать результаты клиентам в реальном времени.
Логичный вопрос: почему нельзя сделать «проще»? Можно, и мы в своей онлайн-документации идем как раз по пути наименьшего сопротивления. Но он не всегда применим в крупных организациях. Простые решения (выгрузка в CSV, ручные отчеты, сторонние сервисы) работают до определенного момента. Как только появляются большие объемы данных, несколько клиентов или требования к автоматизации - без такой архитектуры уже не обойтись. Этот гайд показывает не «самый простой», а правильный и масштабируемый путь, так как здесь решается сразу несколько задач:
- работа с защищенным API и авторизацией;
- хранение больших объемов данных;
- трансформация данных в удобный для аналитики вид;
- масштабируемость и отказоустойчивость;
- соответствие требованиям Яндекса к использованию API.
Если вы только начинаете работать с API Яндекс Директа, наш онлайн-курс поможет быстрее разобраться в теме и избежать типичных ошибок.








































































































































