【问题标题】:Sync directory files to Google Cloud Composer dags/ folder将目录文件同步到 Google Cloud Composer dags/ 文件夹
【发布时间】:2020-08-12 17:08:16
【问题描述】:

我想通过一个简单的命令将我的存储库中文件夹的内容同步到 GCP Composer dags/ 文件夹。

gcloud composer cli 似乎对此有一个命令,但是它留下了一个警告,即正在删除对通配符的支持。

>> gcloud composer environments storage dags import \
      --source="dir/*" \
      --environment={env_name} \
      --location={loc}
WARNING: Use of gsutil wildcards is no longer supported in --source. Set the storage/use_gsutil property to get the old behavior back temporarily. However, this property will eventually be removed.

有没有一种方法可以使用此命令,其效果与将dir 的内容扩展至未弃用的作曲家dags/ 文件夹中的效果相同?我查看了gsutil rsync,但该命令很难忽略某些文件和目录。 GCloud 有一个很好的.gcloudignore 文件可以为您处理这个问题。

【问题讨论】:

    标签: gcloud gsutil google-cloud-composer


    【解决方案1】:

    你可以使用gsutil rsync

    gsutil rsync -r -c -x  -d local_directory gs://GCS-BUCKET-NAME/dags
    

    这将确保每次运行此命令时在本地目录和 days 目录之间同步。此外,它仅更新源目录和目标目录之间已修改的文件。

    【讨论】:

      【解决方案2】:

      自动化解决方案

      有一种方法可以自动执行此操作。你会使用Cloud BuildCloud Repositories

      首先,在 Cloud Source Repository 上创建一个存储库,其中包含您的 dag 和插件。添加一个名为cloudbuild.yaml 的文件,它将负责将您的文件与云存储同步。

      ├── cloudbuild.yaml
      ├── dags
      │   └── airflow_monitoring.py
      ├── plugins
      │   ├── hooks
      │   │   └── my_hook.py
      │   ├── operators
      │   │   └── my_operator.py
      │   └── sensors
      │       └── my_sensor.py
      

      cloudbuild.yaml 中,输入以下内容:

      steps:
      - name: ubuntu
        args: ['bash', '-c', "echo '$COMMIT_SHA' > REVISION.txt"]
      - name: gcr.io/cloud-builders/gsutil
        args:
          - '-m'
          - 'rsync'
          - '-d'
          - '-r'
          - 'dags'
          - 'gs://${_GCS_BUCKET}/dags'
      - name: gcr.io/cloud-builders/gsutil
        args:
          - '-m'
          - 'rsync'
          - '-d'
          - '-r'
          - 'plugins'
          - 'gs://${_GCS_BUCKET}/plugins'
      

      使用rsync命令,可以在源和目标之间同步修改过的文件。

      现在,转到Cloud Build 并使用以下配置创建触发器:

      这里最重要的设置是源(将是存储库)和分支。对该分支的每次推送都会触发构建。

      在第二部分,有两件事是重要的:

      1 - 构建配置文件(如果您遵循上述相同的文件夹结构,请不要担心此步骤。如果您更改了cloudbuild.yaml 文件的位置,请告知它在存储库中的位置)

      2 - 创建一个名为 _GCS_BUCKET 的变量,其中包含您的 Cloud Composer 存储桶名称

      然后,只需单击create,现在,每次您将内容推送到主分支时,您在存储库中的文件都会与您的 Cloud Composer 存储桶同步。

      【讨论】:

        【解决方案3】:

        命令gcloud composer environments storage dags import 从本地存储导入云作曲家存储桶。似乎它没有同步源和目标。在examples中,dags/文件夹中的现有文件不会被删除,只会添加新文件。

        鉴于 gcloud 命令仅将源内容复制到 dags/ 文件夹,gsutil 可以提供帮助:

        gsutil cp -r dir/* gs://composer-bucket/dags
        

        【讨论】:

          【解决方案4】:

          显然,--source 不再支持通配符。

          使用gcloud composer 命令可能更健壮,当然您不需要指定存储桶名称。因此,我使用了一个 for 循环将 DAG 导入到 DAG 文件夹的根目录中。 gcloud 命令也可能尊重.gcloudignore 文件。

          for entry in "$DAG_DIRECTORY"/*; do \
              gcloud composer environments storage dags import \
              --environment $GOOGLE_CLOUD_COMPOSER_ENVIRONMENT \
              --location $GOOGLE_CLOUD_LOCATION \
              --project $GOOGLE_CLOUD_PROJECT \
              --source "$entry"; \
          done
          

          【讨论】:

          • 但它们不再支持通配符一定是有原因的。我总是害怕这样做。对于更复杂的 dag,这当然是要走的路
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-11-19
          • 2020-09-27
          • 2017-03-03
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多