Запуск задания подсчета слов Hadoop в кластере Dataproc

1. Введение

Рабочие процессы — это распространенный сценарий использования в анализе данных: они включают в себя сбор, преобразование и анализ данных для поиска в них значимой информации. В Google Cloud Platform инструментом для организации рабочих процессов является Cloud Composer, представляющий собой размещенную версию популярного инструмента с открытым исходным кодом Apache Airflow. В этой лабораторной работе вы будете использовать Cloud Composer для создания простого рабочего процесса, который создает кластер Cloud Dataproc, анализирует его с помощью Cloud Dataproc и Apache Hadoop, а затем удаляет кластер Cloud Dataproc.

Что такое Cloud Composer?

Cloud Composer — это полностью управляемый сервис оркестрации рабочих процессов, позволяющий создавать, планировать и отслеживать конвейеры обработки данных, охватывающие как облачные среды, так и локальные центры обработки данных. Созданный на основе популярного проекта с открытым исходным кодом Apache Airflow и работающий на языке программирования Python, Cloud Composer не привязан к конкретному поставщику и прост в использовании.

Используя Cloud Composer вместо локального экземпляра Apache Airflow, пользователи могут в полной мере воспользоваться преимуществами Airflow без необходимости установки или управления.

Что такое Apache Airflow?

Apache Airflow — это инструмент с открытым исходным кодом, используемый для программного создания, планирования и мониторинга рабочих процессов. В ходе лабораторной работы вам следует запомнить несколько ключевых терминов, связанных с Airflow:

  • DAG (ориентированный ациклический граф) — это набор организованных задач, которые вы хотите запланировать и выполнить. DAG, также называемые рабочими процессами, определяются в стандартных файлах Python.
  • Оператор — это лицо, описывающее отдельную задачу в рабочем процессе.

Что такое Cloud Dataproc?

Cloud Dataproc — это полностью управляемый сервис Apache Spark и Apache Hadoop от Google Cloud Platform. Cloud Dataproc легко интегрируется с другими сервисами GCP, предоставляя мощную и полноценную платформу для обработки данных, аналитики и машинного обучения.

Что вы будете делать

В этом практическом задании показано, как создать и запустить рабочий процесс Apache Airflow в Cloud Composer, который выполняет следующие задачи:

  • Создает кластер Cloud Dataproc.
  • Запускает задачу подсчета слов Apache Hadoop в кластере и выводит ее результаты в облачное хранилище.
  • Удаляет кластер

Что вы узнаете

  • Как создать и запустить рабочий процесс Apache Airflow в Cloud Composer
  • Как использовать Cloud Composer и Cloud Dataproc для проведения аналитики на наборе данных
  • Как получить доступ к среде Cloud Composer через консоль Google Cloud Platform, Cloud SDK и веб-интерфейс Airflow.

Что вам понадобится

  • учетная запись GCP
  • Базовые знания командной строки.
  • Базовое понимание Python

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

Создать проект

Выберите или создайте проект на платформе Google Cloud.

Запишите идентификатор вашего проекта, который вы будете использовать на последующих этапах.

При создании нового проекта идентификатор проекта находится непосредственно под названием проекта на странице создания.

Если вы уже создали проект, вы можете найти его идентификатор на главной странице консоли в карточке «Информация о проекте».

Включите API

Включите API Cloud Composer, Cloud Dataproc и Cloud Storage . После их включения вы можете проигнорировать кнопку «Перейти к учетным данным» и перейти к следующему шагу руководства.

Создание среды Composer

Создайте среду Cloud Composer со следующей конфигурацией:

  • Имя: my-composer-environment
  • Местоположение: us-central1
  • Зона: us-central1-a

Все остальные параметры можно оставить по умолчанию. Нажмите кнопку «Создать» внизу.

Создать сегмент облачного хранилища

В вашем проекте создайте хранилище Cloud Storage со следующей конфигурацией:

  • Название: <ваш-идентификатор-проекта>
  • Класс хранения по умолчанию: Многорегиональный
  • Местоположение: Соединенные Штаты
  • Модель контроля доступа: детальная

Нажмите «Создать», когда будете готовы.

3. Настройка Apache Airflow

