我已经设置了一个气流工作流程,可以将一些文件从s3提取到Google云端存储,然后运行SQL查询工作流程以在Big Query上创建新表格。在工作流程结束时,我需要将最后一个Big Query表的输出推送到Google Cloud Storage,然后从那里推送到S3。
我已经破解了使用BigQueryToCloudStorageOperator
python运算符将Big Query表转移到Google Cloud Storage时没有问题。然而,似乎从谷歌云存储到S3的转移是一个不那么简单的路线,我一直无法找到我可以在我的Airflow工作流程中自动化的解决方案。
我知道rsync
是gsutil
的一部分,并且已经开始工作(请参阅帖子Exporting data from Google Cloud Storage to Amazon S3),但我无法将其添加到我的工作流程中。
我有一个在计算引擎实例上运行的dockerised气流容器。
非常感谢帮助解决这个问题。
非常感谢!
答案 0 :(得分:4)
因此我们也使用rsync
在S3和GCS之间移动数据,
首先需要使用bash脚本,例如gsutil -m rsync -d -r gs://bucket/key s3://bucket/key
对于s3,您还需要提供AWS_ACCESS_KEY_ID
和AWS_SECRET_ACCESS_KEY
作为环境变量。
然后定义您的BashOperator并将其放入DAG文件
rsync_yesterday = BashOperator(task_id='rsync_task_' + table,
bash_command='Your rsync script',
dag=dag)
答案 1 :(得分:1)
Google建议将其transfer service
用于云平台之间的转移。您可以使用他们的python API以编程方式设置传输。这样,数据就可以直接在S3和谷歌云存储之间传输。使用gsutil
和rsync
的缺点是数据必须通过执行rsync
命令的机器/实例。这可以是一个瓶颈。
答案 2 :(得分:0)
我需要使用AWS Lambda将对象从GC存储桶复制到S3。
Python boto3库允许从GC存储桶中列出和下载对象。
下面是示例lambda代码,用于将“ sample-data-s3.csv”对象从GC存储桶复制到s3存储桶。
import boto3
import io
s3 = boto3.resource('s3')
google_access_key_id="GOOG1EIxxMYKEYxxMQ"
google_access_key_secret="QifDxxMYSECRETKEYxxVU1oad1b"
gc_bucket_name="my_gc_bucket"
def get_gcs_objects(google_access_key_id, google_access_key_secret,
gc_bucket_name):
"""Gets GCS objects using boto3 SDK"""
client = boto3.client("s3", region_name="auto",
endpoint_url="https://storage.googleapis.com",
aws_access_key_id=google_access_key_id,
aws_secret_access_key=google_access_key_secret)
# Call GCS to list objects in gc_bucket_name
response = client.list_objects(Bucket=gc_bucket_name)
# Print object names
print("Objects:")
for blob in response["Contents"]:
print(blob)
object = s3.Object('my_aws_s3_bucket', 'sample-data-s3.csv')
f = io.BytesIO()
client.download_fileobj(gc_bucket_name,"sample-data.csv",f)
object.put(Body=f.getvalue())
def lambda_handler(event, context):
get_gcs_objects(google_access_key_id,google_access_key_secret,gc_bucket_name)
您可以遍历blob
以从GC存储桶下载所有对象。
希望这可以帮助想要使用AWS Lambda将对象从GC存储桶传输到s3存储桶的人。