【问题标题】:Run script which is stored at GCS | Airflow | VM运行存储在 GCS | 的脚本气流 |虚拟机
【发布时间】:2022-02-01 03:04:49
【问题描述】:

我在 GCS 存储桶中有一个脚本。我想使用 BashOperator 在我的气流 dag 中运行脚本。 VM 中存在气流。 我的限制是我无法在 VM 中复制该脚本并运行,因为它内部运行了一些作业和连接。如果我复制脚本,我还必须复制依赖的 jar 和文件。 我尝试使用gsutil cat <script path in bucket> | sh,但它不起作用。 我还遇到了使用以下代码访问存储桶文件的帖子,但我不知道如何在 BashOperator 中使用它或运行它。

from google.cloud import storage

client = storage.Client()

bucket = client.get_bucket('test_bucket')

blob = bucket.get_blob('temp_files_folder/test.txt')

任何建议!

【问题讨论】:

    标签: bash google-cloud-platform google-cloud-storage virtual-machine airflow


    【解决方案1】:

    要将 Cloud Storage 文件用作本地文件,您可以使用 GCSFuse 将存储桶挂载到文件夹中,然后您可以直接从 VM 使用该文件,但该文件从未离开 Cloud Storage 位置。

    【讨论】:

    • 使用 GCSFuse 它会在源(桶)或虚拟机上运行脚本吗?如果它在 VM 上运行,那么脚本中提到的路径将在 VM 中搜索,这将导致问题!
    • 你不能在云存储上运行任何东西,它只是一个存储系统。但是,您可以在 VM 上运行东西。因此,在您的情况下,脚本在 VM 上运行。如果依赖项也存储在存储桶中并且您有相对路径,它应该可以工作。如果依赖项有完整的路径定义,也许将存储桶安装在正确的目录中可以解决问题。
    • 是的,依赖存储在bucket中。当您说“相对路径”时,您是什么意思。抱歉这些问题。我是新手。
    • 您拥有从系统根目录开始的绝对路径,例如 /this/is/absolute/path 和从当前目录开始的相对路径,例如 ./this/is/relative。如果是相对的,那么使用 GCS fuse 挂载存储桶的位置无关紧要,因为路径是相对于当前脚本目录的。如果绝对不是。
    【解决方案2】:

    如果你不想使用 Airflow VM (current),你必须使用另一个环境 (VM) 来运行。我认为最简单的方法是将您的 Java 程序包装到 Docker 容器中,添加所需的包并运行它,例如在 Google Cloud Run/Cloud Function 中。 不要将 Java 文件 (-s) 存储在 GCP 中,而是将 Docker 映像存储在 DockerHub、Google Cloud Registry 或其他服务中。

    您可以在运行容器时将连接设置作为环境变量或命令参数传递。 显然,您可以使用当前的 Airflow VM(如果安装了 Docker)来运行 Docker 容器。 一些有用的链接:

    1. 气流 DockerOperator https://airflow.apache.org/docs/apache-airflow-providers-docker/stable/_api/airflow/providers/docker/operators/docker/index.html
    2. 为 Cloud Run/Function https://airflow.apache.org/docs/apache-airflow-providers-google/stable/operators/cloud/workflows.html 创建工作流

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-08
      • 2021-07-10
      • 2013-01-05
      • 2016-08-25
      • 2020-09-16
      • 1970-01-01
      相关资源
      最近更新 更多