Как создать кластер Datapro c со временем жизни, используя Python SDK - PullRequest
2 голосов
/ 11 февраля 2020

Я пытаюсь создать кластер Datapro c, у которого время жизни составляет 1 день, используя python SDK . Для этой цели v1beta2 API Datapro c представляет объект LifecycleConfig , который является дочерним по отношению к объекту ClusterConfig.

Я использую этот объект в файле JSON, который я передаю методу create_cluster. Чтобы установить конкретный TTL, я использую поле auto_delete_ttl, которое должно иметь значение 86 400 секунд (один день).

Документация по буферам протокола Google довольно специфична c о как представить длительность в файле JSON: Длительности должны быть представлены в виде строки с суффиксом s для секунд, и должно быть 0,3,6 или 9 дробных секунд:

Protocol Buffers Documentation

Однако, если я передаю длительность, используя этот формат, я получаю ошибку:

Параметр для MergeFrom () должен быть экземпляром того же класса: ожидаемый google.protobuf. Длительность получена стр.

. Вот как я создаю кластер:

from google.cloud import dataproc_v1beta2
project = "your_project_id"
region = "europe-west4"
cluster = "" #see below for cluster JSON file
client = dataproc_v1beta2.ClusterControllerClient(client_options={
    'api_endpoint': '{}-dataproc.googleapis.com:443'.format(region)
})

# Create the cluster
operation = client.create_cluster(project, region, cluster)

Переменный кластер содержит объект JSON, описывающий нужный кластер:

{
  "cluster_name":"my_cluster",
  "config":{
     "config_bucket":"my_conf_bucket",
     "gce_cluster_config":{
        "zone_uri":"europe-west4-a",
        "metadata":{
           "PIP_PACKAGES":"google-cloud-storage google-cloud-bigquery"
        },
        "subnetwork_uri":"my subnet",
        "service_account_scopes":[
           "https://www.googleapis.com/auth/cloud-platform"
        ],
        "tags":[
           "some tags"
        ]
     },
     "master_config":{
        "num_instances":1,
        "machine_type_uri":"n1-highmem-4",
        "disk_config":{
           "boot_disk_type":"pd-standard",
           "boot_disk_size_gb":200,
           "num_local_ssds":0
        },
        "accelerators":[

        ]
     },
     "software_config":{
        "image_version":"1.4-debian9",
        "properties":{
           "dataproc:dataproc.allow.zero.workers":"true",
           "yarn:yarn.log-aggregation-enable":"true",
           "dataproc:dataproc.logging.stackdriver.job.driver.enable":"true",
           "dataproc:dataproc.logging.stackdriver.enable":"true",
           "dataproc:jobs.file-backed-output.enable":"true"
        },
        "optional_components":[

        ]
     },
     "lifecycle_config":{
        "auto_delete_ttl":"86400s"
     },
     "initialization_actions":[
        {
           "executable_file":"gs://some-init-script"
        }
     ]
  },
  "project_id":"project_id"
  }

Версии пакета, которые я использую:

  • google-cloud-datapro c: 0.6.1
  • protobuf: 3.11.3
  • googleapis-common- protos: 1.6.0

Я что-то не так делаю, это проблема с неправильным пакетом версии kage или это вообще баг?

1 Ответ

2 голосов
/ 11 февраля 2020

Вы должны использовать формат 100s для типа продолжительности, когда вы создаете protobuf в текстовом формате (например, json, et c), но вы используете объект Python для создания тела запроса API, то есть почему вам нужно создать объект Duration вместо строки:

duration_message.FromSeconds(86400)
...