jjzjj

java - AWS Lambda/Aws Batch 工作流程

coder 2024-03-29 原文

我编写了一个 lambda,它被 s3 存储桶触发以解压缩 zip 文件并处理其中的文本文档。由于 lambda 的内存限制,我需要将我的进程转移到 AWS 批处理之类的东西上。如果我错了请纠正我,但我的工作流程应该是这样的。

work flow

我相信我需要编写一个 lambda 来将 s3 存储桶的位置放在亚马逊 SQS 上,如果 AWS 批处理可以读取该位置并进行所有解压缩/数据处理,它们的内存更大。

这是我当前的 lambda,它接收由 s3 存储桶触发的事件,检查它是否是一个 zip 文件,然后将该 s3 key 的名称推送到 SQS。 我应该告诉 AWS batch 在我的 lambda 中开始读取队列吗? 总的来说,我对 AWS 完全陌生,不确定从这里开始。

public class dockerEventHandler implements RequestHandler<S3Event, String> {

private static BigData app = new BigData();
private static DomainOfConstants CONST = new DomainOfConstants();
private static Logger log = Logger.getLogger(S3EventProcessorUnzip.class);

private static AmazonSQS SQS;
private static CreateQueueRequest createQueueRequest;
private static Matcher matcher;
private static String srcBucket, srcKey, extension, myQueueUrl;

@Override
public String handleRequest(S3Event s3Event, Context context) 
{
    try {
        for (S3EventNotificationRecord record : s3Event.getRecords())
        {
            srcBucket = record.getS3().getBucket().getName();
            srcKey = record.getS3().getObject().getKey().replace('+', ' ');
            srcKey = URLDecoder.decode(srcKey, "UTF-8");
            matcher = Pattern.compile(".*\\.([^\\.]*)").matcher(srcKey);

            if (!matcher.matches()) 
            {
                log.info(CONST.getNoConnectionMessage() + srcKey);
                return "";
            }
            extension = matcher.group(1).toLowerCase();

            if (!"zip".equals(extension)) 
            {
                log.info("Skipping non-zip file " + srcKey + " with extension " + extension);
                return "";
            }
            log.info("Sending object location to key" + srcBucket + "//" + srcKey);

            //pass in only the reference of where the object is located
            createQue(CONST.getQueueName(), srcKey);
        }
    }
    catch (IOException e)
    {
        log.error(e);           
    }
    return "Ok";
} 

/*
 * 
 * Setup connection to amazon SQS
 * TODO - Find updated api for sqs connection to eliminate depreciation
 * 
 * */
@SuppressWarnings("deprecation")
public static void sQSConnection() {
    app.setAwsCredentials(CONST.getAccessKey(), CONST.getSecretKey());       
    try{
        SQS = new AmazonSQSClient(app.getAwsCredentials()); 
        Region usEast1 = Region.getRegion(Regions.US_EAST_1);
        SQS.setRegion(usEast1);
    } 
    catch(Exception e){
        log.error(e);       
    }
}

//Create new Queue
public static void createQue(String queName, String message){
    createQueueRequest = new CreateQueueRequest(queName);
    myQueueUrl = SQS.createQueue(createQueueRequest).getQueueUrl();
    sendMessage(myQueueUrl,message);
}

//Send reference to the s3 objects location to the queue
public static void sendMessage(String SIMPLE_QUE_URL, String S3KeyName){
    SQS.sendMessage(new SendMessageRequest(SIMPLE_QUE_URL, S3KeyName));
}

//Fire AWS batch to pull from que
private static void initializeBatch(){
    //TODO
}

我安装了 docker 并了解 docker 图像。我相信我的 docker 镜像应该包含读取队列、解压缩、处理文件并将文件打包到 RDS 的所有代码,所有这些都在一个 docker 镜像/容器中。

我正在寻找做过类似事情的人,他们可以分享帮助。类似的东西:

先生。 S3:嘿 lambda 我有一个文件

先生。 Lambda:好的,S3 我看到你了,嘿 aws batch 你能解压并对此做些什么吗

先生。批处理:Gotchya mr lambda,我会处理好它,然后将其放入 RDS 或某些数据库中。

我还没有编写类/docker 图像,但我已经完成了所有代码来处理/解压缩并启动 rds 完成。由于某些文件为 1GB 或更大,Lambda 仅受内存限制。

最佳答案

好的,所以在查看 Batch 上的 AWS 文档后,您不需要 SQS 队列。 Batch 有一个概念叫做 Job Queue,它类似于 SQS FIFO 队列,但不同的是这些作业队列有优先级,并且其中的作业可以依赖于其他作业。基本流程是:

