Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/14.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 将AWS Lambda配置为Dynamodb流的并行计算_Amazon Web Services_Aws Lambda_Amazon Dynamodb - Fatal编程技术网

Amazon web services 将AWS Lambda配置为Dynamodb流的并行计算

Amazon web services 将AWS Lambda配置为Dynamodb流的并行计算,amazon-web-services,aws-lambda,amazon-dynamodb,Amazon Web Services,Aws Lambda,Amazon Dynamodb,我在EC2和python3.6awslambda体系结构上有一个flask。当响应到达flask时,新项目被添加到dynamoDB,这将触发Lambda,该过程将使用新添加的项目启动一些过程。出于某种奇怪的原因,它不并行处理触发器,为每个触发器启动新的lambda函数,而是逐个处理它们 我尝试将并发限制设置为最大值,但没有成功 我需要尽快得到结果,不要自己管理任何缩放过程。所以触发器需要并行处理,而不是像现在这样逐个处理 如果使用Python开发Lambda函数,默认情况下不会出现并行性。Lam

我在
EC2
python3.6
awslambda
体系结构上有一个
flask
。当响应到达
flask
时,新项目被添加到
dynamoDB
,这将触发
Lambda
,该过程将使用新添加的项目启动一些过程。出于某种奇怪的原因,它不并行处理触发器,为每个触发器启动新的lambda函数,而是逐个处理它们

我尝试将并发限制设置为最大值,但没有成功

我需要尽快得到结果,不要自己管理任何缩放过程。所以触发器需要并行处理,而不是像现在这样逐个处理

  • 如果使用Python开发Lambda函数,默认情况下不会出现并行性。Lambda支持Python2.7和Python3.6,它们都有多处理和线程模块
  • 另一方面,您可以使用multiprocessing.Pipe而不是multiprocessing.Queue来完成所需的任务,而不会在Lambda函数的执行过程中出现任何错误
  • 有关并行执行源代码的更多详细信息,请参阅以下链接:

    此外,您还可以参考以下代码:

    import time
    import multiprocessing
    
    region_maps = {
            "eu-west-1": {
                "dynamodb":"dynamodb.eu-west-1.amazonaws.com"
            },
            "us-east-1": {
                "dynamodb":"dynamodb.us-east-1.amazonaws.com"
            },
            "us-east-2": {
                "dynamodb": "dynamodb.us-east-2.amazonaws.com"
            }
        }
    
    def multiprocessing_func(region):
        time.sleep(1)
        endpoint = region_maps[region]['dynamodb']
        print('endpoint for {} is {}'.format(region, endpoint))
    
    def lambda_handler(event, context):
        starttime = time.time()
        processes = []
        regions = ['us-east-1', 'us-east-2', 'eu-west-1']
        for region in regions:
            p = multiprocessing.Process(target=multiprocessing_func, args=(region,))
            processes.append(p)
            p.start()
    
        for process in processes:
            process.join()
    
        output = 'That took {} seconds'.format(time.time() - starttime)
        print(output)
        return output
    
    希望这有帮助

  • 如果使用Python开发Lambda函数,默认情况下不会出现并行性。Lambda支持Python2.7和Python3.6,它们都有多处理和线程模块
  • 另一方面,您可以使用multiprocessing.Pipe而不是multiprocessing.Queue来完成所需的任务,而不会在Lambda函数的执行过程中出现任何错误
  • 有关并行执行源代码的更多详细信息,请参阅以下链接:

    此外,您还可以参考以下代码:

    import time
    import multiprocessing
    
    region_maps = {
            "eu-west-1": {
                "dynamodb":"dynamodb.eu-west-1.amazonaws.com"
            },
            "us-east-1": {
                "dynamodb":"dynamodb.us-east-1.amazonaws.com"
            },
            "us-east-2": {
                "dynamodb": "dynamodb.us-east-2.amazonaws.com"
            }
        }
    
    def multiprocessing_func(region):
        time.sleep(1)
        endpoint = region_maps[region]['dynamodb']
        print('endpoint for {} is {}'.format(region, endpoint))
    
    def lambda_handler(event, context):
        starttime = time.time()
        processes = []
        regions = ['us-east-1', 'us-east-2', 'eu-west-1']
        for region in regions:
            p = multiprocessing.Process(target=multiprocessing_func, args=(region,))
            processes.append(p)
            p.start()
    
        for process in processes:
            process.join()
    
        output = 'That took {} seconds'.format(time.time() - starttime)
        print(output)
        return output
    

    希望这有帮助。

    在dynamodb中,并行lambda的数量由您正在写入的碎片数量控制

    Amazon DynamoDB、AWS Lambda轮询您的流并调用Lambda函数。 当Lambda函数被限制时,Lambda会尝试处理 阻止批记录,直到数据过期。 这段时间内,亚马逊动情最长可达七天。 被阻止的请求被视为按碎片阻塞,并且 Lambda直到 限制的记录批过期或成功。 如果流中有多个碎片, Lambda继续在非节流碎片上调用,直到一个碎片通过

    这样做是为了控制
    事件按照在dynamodb上执行的顺序进行处理。但碎片的数量不是由您直接控制的

    现在你能做的最好的事情就是

  • 在lambda函数中。通过这样做,您将在同一lambda中接收多个事件。您可以在lambda函数中使用并行性来同时处理所有这些函数。但这将有明显的缺点,比如如果您不能在lambda超时之前处理所有这些问题。您必须确保代码是线程安全的

  • 在dynamodb中,并行lambda的数量由您正在写入的碎片数量控制

    Amazon DynamoDB、AWS Lambda轮询您的流并调用Lambda函数。 当Lambda函数被限制时,Lambda会尝试处理 阻止批记录,直到数据过期。 这段时间内,亚马逊动情最长可达七天。 被阻止的请求被视为按碎片阻塞,并且 Lambda直到 限制的记录批过期或成功。 如果流中有多个碎片, Lambda继续在非节流碎片上调用,直到一个碎片通过

    这样做是为了控制
    事件按照在dynamodb上执行的顺序进行处理。但碎片的数量不是由您直接控制的

    现在你能做的最好的事情就是

  • 在lambda函数中。通过这样做,您将在同一lambda中接收多个事件。您可以在lambda函数中使用并行性来同时处理所有这些函数。但这将有明显的缺点,比如如果您不能在lambda超时之前处理所有这些问题。您必须确保代码是线程安全的

  • 在这种情况下,写入DynamoDB可能会阻塞并行性


    用于快速且可扩展的项目处理的替代体系结构:将项目作为文件添加到S3存储桶中。然后S3铲斗上的触发器将启动Lambda。新建文件-新建Lambda,这样,只有Lambda并发才能限制并行的Lambda数量。

    在这种情况下,写入DynamoDB可能会阻止并行


    用于快速且可扩展的项目处理的替代体系结构:将项目作为文件添加到S3存储桶中。然后S3铲斗上的触发器将启动Lambda。新建文件-新建Lambda,这样,只有Lambda并发才能限制并行的Lambda数量。

    您的数据在dynamodb中是如何分布的?看起来像是切分问题。您的数据在dynamodb中是如何分布的?看起来像是切分问题。谢谢你的回答!那么,解决方案是在一个lambda上启动多个进程?那么如何将所有新触发器实时添加到多处理中?@DenysMelnychenko是的,您可以在一个lambda上启动多个进程。为实时数据添加触发器的最佳方法是使用AWS Kinesis服务。当在kinesis流中发现新记录时,将调用lambda函数。感谢您的回答!那么,解决方案是在一个lambda上启动多个进程?那么如何将所有新触发器实时添加到多处理中?@DenysMelnychenko是的,您可以在一个lambda上启动多个进程。为实时数据添加触发器的最佳方法是使用AWS Kinesis服务。A.