Просмотр информации об окружении Composer

В консоли GCP откройте страницу «Окружения» .

Щелкните по названию среды, чтобы просмотреть ее подробные характеристики.

На странице с подробными сведениями об окружении представлена ​​информация, такая как URL-адрес веб-интерфейса Airflow, идентификатор кластера Google Kubernetes Engine, имя сегмента Cloud Storage и путь к папке /dags.

В Airflow направленный ациклический граф ( DAG ) — это набор организованных задач, которые вы хотите запланировать и выполнить. DAG, также называемые рабочими процессами, определяются в стандартных файлах Python. Cloud Composer планирует только DAG в папке /dags. Папка /dags находится в сегменте Cloud Storage, который Cloud Composer создает автоматически при создании вашей среды.

Настройка переменных среды Apache Airflow

Переменные Apache Airflow — это специфическое для Airflow понятие, отличное от переменных окружения . На этом шаге вы установите следующие три переменные Airflow : gcp_project , gcs_bucket и gce_zone .

Использование gcloud для установки переменных

Сначала откройте Cloud Shell , в котором уже удобно установлен Cloud SDK.

Установите переменную среды COMPOSER_INSTANCE равным имени вашей среды Composer.

COMPOSER_INSTANCE=my-composer-environment

Чтобы задать переменные Airflow с помощью инструмента командной строки gcloud, используйте команду ` gcloud composer environments run с подкомандой ` variables . Эта команда gcloud composer выполняет подкоманду Airflow CLI ` variables . Подкоманда передает аргументы инструменту командной строки gcloud .

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

Установите переменную gcp_project , используя следующую команду, заменив <your-project-id> на идентификатор проекта, который вы записали на шаге 2.

gcloud composer environments run ${COMPOSER_INSTANCE} \
    --location us-central1 variables -- --set gcp_project <your-project-id>

Результат будет выглядеть примерно так.

kubeconfig entry generated for us-central1-my-composer-env-123abc-gke.
Executing within the following Kubernetes cluster namespace: composer-1-10-0-airflow-1-10-2-123abc
[2020-04-17 20:42:49,713] {settings.py:176} INFO - settings.configure_orm(): Using pool settings. pool_size=5, pool_recycle=1800, pid=449
[2020-04-17 20:42:50,123] {default_celery.py:90} WARNING - You have configured a result_backend of redis://airflow-redis-service.default.svc.cluste
r.local:6379/0, it is highly recommended to use an alternative result_backend (i.e. a database).
[2020-04-17 20:42:50,127] {__init__.py:51} INFO - Using executor CeleryExecutor
[2020-04-17 20:42:50,433] {app.py:52} WARNING - Using default Composer Environment Variables. Overrides have not been applied.
[2020-04-17 20:42:50,440] {configuration.py:522} INFO - Reading the config from /etc/airflow/airflow.cfg
[2020-04-17 20:42:50,452] {configuration.py:522} INFO - Reading the config from /etc/airflow/airflow.cfg

Установите переменную gcs_bucket , используя следующую команду, заменив <your-bucket-name> на идентификатор корзины, который вы записали на шаге 2. Если вы следовали нашим рекомендациям, имя вашей корзины совпадает с идентификатором вашего проекта. Результат будет аналогичен результату предыдущей команды.

gcloud composer environments run ${COMPOSER_INSTANCE} \
    --location us-central1 variables -- --set gcs_bucket gs://<your-bucket-name>

Установите значение параметра gce_zone с помощью следующей команды. Результат выполнения команды будет аналогичен результатам предыдущих команд.

gcloud composer environments run ${COMPOSER_INSTANCE} \
    --location us-central1 variables -- --set gce_zone us-central1-a

(Необязательно) Использование gcloud для просмотра переменной

Чтобы увидеть значение переменной, выполните подкоманду Airflow CLI variables с аргументом get или воспользуйтесь пользовательским интерфейсом Airflow .

Например:

gcloud composer environments run ${COMPOSER_INSTANCE} \
    --location us-central1 variables -- --get gcs_bucket

Это можно сделать с любой из трех только что установленных переменных: gcp_project , gcs_bucket и gce_zone .

4. Пример рабочего процесса

Давайте посмотрим на код для DAG, который мы будем использовать на шаге 5. Пока не беспокойтесь о загрузке файлов, просто следуйте инструкциям здесь.

Здесь много чего нужно обсудить, поэтому давайте разберем это по частям.

from airflow import models
from airflow.contrib.operators import dataproc_operator
from airflow.utils import trigger_rule

Начнём с импорта некоторых файлов из Airflow:

  • airflow.models — позволяет получать доступ к данным в базе данных Airflow и создавать в ней данные.
  • airflow.contrib.operators — Здесь размещаются операторы из сообщества. В данном случае нам нужен dataproc_operator для доступа к API Cloud Dataproc.
  • airflow.utils.trigger_rule — Для добавления правил запуска для наших операторов. Правила запуска позволяют точно контролировать, должен ли оператор выполняться в зависимости от состояния его родительских элементов.
output_file = os.path.join(
    models.Variable.get('gcs_bucket'), 'wordcount',
    datetime.datetime.now().strftime('%Y%m%d-%H%M%S')) + os.sep

Это указывает местоположение нашего выходного файла. Важная строка здесь — models.Variable.get('gcs_bucket') , которая получит значение переменной gcs_bucket из базы данных Airflow.

WORDCOUNT_JAR = (
    'file:///usr/lib/hadoop-mapreduce/hadoop-mapreduce-examples.jar'
)

input_file = 'gs://pub/shakespeare/rose.txt'

wordcount_args = ['wordcount', input_file, output_file]
  • WORDCOUNT_JAR — путь к файлу .jar, который мы в конечном итоге запустим в кластере Cloud Dataproc. Он уже размещен в GCP.
  • input_file — путь к файлу, содержащему данные, которые в конечном итоге будут обрабатываться в нашей задаче Hadoop. Мы загрузим данные в это место вместе на шаге 5.
  • wordcount_args — Аргументы, которые мы передадим в JAR-файл.
yesterday = datetime.datetime.combine(
    datetime.datetime.today() - datetime.timedelta(1),
    datetime.datetime.min.time())

Это даст нам объект даты и времени, эквивалентный полуночи предыдущего дня. Например, если это выполняется в 11:00 4 марта, объект даты и времени будет представлять 00:00 3 марта. Это связано с тем, как Airflow обрабатывает планирование. Более подробную информацию об этом можно найти здесь .

default_dag_args = {
    'start_date': yesterday,
    'email_on_failure': False,
    'email_on_retry': False,
    'retries': 1,
    'retry_delay': datetime.timedelta(minutes=5),
    'project_id': models.Variable.get('gcp_project')
}

Переменная default_dag_args в виде словаря должна передаваться при каждом создании нового DAG:

  • 'email_on_failure' — указывает, следует ли отправлять оповещения по электронной почте при сбое задачи.
  • 'email_on_retry' — указывает, следует ли отправлять оповещения по электронной почте при повторной попытке выполнения задачи.
  • 'retries' — указывает, сколько попыток повтора Airflow должен предпринять в случае сбоя DAG.
  • 'retry_delay' — указывает, как долго Airflow должен ждать перед попыткой повторного подключения.
  • 'project_id' — указывает DAG, с каким идентификатором проекта GCP его следует связать; эта информация понадобится позже при работе с оператором Dataproc.
with models.DAG(
        'composer_hadoop_tutorial',
        schedule_interval=datetime.timedelta(days=1),
        default_args=default_dag_args) as dag:

Использование with models.DAG указывает скрипту включить все элементы, расположенные ниже, в тот же DAG. Также мы видим три переданных аргумента:

  • Первая переменная, строка, — это имя, которое мы будем присваивать создаваемому DAG. В данном случае мы используем composer_hadoop_tutorial .
  • schedule_interval — объект datetime.timedelta , для которого здесь установлено значение в один день. Это означает, что данный DAG будет пытаться выполниться один раз в день после 'start_date' , установленного ранее в 'default_dag_args'
  • default_args — словарь, созданный нами ранее, содержащий аргументы по умолчанию для DAG.

Создайте кластер Dataproc.

Далее мы создадим оператор dataproc_operator.DataprocClusterCreateOperator , который создаст кластер Cloud Dataproc.

    create_dataproc_cluster = dataproc_operator.DataprocClusterCreateOperator(
        task_id='create_dataproc_cluster',
        cluster_name='composer-hadoop-tutorial-cluster-{{ ds_nodash }}',
        num_workers=2,
        zone=models.Variable.get('gce_zone'),
        master_machine_type='n1-standard-1',
        worker_machine_type='n1-standard-1')

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

  • task_id — Как и в BashOperator, это имя, которое мы присваиваем оператору, и его можно увидеть в пользовательском интерфейсе Airflow.
  • cluster_name — имя, которое мы присваиваем кластеру Cloud Dataproc. В данном случае мы назвали его composer-hadoop-tutorial-cluster- (см. информационное окно для получения дополнительной информации).
  • num_workers — количество рабочих процессов, выделяемых кластеру Cloud Dataproc.
  • zone — географический регион, в котором мы хотим разместить кластер, сохраненный в базе данных Airflow. Для этого будет использоваться переменная 'gce_zone' которую мы установили на шаге 3.
  • master_machine_type — Тип машины, которую мы хотим выделить для главного сервера Cloud Dataproc.
  • worker_machine_type — Тип машины, которую мы хотим выделить для обработчика Cloud Dataproc.

Отправить задание Apache Hadoop

Объект dataproc_operator.DataProcHadoopOperator позволяет отправлять задания в кластер Cloud Dataproc.

    run_dataproc_hadoop = dataproc_operator.DataProcHadoopOperator(
        task_id='run_dataproc_hadoop',
        main_jar=WORDCOUNT_JAR,
        cluster_name='composer-hadoop-tutorial-cluster-{{ ds_nodash }}',
        arguments=wordcount_args)

Мы предоставляем несколько параметров:

  • task_id — имя, которое мы присваиваем этому фрагменту DAG.
  • main_jar - Расположение файла .jar, который мы хотим запустить в кластере.
  • cluster_name — имя кластера, на котором будет выполняться задание; как вы заметите, оно идентично тому, что мы находим в предыдущем операторе.
  • arguments — аргументы, передаваемые в JAR-файл, как если бы вы запускали JAR-файл из командной строки.

Удалить кластер

Последний оператор, который мы создадим, — это dataproc_operator.DataprocClusterDeleteOperator .

    delete_dataproc_cluster = dataproc_operator.DataprocClusterDeleteOperator(
        task_id='delete_dataproc_cluster',
        cluster_name='composer-hadoop-tutorial-cluster-{{ ds_nodash }}',
        trigger_rule=trigger_rule.TriggerRule.ALL_DONE)

Как следует из названия, этот оператор удалит заданный кластер Cloud Dataproc. Здесь мы видим три аргумента:

  • task_id — Как и в BashOperator, это имя, которое мы присваиваем оператору, и его можно увидеть в пользовательском интерфейсе Airflow.
  • cluster_name — имя, которое мы присваиваем кластеру Cloud Dataproc. В данном случае мы назвали его composer-hadoop-tutorial-cluster- (см. информационное окно после "Создать кластер Dataproc" для получения дополнительной информации).
  • trigger_rule — Мы кратко упомянули правила запуска во время импорта в начале этого шага, но здесь мы видим одно из них в действии. По умолчанию оператор Airflow не выполняется, пока все его вышестоящие операторы не завершат свою работу успешно. Правило запуска ALL_DONE требует только завершения работы всех вышестоящих операторов, независимо от того, были ли они успешными или нет. В данном случае это означает, что даже если задание Hadoop завершилось с ошибкой, мы все равно хотим остановить кластер.
  create_dataproc_cluster >> run_dataproc_hadoop >> delete_dataproc_cluster

Наконец, мы хотим, чтобы эти операторы выполнялись в определенном порядке, и мы можем обозначить это с помощью операторов битового сдвига Python. В этом случае сначала всегда будет выполняться create_dataproc_cluster , затем run_dataproc_hadoop и, наконец, delete_dataproc_cluster .

В итоге, код выглядит так:

# Copyright 2018 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

# [START composer_hadoop_tutorial]
"""Example Airflow DAG that creates a Cloud Dataproc cluster, runs the Hadoop
wordcount example, and deletes the cluster.

This DAG relies on three Airflow variables
https://airflow.apache.org/concepts.html#variables
* gcp_project - Google Cloud Project to use for the Cloud Dataproc cluster.
* gce_zone - Google Compute Engine zone where Cloud Dataproc cluster should be
  created.
* gcs_bucket - Google Cloud Storage bucket to use for result of Hadoop job.
  See https://cloud.google.com/storage/docs/creating-buckets for creating a
  bucket.
"""

import datetime
import os

from airflow import models
from airflow.contrib.operators import dataproc_operator
from airflow.utils import trigger_rule

# Output file for Cloud Dataproc job.
output_file = os.path.join(
    models.Variable.get('gcs_bucket'), 'wordcount',
    datetime.datetime.now().strftime('%Y%m%d-%H%M%S')) + os.sep
# Path to Hadoop wordcount example available on every Dataproc cluster.
WORDCOUNT_JAR = (
    'file:///usr/lib/hadoop-mapreduce/hadoop-mapreduce-examples.jar'
)
# Arguments to pass to Cloud Dataproc job.
input_file = 'gs://pub/shakespeare/rose.txt'

wordcount_args = ['wordcount', input_file, output_file]

yesterday = datetime.datetime.combine(
    datetime.datetime.today() - datetime.timedelta(1),
    datetime.datetime.min.time())

default_dag_args = {
    # Setting start date as yesterday starts the DAG immediately when it is
    # detected in the Cloud Storage bucket.
    'start_date': yesterday,
    # To email on failure or retry set 'email' arg to your email and enable
    # emailing here.
    'email_on_failure': False,
    'email_on_retry': False,
    # If a task fails, retry it once after waiting at least 5 minutes
    'retries': 1,
    'retry_delay': datetime.timedelta(minutes=5),
    'project_id': models.Variable.get('gcp_project')
}

# [START composer_hadoop_schedule]
with models.DAG(
        'composer_hadoop_tutorial',
        # Continue to run DAG once per day
        schedule_interval=datetime.timedelta(days=1),
        default_args=default_dag_args) as dag:
    # [END composer_hadoop_schedule]

    # Create a Cloud Dataproc cluster.
    create_dataproc_cluster = dataproc_operator.DataprocClusterCreateOperator(
        task_id='create_dataproc_cluster',
        # Give the cluster a unique name by appending the date scheduled.
        # See https://airflow.apache.org/code.html#default-variables
        cluster_name='composer-hadoop-tutorial-cluster-{{ ds_nodash }}',
        num_workers=2,
        zone=models.Variable.get('gce_zone'),
        master_machine_type='n1-standard-1',
        worker_machine_type='n1-standard-1')

    # Run the Hadoop wordcount example installed on the Cloud Dataproc cluster
    # master node.
    run_dataproc_hadoop = dataproc_operator.DataProcHadoopOperator(
        task_id='run_dataproc_hadoop',
        main_jar=WORDCOUNT_JAR,
        cluster_name='composer-hadoop-tutorial-cluster-{{ ds_nodash }}',
        arguments=wordcount_args)

    # Delete Cloud Dataproc cluster.
    delete_dataproc_cluster = dataproc_operator.DataprocClusterDeleteOperator(
        task_id='delete_dataproc_cluster',
        cluster_name='composer-hadoop-tutorial-cluster-{{ ds_nodash }}',
        # Setting trigger_rule to ALL_DONE causes the cluster to be deleted
        # even if the Dataproc job fails.
        trigger_rule=trigger_rule.TriggerRule.ALL_DONE)

    # [START composer_hadoop_steps]
    # Define DAG dependencies.
    create_dataproc_cluster >> run_dataproc_hadoop >> delete_dataproc_cluster
    # [END composer_hadoop_steps]

# [END composer_hadoop]

5. Загрузите файлы Airflow в облачное хранилище.

Скопируйте DAG в папку /dags.

  1. Сначала откройте Cloud Shell , в котором уже удобно установлен Cloud SDK.
  2. Клонируйте репозиторий с примерами Python и перейдите в директорию composer/workflows.
git clone https://github.com/GoogleCloudPlatform/python-docs-samples.git && cd python-docs-samples/composer/workflows
  1. Выполните следующую команду, чтобы задать имя папки с DAG-файлами в качестве имени переменной среды.
DAGS_FOLDER=$(gcloud composer environments describe ${COMPOSER_INSTANCE} \
--location us-central1 --format="value(config.dagGcsPrefix)")
  1. Выполните следующую команду gsutil , чтобы скопировать код из руководства в папку /dags, где она создана.
gsutil cp hadoop_tutorial.py $DAGS_FOLDER

Результат будет выглядеть примерно так:

Copying file://hadoop_tutorial.py [Content-Type=text/x-python]...
/ [1 files][  4.1 KiB/  4.1 KiB]
Operation completed over 1 objects/4.1 KiB.

6. Использование пользовательского интерфейса Airflow

Для доступа к веб-интерфейсу Airflow с помощью консоли GCP:

  1. Откройте страницу «Окружения» .
  2. В столбце «Веб-сервер Airflow» для вашей среды щелкните значок нового окна. Веб-интерфейс Airflow откроется в новом окне браузера.

Для получения информации о пользовательском интерфейсе Airflow см. раздел «Доступ к веб-интерфейсу» .

Просмотреть переменные

Заданные вами ранее переменные сохраняются в вашей среде. Вы можете просмотреть переменные, выбрав «Администрирование» > «Переменные» в строке меню пользовательского интерфейса Airflow.

List tab is selected and shows a table with the following keys and values key: gcp_project, value: project-id key: gcs_bucket, value: gs://bucket-name key: gce_zone, value: zone

Изучение алгоритмов DAG

Когда вы загружаете файл DAG в папку dags в Cloud Storage, Cloud Composer анализирует файл. Если ошибок не обнаружено, имя рабочего процесса отображается в списке DAG, и рабочий процесс ставится в очередь на немедленное выполнение. Чтобы просмотреть свои DAG, нажмите на кнопку DAG в верхней части страницы.

84a29c71f20bff98.png

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

f4f1663c7a37f47c.png

Теперь на панели инструментов нажмите «Просмотр графика» , а затем наведите курсор мыши на график каждой задачи, чтобы увидеть ее статус. Обратите внимание, что рамка вокруг каждой задачи также указывает на ее статус (зеленая рамка = выполняется; красная = не выполнено и т. д.).

4c5a0c6fa9f88513.png

Чтобы повторно запустить рабочий процесс из представления графика :

  1. В окне Airflow UI Graph View щелкните графический элемент create_dataproc_cluster .
  2. Нажмите «Очистить» , чтобы сбросить три задачи, а затем нажмите «ОК» для подтверждения.

fd1b23b462748f47.png

Вы также можете проверить статус и результаты выполнения рабочего процесса composer-hadoop-tutorial перейдя на следующие страницы консоли GCP:

  • Cloud Dataproc Clusters позволяет отслеживать создание и удаление кластеров. Обратите внимание, что кластер, созданный в ходе рабочего процесса, является временным: он существует только в течение выполнения рабочего процесса и удаляется в рамках последней задачи рабочего процесса.
  • Используйте Cloud Dataproc Jobs для просмотра или мониторинга задания подсчета слов Apache Hadoop. Щелкните идентификатор задания, чтобы просмотреть вывод журнала задания.
  • Откройте браузер Cloud Storage , чтобы просмотреть результаты подсчета слов в папке wordcount в созданном вами для этого практического задания сегменте Cloud Storage.

7. Уборка

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

  1. (Необязательно) Чтобы сохранить данные, загрузите их из хранилища Cloud Storage для среды Cloud Composer и из хранилища, созданного вами для этого практического задания.
  2. Удалите созданный вами сегмент облачного хранилища для этого практического занятия.
  3. Удалите сегмент облачного хранилища для данной среды.
  4. Удалите среду Cloud Composer . Обратите внимание, что удаление среды не приводит к удалению хранилища для этой среды.

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

  1. В консоли GCP перейдите на страницу «Проекты» .
  2. В списке проектов выберите проект, который хотите удалить, и нажмите «Удалить».
  3. В поле введите идентификатор проекта, а затем нажмите «Завершить» , чтобы удалить проект.