AWS Redshift数据处理

AWS Redshift数据处理

问题描述:

我正在与一家当前将其所有应用程序数据存储在AWS Redshift群集中的小公司合作。我一直负责对Redshift群集中的数据进行数据处理和机器学习。AWS Redshift数据处理

我需要做的第一个任务需要基于一些相当简单的SQL逻辑,将该集群中现有数据基本转换为一些新表。在MSSQL环境中,我只需将所有逻辑放入参数化存储过程中,并通过SQL Server代理作业进行安排。然而,在Redshift中sprocs似乎并不是什么东西。我将如何着手创建SQL作业并将其安排在AWS环境中每晚(例如)运行?

我的另一个任务涉及开发一个机器学习模型(Python)并在该Redshift数据库中对记录进行评分。如果计划从该Redshift群集中提取数据并对其进行评分,然后将其插入到同一群集上的新表中,那么托管我的python逻辑并执行数据处理的最佳方式是什么?看起来好像我可以创建一个EC2实例,在那里托管我的Python脚本,并在那里进行处理,并安排脚本通过cron运行?

我看到大量看起来可能相关的AWS(和非AWS)产品(AWS胶水/数据管道/ EMR),但有很多我都有点不知所措。预先感谢您的帮助!

+0

请显示您的代码。 –

+0

这是一个非常广泛的问题,并且有许多方法可以实现您正在谈论的内容。您通常会询问ETL(提取,转换,加载),因此我建议您搜索相关书籍和文档。 –

+0

另外,由于您是SO的新手,因此如果您始终关注问题,则可能不知道它更有可能获得答案。我更多地看到,一个集中的问题会有一个普遍的答案,而不是一个普遍的问题得到一个集中的答案。 –

ETL

亚马逊红移不支持存储过程。另外,我应该指出,存储过程通常是坏事,因为您将逻辑放入存储层,这使得将来很难迁移到其他解决方案。 (我知道很多Oracle客户已经锁定了自己永远无法改变技术!)

您应该在Redshift外部运行ETL逻辑,只需使用Redshift作为数据库。这可能是因为运行使用psql调用红移,如脚本一样简单:(使用psql的V8发动机,在其红移为基础)

`psql <authentication stuff> -c 'insert into z select a, b, from x'` 

或者,你可以使用更复杂的ETL工具(如AWS Glue(目前不在每个区域中))或第三方工具(如Bryte)。

机器学习

是的,你可以在EC2实例中运行的代码。如果很小,则可以使用AWS Lambda(最长5分钟运行时间)。许多ML用户喜欢在Amazon EMR上使用Spark。这取决于您需要的技术堆栈。

Amazon CloudWatch Events可以schedule Lambda函数,然后可以启动EC2实例,该实例可以进行处理,然后自行终止。

确实有很多选择!

2个选项对红移

运行ETL
  1. 创建一些“创建表作为”类型的SQL,这将需要你的源 表作为输入,并生成目标(转换表)
  2. 执行使用ETL工具在数据库之外进行转换。对于 示例EMR或胶水。

通常,在诸如Redshift等MPP环境中,最佳做法是将ETL推送到强大的数据库(即选项1)。

只考虑采用Redshift以外的ETL(选项2),其中SQL不是转换的理想工​​具,或者转换可能需要大量计算资源。

没有内置调度或编排工具。如果您需要比cron作业更全面的功能,Apache Airflow是一个不错的选择。

现有数据的基本转换

看来你是一个Python开发人员(如你说你正在开发基于Python ML模型),你可以按照以下的步骤做了改造:

  1. 您可以使用boto3(https://aws.amazon.com/sdk-for-python/)为了 从你的任何工作站红移交谈LAN(确保 你的IP有适当的特权)
  2. 你可以写你的O使用Python来模拟存储过程。在这些函数内部,您可以放入/缩小逻辑的转换逻辑。
  3. 或者,您可以在Redshift中创建使用python的函数,并且它将像存储过程一样工作。查看更多在这里 (https://aws.amazon.com/blogs/big-data/introduction-to-python-udfs-in-amazon-redshift/
  4. 最后,你可以使用windows调度/玉米的工作与像SQL Server代理作业参数来安排你的Python脚本确实

最好的方式来承载我的Python逻辑

在我看来,你正在阅读一些数据从红移然后创建测试和训练集,最后得到一些预测结果(记录)。如果这样:

  1. 在任何服务器(LAN)中托管脚本并使用boto3连接到Redshift。如果你需要通过互联网传输大量的行,那么同一地区的EC2将是一个选项。以临时方式启用EC2,完成您的工作并将其禁用。这将是成本效益。你可以使用AWS框架来做到这一点。我使用.Net框架完成了这项工作。我假设boto3确实有这种支持。
  2. 如果结果集相对较小,可以直接将它们保存到目标红移表中
  3. 如果结果集较大,则将它们保存为CSV(有多个Python库),并使用复制命令将这些行上载到临时表中如果你需要任何中间计算。如果不是,则直接将它们上传到目标表中。

希望这会有所帮助。