В эти выходные я проходил бессерверный курс Google на Coursera, где они представили Dataflow, полностью управляемый сервис для запуска конвейеров обработки данных с использованием Apache Beam SDK. Я прошел курс и выполнил соответствующие лабораторные работы Qwik.

Когда-то приятной особенностью платформы Qwik labs было то, что вы почти не сталкиваетесь с какими-либо ошибками, и в случае, если вы это сделаете, Google хотел, чтобы вы столкнулись с этой ошибкой, и решение уже дано в шагах. Благодаря этой простоте я смог запустить все примеры Dataflow, которые были частью курса, и получил сертификат об окончании курса.

Даже после завершения курса я почему-то не был уверен в написании и запуске заданий Dataflow, поэтому я решил воссоздать пример Word Count (Hello World of Data Processing Frameworks) с нуля, используя только мою IDE Intellij. Я направился к странице примеров Apache Beam, где они показали, как запустить пример MinimalWordCount.

Хотя они дали инструкции по запуску конвейера Beam в потоке данных, они использовали Maven для компиляции и последующего выполнения конвейера. Чтобы понять основы, я также хотел отказаться от Maven. Я хотел использовать Maven для загрузки зависимостей, вот и все. За этим последовал ряд ошибок, которые было интересно решить и поучительно эксцентричными способами.

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

Этот пост разделен на следующие разделы:

  1. Предпосылки
  2. Ад зависимостей
  3. gcloud где ты?
  4. Сервисные аккаунты к вашим услугам
  5. утопия

Предпосылки

Прежде чем мы начнем с сообщения, давайте удостоверимся, что ваша система готова со всеми необходимыми боеприпасами. Как я уже упоминал, нам просто нужна IDE для начала. Мой выбор IDE — Intellij, но вы можете использовать все, что вам удобно: Netbeans, Eclipse или VS Code. Само собой разумеется, что для развертывания конвейера Beam в Dataflow вам потребуется учетная запись Google Cloud Platform (GCP). Вы можете зарегистрировать бесплатную пробную учетную запись, которая дает вам 300 долларов, чтобы опробовать платформу. Мы готовы погрузиться в остальную часть поста.

Ад зависимостей

С моей настройкой IDE я посмотрел, какие зависимости добавить, чтобы сразу приступить к кодированию. Быстрый поиск на mvnrepository.com дал длинный список зависимостей.

Помимо Beam я также наткнулся на специальный пакет Dataflow для Beam.

Я решил начать с добавления beam-sdks-java-core и начал писать код.

<!-- https://mvnrepository.com/artifact/org.apache.beam/beam-sdks-java-core -->
<dependency>
    <groupId>org.apache.beam</groupId>
    <artifactId>beam-sdks-java-core</artifactId>
    <version>2.14.0</version>
</dependency>

Код без зазрения совести взят со страницы примера Beam, и я добавил пользовательские PipelineOptions, чтобы помочь мне передавать входные и выходные местоположения из командной строки.

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

--runner=dataflow --outputLocation=gs://<MyY-BUCKET>/counts --project=<MY-GCP-PROJECT-ID> --gcpTempLocation=gs://<MY-BUCKET>/temp/

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

Вскоре я понял, что мне не хватает какого-то jar-файла, характерного для Dataflow runner, и добавил его.

<!-- https://mvnrepository.com/artifact/org.apache.beam/beam-runners-google-cloud-dataflow-java -->
<dependency>
    <groupId>org.apache.beam</groupId>
    <artifactId>beam-runners-google-cloud-dataflow-java</artifactId>
    <version>2.14.0</version>
</dependency>

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

gcloud где ты?

Caused by: java.lang.RuntimeException: Unable to get application default credentials. Please see https://developers.google.com/accounts/docs/application-default-credentials for details on how to specify credentials. This version of the SDK is dependent on the gcloud core component version 2015.02.05 or newer to be able to get credentials from the currently authorized user via gcloud auth.

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

Затем я вошел в SDK, используя следующую команду.

gcloud auth login

Я выполнил свою работу и снова столкнулся с ошибкой.

Exception in thread "main" java.lang.RuntimeException: Failed to create a workflow job: (b9d8d59d24d6b980): Dataflow API is not enabled.

Я проверил, и действительно, API потока данных не был включен, я включил его и снова запустил задание, и на этот раз задание потока данных было успешно отправлено. Мое счастье было мгновенным, так как моя работа в консоли находилась в состоянии сбоя.

Сервисные аккаунты к вашим услугам

Не каламбур, но это была реальная проблема. Я отправлял задание как мой пользователь, и в этом была проблема. Чтобы смягчить проблему, я создал учетную запись службы и назначил ей роль Разработчик DataFlow. Я также создал ключ JSON для аутентификации моего инструмента командной строки gcloud. Вы можете проверить, как создать учетную запись службы и дать ей разрешения здесь.

Как только я закончил создание учетной записи, я загрузил ключ JSON и активировал его.

gcloud auth activate-service-account --key-file <DOWNLOADED-JSON-FILE-PATH.json>

С надеждой в сердце и блеском в глазах я снова запустил задание, чтобы убедиться, что оно успешно отправлено и работает в консоли :)

утопия

Примерно через 7 минут моя работа была успешно завершена. Я проверил выходы в ведрах, и я мог видеть это там.

И вот оно. Немного другой тип приветственного поста, в котором нет ничего, кроме ошибок и решений ;)

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

А пока счастливого кодирования! :)