Cloud Composer将文件写入其他存储桶问题

时间:2019-12-16 10:20:39

标签: airflow google-cloud-composer

Airflow的新手。我正在尝试将结果保存到另一个存储桶中的文件(而不是一个存储桶中)。 我可以将文件保存到“ /home/airflow/gcs/data/test.json”中,然后使用gcs_hook.GoogleCloudStorageHook复制到另一个存储桶。这是代码:

def write_file_func(**context):
    file = f'/home/airflow/gcs/data/test.json'
    with open(file, 'w') as f:
        f.write(json.dumps('{"name":"aaa", "age":"10"}'))
def upload_file_func(**context):
    conn = gcs_hook.GoogleCloudStorageHook()
    source_bucket = 'source_bucket'
    source_object = 'data/test.json'
    target_bucket = 'target_bucket'
    target_object = 'test.json'
    conn.copy(source_bucket, source_object, target_bucket, target_object)
    conn.delete(source_bucket, source_object)

我的问题是:

  1. 我们可以直接在目标存储桶中写入文件吗?我在gcs_hook中找不到任何方法。

  2. 我尝试使用google.cloud.storage bucket.blob('test.json')。upload_from_string(),但是气流一直在说“ DAGag在服务器的DAGBag中不可用”,非常令人讨厌,我们是否不允许在DAG中使用该API?

  3. 如果我们可以直接使用google.cloud.storage/bigquery API,那么它与Airflow API有什么区别,例如gcs_hook / bigquery_hook?

谢谢

1 个答案:

答案 0 :(得分:0)

  1. 否,您不能“直接写入目标存储桶中的文件。”要修改存储在GCS中的文件,您需要在本地下载它,进行文件更改,然后将修改后的文件上传回GCS。有关更多信息,请参阅[Google Cloud Storage] [1]和[方法] [2]。

  2. 我已经在Apache Airflow中成功编译了以下代码。随时使用它。

import pip
import logging
from airflow import DAG
from airflow.operators.python_operator import PythonOperator
from airflow.contrib.hooks.gcs_hook import GoogleCloudStorageHook
import json
from datetime import datetime
def write_file_func():
    file = f'/home/airflow/gcs/data/test.json'
    with open(file, 'w') as f:
        f.write(json.dumps('{"name":"aaa", "age":"10"}'))
def upload_file_func():
    conn = GoogleCloudStorageHook()
    source_bucket = 'source_bucket'
    source_object = 'data/test.json'
    target_bucket = 'target_bucket'
    target_object = 'test.json'
    conn.copy(source_bucket, source_object, target_bucket, target_object)
    #conn.delete(source_bucket, source_object)
with DAG('load_gcs_file', description='DAG', schedule_interval=None, start_date=datetime(2018, 11, 1)) as dag:
    create_file	= PythonOperator(task_id='create_file', python_callable=write_file_func)
    copy_file	= PythonOperator(task_id='copy_file', python_callable=upload_file_func)
    
    create_file >> copy_file

注意:-)请更改source_bucket名称值以反映您的源存储桶名称。 -)请更改target_bucket名称值以反映您的目标存储桶名称。

  1. 气流挂钩是到外部库(例如google.cloud.storage)的可重用接口,以便许多不同的操作员可以以一致的方式与那些外部API通讯。
    一个通用的例子是外部库的更新:无需在使用外部库的每个位置都更新代码,只需更改挂钩代码即可。