Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Amazon web services 如何设计在Lambda函数上运行的可伸缩ETL_Amazon Web Services_Amazon S3_Aws Lambda_Amazon Redshift_Aws Step Functions - Fatal编程技术网

Amazon web services 如何设计在Lambda函数上运行的可伸缩ETL

Amazon web services 如何设计在Lambda函数上运行的可伸缩ETL,amazon-web-services,amazon-s3,aws-lambda,amazon-redshift,aws-step-functions,Amazon Web Services,Amazon S3,Aws Lambda,Amazon Redshift,Aws Step Functions,我正在构建一个ETL,将来自各种Postgres数据库的数据导入S3,并将其导入到Redshift中。我希望我的ETL具有以下约束和目标: 1.涉及的每个数据库每次都有一个针对它的查询。 2.最短完成时间。 3.开发人员可以轻松地向ETL添加新数据集。 4.可扩展到更多数据库和更多数据集 由于超时而失败的设计 我通过以下方式对Lambda函数进行了全面规划: lambda_1:由cron触发。触发几个可以并行运行的lambda_2。每个源数据库触发一个lambda_2。还触发一个lambda_4

我正在构建一个ETL,将来自各种Postgres数据库的数据导入S3,并将其导入到Redshift中。我希望我的ETL具有以下约束和目标: 1.涉及的每个数据库每次都有一个针对它的查询。 2.最短完成时间。 3.开发人员可以轻松地向ETL添加新数据集。 4.可扩展到更多数据库和更多数据集

由于超时而失败的设计 我通过以下方式对Lambda函数进行了全面规划:

lambda_1:由cron触发。触发几个可以并行运行的lambda_2。每个源数据库触发一个lambda_2。还触发一个lambda_4

lambda_2:按顺序将所有数据集从其数据库导入S3

lambda_3:由文件放入S3触发,将相应的数据集名称添加到SQS队列中

lambda_4:由lambda_1触发。具有数据集列表。每次从SQS队列中弹出一条消息,并将该数据集从S3导入到红移。一旦导入了列表中的所有数据集,就会触发lambda_5

lambda_5+:(续)

如果在一个源数据库中有许多数据集需要导入,我会遇到问题,因为在完成导入之前,相应的lambda_2可能会超时。 出于类似的原因,我也会遇到lambda_4的问题,因为它会顺序地将每个数据集从S3导入到红移中

使添加新数据集变得困难的设计 另一种方法是为每个数据集创建一个链接lambda(例如,可能使用步骤函数链接它们)。我仍然可以通过S3文件触发器将数据集放入SQS队列,将导入S3与导入红移分离

这个解决方案可以工作,但很难看(imo),并且很难添加新的数据集,因为必须为它创建几个新的lambda

另一个更好的设计? 这一切的替代方案是放弃使用Lambda,使用。。。AWS法尔盖特?还有别的吗?期待设计建议

lambda_2可能在完成导入之前超时

是的,Lambda在执行ETL时的15分钟超时是一个令人头痛的问题,这可能需要一些时间

如果您不介意使用Python,我建议您使用AWS Glue Python外壳作业和可能的AWS Glue工作流。使用粘合工作流,您可以由其他作业触发作业。您将获得良好的可视性和自动重试

如果这不适合您,则使用ECS和Fargate,并与step函数相协调

lambda_2可能在完成导入之前超时

是的,Lambda在执行ETL时的15分钟超时是一个令人头痛的问题,这可能需要一些时间

如果您不介意使用Python,我建议您使用AWS Glue Python外壳作业和可能的AWS Glue工作流。使用粘合工作流,您可以由其他作业触发作业。您将获得良好的可视性和自动重试


如果这不适合您,那么将ECS与Fargate一起使用,并与step函数相协调。

基于您的用例的最佳解决方案是使用Aws glue python shell作业,它们将充当您的扩展lambda

然后,您可以使用粘合工作流或步骤函数编排这些作业


这里的好处是,它们是无服务器的,由aws管理,而ecs您必须从一开始就进行管理,而且对于这项任务来说,这也是一种过分的做法。

基于您的用例的最佳解决方案是使用aws glue python shell作业,它们将充当您的扩展lambda

然后,您可以使用粘合工作流或步骤函数编排这些作业


这里的好处是,它们是无服务器的,由aws管理,而您必须首先管理ecs,这也是完成此任务的一种过度手段。

您应该使用aws EMR运行spark群集。您应该使用aws EMR运行spark群集。