【发布时间】:2019-12-22 22:33:40
【问题描述】:
我正在尝试构建一个自动流程,将聚合数据从 BigQuery 传输到 redshift。看了很多我发现最好的方法是这样的:
BigQuery -> 导出到 Google 云存储 -> 使用 gsutil 传输到 S3 -> 从 CSV 复制到 Redshift 上的表中。
我把它做成了一个 python 脚本,在我的电脑上运行时似乎一切正常。
但是做了一些测试,我发现直接从 Cloud Shell 使用 gsutil 可以加快文件传输速度。好像亚马逊和谷歌有一些专门的数据管道什么的。
我正在尝试将传输过程移动到我将通过请求触发的谷歌云函数(在 python 中,但只要它有效,语言最终无关紧要)。使用子进程和操作系统。都没有奏效。 python 函数中的 Shell 命令似乎通常不起作用。
这是 Cloud Function 的代码,从 Cloud Shell 手动运行时可以完美运行:
import subprocess
def hello_world(request):
data = subprocess.call('gsutil -m cp gs://bucket/file.csv s3://bucket/',shell=True)
print(data)
return 'Success!'
传输文件后,我将为插入 Redshift 表的 lambda 函数创建一些 S3 触发器。
我读到这个:How to Transfer data from Google cloud storage to S3 without any manual activity?
但是调度器对我没有多大意义?也许我做错了什么。我似乎可以提出要求?但这并不能解决shell命令不被执行的问题。
如果有更好的选择,我愿意接受。是否值得寻找相反的方法?在 AWS 上使用 Lambda 和 gsutil。
【问题讨论】:
-
“它不起作用”是什么意思?它是否引发了异常,是否返回了错误,您是否从子进程捕获了 stdout/stderr 输出并告诉了您一些有用的信息?除此之外,看看 boto3 - 你也许可以将它连接到 GCS 作为数据源,将 S3 作为数据接收器。
-
函数执行了,什么也没发生。数据字段内的返回为 0。函数执行开始 0 函数执行耗时 180 毫秒,完成状态码:200
标签: python amazon-web-services amazon-s3 google-cloud-platform google-cloud-storage