雪花往返ETL体系结构的S3管道建议

时间:2020-06-13 23:51:02

标签: amazon-web-services amazon-s3 etl pipeline snowflake-cloud-data-platform

我正在尝试建立一个管道,该管道将数据从Snowflake发送到S3,然后从S3发送回Snowflake(在Sagemaker上通过生产ML模型运行后再发送)。我是数据工程的新手,所以我很想听听社区中推荐的路径。管道要求如下:

  1. 我希望安排每月工作。我是在AWS还是在Snowflake端指定此类代码?
  2. 对于最初的需求,我想从Snowflake查询12个月的数据。但是,对于以后的任何拉动,我只需要最后一个月,因为这应该是每月一次的管道。
  3. 所有每月数据提取都应存储在自己的S3子文件夹中,例如query_01012020,query_01022020,query_01032020等。
  4. 在ML模型在Sagemaker中成功对数据评分之后,应触发从S3返回指定的Snowflake表的数据加载。
  5. 我想在生产超时情况下监控ML模型的性能,以发现模型是否降低了其准确性(也许是一些类似校准的图形)。
  6. 我希望在发生管道问题时实时获取任何错误通知。

我希望您能够为此目的在相关文档/教程上指导我。我真的很感谢指导。

非常感谢。

2 个答案:

答案 0 :(得分:0)

Snowflake没有任何编排工具,例如Airflow或Oozie。因此,您需要使用或考虑使用某些Mattfion等Snowflake Partner Ecosystem工具。或者,您可以使用Spark或python或任何其他可以使用JDBC / ODBC / Python连接雪花的编程语言来构建自己的端到端流。连接器。

要将数据实时从s3馈送到雪花,您可以使用AWS SNS服务并调用SnowPipe将数据馈送到Snowflake Stage环境,并通过ETL流程将其继续传输以供使用。

回答您的每个问题

I am looking to schedule a monthly job. Do I specify such in AWS or on the Snowflake side?

在雪花中是不可能的,您必须通过AWS或其他一些工具来完成。

For the initial pull, I want to query 12 months' worth of data from Snowflake. However, for any subsequent pull, I only need the last month since this should be a monthly pipeline.

回答:您可以提取任意大小的数据,也可以通过SF提供一些脚本来支持该数据,但是需要对调用进行编程。

All monthly data pulls should be stored in own S3 subfolder like this query_01012020,query_01022020,query_01032020 etc.

回答:可以通过AWS SNS(或REST API)+ SnowPipe向Snowflake馈送数据,但反之亦然。

在ML模型在Sagemaker中成功对数据进行评分之后,应触发从S3返回指定的Snowflake表的数据加载。

回答:这可以通过AWS SNS + SnowPipe实现。

I want to monitor the performance of the ML model in production overtime to catch if the model is decreasing its accuracy (some calibration-like graph perhaps).

答案:不可能通过雪花。

答案 1 :(得分:0)

我会这样处理:

在一个临时表中保存12个月的数据(我确定您知道所有必需的查询,就在您问了教程之后,我认为这对您和其他人都会有所帮助)

-- Initial Pull Hold 12 months of Data .... 
Drop table if exists <TABLE_NAME>; 
Create Temporary Table <TABLE_NAME> as (
Select * 
From Original Table 
Where date_field between current_date -365 and Current_date 
); 

-- Export data to S3 ... 
copy into 's3://path/to/export/directory'
from DB_NAME.SCHEMA_NAME.TABLE_NAME
file_format = (type = csv field_delimiter = '|' skip_header = 0)
credentials=(aws_key_id='your_aws_key_id' aws_secret_key='your_aws_secret_key');

一旦完成了ML的工作,就可以像这样将数据导入雪花:

-- Import to S3 ... 
copy into DB_NAME.SCHEMA_NAME.TABLE_NAME
from 's3://path/to/your/csv_file_name.csv'
credentials=(aws_key_id='your_aws_key_id' aws_secret_key='your_aws_secret_key')
file_format = (type = csv field_delimiter = '|' skip_header = 1); 

我不确定雪花是否发布了ML内容以及您将如何在最终使用ML等。

对于调度,我建议:

  1. 将您的代码放置在Shell脚本或python脚本中,并将其安排为每月运行一次。

  2. 按如下所示使用Snowflake任务:

创建任务month_task_1 仓库= 时间表='使用CRON 0 0 1 * *美国/芝加哥' 如 在此处插入创建临时表查询

创建任务month_task_2 仓库= 在monthly_task_1之后 如 在此处插入您的S3导出查询;

您可以在此处了解有关雪花任务的更多信息:https://docs.snowflake.com/en/sql-reference/sql/create-task.html

要在完成ML填充后将结果从S3导入到Snowflake,可以在ML代码中添加几行(大概在Python中),以将副本执行到--Import到上面编写的S3的代码中。