  1. 首先,奇怪的部分是设置 IAM 角色,以便容器代理可以与容器服务对话,并且 AWS 批处理能够在需要时启动各种实例(如果您执行 spot 实例,还需要一个单独的角色) .有关所需权限的详细信息,请参阅此文档 (PDF),网址为 around page 54 .
  2. 完成后,您就可以设置计算环境了。这些是存放容器的 EC2 按需实例或现货实例。作业在容器级别运行。这个想法是您的计算环境是您的作业容器可以利用的最大资源分配。一旦达到该限制,您的作业就必须等待资源被释放。
  3. 现在您要创建一个作业队列。这会将作业与您创建的计算环境相关联。
  4. 现在您创建一个工作定义。好吧,从技术上讲,您不必并且可以通过 lambda 来完成,但这会让事情变得更容易一些。您的作业定义将指示您的作业需要哪些容器资源(您当然也可以在 lambda 中覆盖它)
  5. 现在这一切都已完成,您需要创建一个 lambda 函数。这将由您的 S3 存储桶事件触发。该函数需要必要的 IAM 权限才能针对批处理服务运行提交作业(以及任何其他权限)。基本上所有 lambda 需要做的就是调用提交作业到 AWS 批处理。您需要的基本参数是作业队列和作业定义。您还将为所需的 zip 设置 S3 key 作为作业的参数。
  6. 现在,当触发适当的 S3 事件时,它会调用 lambda,然后将作业提交到 AWS 批处理作业队列。然后假设设置一切正常,它会很乐意调出资源来处理你的工作。请注意,根据 EC2 实例大小和分配的容器资源,这可能需要一点时间(比准备 Lambda 函数长得多)。

关于java - AWS Lambda/Aws Batch 工作流程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44703171/

有关java - AWS Lambda/Aws Batch 工作流程的更多相关文章

  1. ruby-on-rails - 由于 "wkhtmltopdf",PDFKIT 显然无法正常工作 - 2

    我在从html页面生成PDF时遇到问题。我正在使用PDFkit。在安装它的过程中,我注意到我需要wkhtmltopdf。所以我也安装了它。我做了PDFkit的文档所说的一切......现在我在尝试加载PDF时遇到了这个错误。这里是错误:commandfailed:"/usr/local/bin/wkhtmltopdf""--margin-right""0.75in""--page-size""Letter""--margin-top""0.75in""--margin-bottom""0.75in""--encoding""UTF-8""--margin-left""0.75in""-

  2. ruby-on-rails - 'compass watch' 是如何工作的/它是如何与 rails 一起使用的 - 2

    我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t

  3. ruby - 无法让 RSpec 工作—— 'require' : cannot load such file - 2

    我花了三天的时间用头撞墙,试图弄清楚为什么简单的“rake”不能通过我的规范文件。如果您遇到这种情况:任何文件夹路径中都不要有空格!。严重地。事实上,从现在开始,您命名的任何内容都没有空格。这是我的控制台输出:(在/Users/*****/Desktop/LearningRuby/learn_ruby)$rake/Users/*******/Desktop/LearningRuby/learn_ruby/00_hello/hello_spec.rb:116:in`require':cannotloadsuchfile--hello(LoadError) 最佳

  4. java - 等价于 Java 中的 Ruby Hash - 2

    我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/

  5. ruby-on-rails - rspec should have_select ('cars' , :options => ['volvo' , 'saab' ] 不工作 - 2

    关闭。这个问题需要detailsorclarity.它目前不接受答案。想改进这个问题吗?通过editingthispost添加细节并澄清问题.关闭8年前。Improvethisquestion在首页我有:汽车:VolvoSaabMercedesAudistatic_pages_spec.rb中的测试代码:it"shouldhavetherightselect"dovisithome_pathit{shouldhave_select('cars',:options=>['volvo','saab','mercedes','audi'])}end响应是rspec./spec/request

  6. ruby-on-rails - s3_direct_upload 在生产服务器中不工作 - 2

    在Rails4.0.2中,我使用s3_direct_upload和aws-sdkgems直接为s3存储桶上传文件。在开发环境中它工作正常,但在生产环境中它会抛出如下错误,ActionView::Template::Error(noimplicitconversionofnilintoString)在View中,create_cv_url,:id=>"s3_uploader",:key=>"cv_uploads/{unique_id}/${filename}",:key_starts_with=>"cv_uploads/",:callback_param=>"cv[direct_uplo

  7. java - 从 JRuby 调用 Java 类的问题 - 2

    我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www

  8. ruby - JetBrains RubyMine 3.2.4 调试器不工作 - 2

    使用Ruby1.9.2运行IDE提示说需要gemruby​​-debug-base19x并提供安装它。但是,在尝试安装它时会显示消息Failedtoinstallgems.Followinggemswerenotinstalled:C:/ProgramFiles(x86)/JetBrains/RubyMine3.2.4/rb/gems/ruby-debug-base19x-0.11.30.pre2.gem:Errorinstallingruby-debug-base19x-0.11.30.pre2.gem:The'linecache19'nativegemrequiresinstall

  9. java - 我的模型类或其他类中应该有逻辑吗 - 2

    我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我

  10. java - 什么相当于 ruby​​ 的 rack 或 python 的 Java wsgi? - 2

    什么是ruby​​的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht

随机推荐