繁体   English   中英

Airflow 操作员将许多文件(目录、前缀)从谷歌云存储桶复制到本地文件系统

[英]Airflow operator to copy many files (directory, prefix) from Google Cloud Storage bucket to local filesystem

有一个 Airflow 运算符GCSToLocalFilesystemOperator将一个文件从 GCS 存储桶复制到本地文件系统。 但它只支持一个文件,并且不可能为给定的前缀复制多个文件。

有一个反向运算符LocalFilesystemToGCSOperator允许将许多文件从本地文件系统复制到存储桶,您只需在路径“/*”中使用星号即可。

您知道在 Airflow 中通过前缀将文件从存储桶复制到本地文件系统的最佳方法是什么吗? 我是不是遗漏了什么,或者它不是因为某种原因才实施的?

到目前为止,我提出的解决方案是在将文件放入存储桶之前对其进行压缩,使用 airflow 作为一个文件下载并在本地使用BashOperator解压缩。 我想知道是否有更好的方法。

我能够使用以下方法成功地将多个文件从 GCS 存储桶复制到 Airflow 中给定前缀的本地文件系统(映射)。

import datetime

from airflow import models
from airflow.operators import bash
from airflow.providers.google.cloud.hooks.gcs import GCSHook
from airflow.operators import python


YESTERDAY = datetime.datetime.now() - datetime.timedelta(days=1)
BUCKET_NAME = 'qpalzm-bucket'
GCS_FILES = ['luffy.jpg', 'zoro.jpg']
LOCAL_PATH = '/home/airflow/gcs/data'
PREFIX = 'testfolder'

default_args = {
    'owner': 'Composer Example',
    'depends_on_past': False,
    'email': [''],
    'email_on_failure': False,
    'email_on_retry': False,
    'retries': 1,
    'retry_delay': datetime.timedelta(minutes=5),
    'start_date': YESTERDAY,
}
#
with models.DAG(
        'multi_copy_gcs_to_local',
        catchup=False,
        default_args=default_args,
        schedule_interval=datetime.timedelta(days=1)) as dag:

    def multi_copy(**kwargs):
        hook = GCSHook()

        for gcs_file in GCS_FILES:
            #initialize file name and the local directory where it will be copied
            filename = f'{LOCAL_PATH}/{gcs_file}'
            
            #check if PREFIX is available and initialize the gcs file to be copied
            if PREFIX:
                object_name = f'{PREFIX}/{gcs_file}'
            
            else:
                object_name = f'{gcs_file}'

            #perform gcs hook download
            hook.download(
                bucket_name = BUCKET_NAME,
                object_name = object_name,
                filename = filename
            )

    #execute multi_copy method
    multi_copy_op = python.PythonOperator(
            task_id='multi_gcs_to_local',
            provide_context=True,
            python_callable=multi_copy,
            )

    multi_copy_op

Output: 在此处输入图像描述

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM