用于创建 EMR 集群的 Lambda 不会触发集群创建

Posted

技术标签:

【中文标题】用于创建 EMR 集群的 Lambda 不会触发集群创建【英文标题】:Lambda to create EMR Cluster don't fire the cluster creation 【发布时间】:2015-03-21 19:22:48 【问题描述】:

我正在尝试运行创建集群的 λ 代码,但没有任何反应,可能是我误解了 Node 上的用法(因为我不太熟悉它。)

函数很简单:

// configure AWS Dependecies
var AWS = require('aws-sdk');

exports.handler = function(event, context) 
    // EMR Client
    var emr = new AWS.EMR(apiVersion: '2009-03-31', region: 'us-east-1');

    var params = ... dozens of params describing jobs ...;
    var AWSRequest = emr.runJobFlow(params);
    AWSRequest
        .on('success', function(response) console.log("success => " + response))
        .on('error', function(response) console.log("error => " + response))
        .on('complete', function(response) console.log("complete => "  + response))
        .send( function(err, data)
            if (err) console.log(err, err.stack); // an error occurred
            else     console.log(data);           // successful response
        );

    context.done(null, 'λ Completed');
;

我正在使用grunt-aws-lambda grunt 任务和在控制台中对其进行测试,但除了以下内容之外什么都没有显示:

aws-emr-lambda$ grunt lambda_invoke
Running "lambda_invoke:default" (lambda_invoke) task

Message
-------
λ Completed

Done, without errors.

从 AWS 控制台执行它会产生相同的输出,并且不会创建 EMR 集群。

对此有什么想法吗?

【问题讨论】:

【参考方案1】:

AWSRequest 异步发送请求,但您在主处理程序中调用 context.done。这意味着充其量这将发送请求但不等待响应。 context.done 需要在 send 回调中,否则 AWS 可能会在收到响应之前终止函数,或者甚至在响应发送之前终止函数,具体取决于请求在 AWS 开发工具包中的执行方式。

exports.handler = function(event, context) 
    // EMR Client
    var emr = new AWS.EMR(apiVersion:'2009-03-31', region:'us-east-1');

    var params = ... dozens of params describing jobs ...;
    var AWSRequest = emr.runJobFlow(params);
    AWSRequest
        .on('success', function(response) console.log("success => " + response))
        .on('error', function(response) console.log("error => " + response))
        .on('complete', function(response) console.log("complete => "  + response))
        .send( function(err, data)
            if (err) console.log(err, err.stack); // an error occurred
            else     console.log(data);           // successful response
            context.done(null,'λ Completed');
        );
;

【讨论】:

因为只是集群 EMR 创建调用,所以我对返回不是很感兴趣。我也试试看。 太棒了!通过该编辑,我现在可以看到请求的验证错误,非常感谢! 是否可以应用相同或相似的逻辑,而是向现有集群添加一个步骤?我们有一个场景,其中一个步骤可能会在发送 SNS 时静默失败。我想取消步骤(最近的),然后有效地克隆它

以上是关于用于创建 EMR 集群的 Lambda 不会触发集群创建的主要内容,如果未能解决你的问题,请参考以下文章

EMR 集群创建在步骤中失败

使用 lambda 函数删除关联的 cloudformation 堆栈时 EMR 集群未终止

我们可以使用 lambda 函数克隆一个终止的 emr 集群吗?在新集群中会有任何差异吗?

如何从 Lambda 函数在亚马逊 EMR 上执行 spark 提交?

如何使用 AWS Lambda 在 AWS EMR 上运行 PySpark

在 AWS EMR 上使用 pyspark