V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
scf10cent
V2EX  ›  推广

通过 Serverless Regsitry 快速开发与部署一个 WordCount 实例

  •  
  •   scf10cent · 2020-08-06 15:40:38 +08:00 · 1114 次点击
    这是一个创建于 1351 天前的主题,其中的信息可能已经有所发展或是发生改变。

    在学习 MapReduce 的过程中,不少人接触的第一个项目就是单词计数。单词计数通过两个函数 Map 和 Reduce,可以快速地统计出文本文件中每个单词出现的个数,它虽然简单,但也是最能体现 MapReduce 思想的程序之一。而 Serverless 的出现,为 MapReduce 进行大数据处理又提供了一个新的部署方案,Serverless 与 MapReduce 究竟如何结合呢?

    本文将通过一个简单的教程,指导大家快速开发一个基于 MapReduce 的 WordCount 应用模版,并在 Serverless 应用中心 Registry 里实现复用。

    立即体验腾讯云 Serverless Demo,获取免费试用额度 👉 serverless/start

    前提条件

    已安装 Serverless Framework,并保证您的 Serverless Framework 不低于以下版本:

    $ serverless –v
    Framework Core: 1.74.1 (standalone)
    Plugin: 3.6.14
    SDK: 2.3.1
    Components: 2.31.6
    

    实现概要

    下面是该实例的实现流程:

    • 创建函数与 COS Bucket 。
    • 用户将对象上传到 COS 中的源存储桶(对象创建事件)。
    • COS Bucket 检测到对象创建事件。
    • COS 调用函数并将事件数据作为参数传递给函数,由此将 cos:ObjectCreated:* 事件发布给函数。
    • SCF 平台接收到调用请求,执行函数。
    • 函数通过收到的事件数据获得了 Bucket 名称和文件名称,从该源 Bucket 中获取该文件,根据代码中实现的 wordcount 进行字数统计,然后将其保存到目标 Bucket 上。

    部署成功后,本模版将会为您创建以下资源:

    • 两个 SCF 函数:Mapper 和 Reducer 。
    • 三个 COS Bucket:srcmr 、middlestagebucket 和 destmr 。
    • Mapper 函数将会绑定 srcmr 触发,Reducer 函数将会绑定 middlestagebucket 触发,destmr 将会用来接收最终的统计结果。

    开发步骤

    1. 通过 COS 组件完成创建上传文件的 COS 存储桶的配置文件编写,yml 文件配置如下
    # serverless.yml
    org: serverless
    app: MapReduce_Demo
    stage: dev
    component: cos
    name: destmr
    
    inputs:
      bucket: destmr
      region: ap-guangzhou
    

    同理,完成其它两个存储桶配置。

    1. 完成函数代码编写,本模版中需要创建两个函数:Map 函数与 Reduce 函数,并为其分别配置 yml 文件

    Map 函数 yml 文件示例如下:

    component: scf # (必选) 组件名称,在该实例中为 scf
    name: map_function # 必选) 组件实例名称.
    org: serverless # (可选) 用于记录组织信息,
    app: MapReduce_Demo # (可选) 用于您的 AP 名称
    stage: dev # (可选) 用于区分环境信息,默认值是 dev
    
    inputs:
      name: map_function
      src: ./
      handler: map_function.main_handler 
      runtime: Python2.7 
      region: ap-guangzhou 
      description: This is one of the MapReduce function which is map_function
      memorySize: 128 
      timeout: 10
      environment:
        variables:
            Bucket: ${output:${stage}:${app}:middlestagebucket.bucket}
            TENCENT_SECRET_ID: ${env:TENCENT_SECRET_ID}
            TENCENT_SECRET_KEY: ${env:TENCENT_SECRET_KEY}
      
      events: # 触发器
        - cos: # cos 触发器
            name: ${output:${stage}:${app}:srcmr.cosOrigin}
            parameters:
              bucket: ${output:${stage}:${app}:srcmr.cosOrigin}
              events: 'cos:ObjectCreated:*'
              enable: true
    
    1. 完成配置后,整个应用模版结构如下:
    Map_Reduce_Demo
    |--bucket_destmr
      |--serverless.yml
    |--bucket_middlestage
      |--serverless.yml
    |--bucket_srcmr
      |--serverless.yml
    |--fun_map
      |--serverless.yml
      |--map_function.py
    |--fun_reduce
      |--serverless.yml
      |--reduce_function.py
    

    您也可根据您的实际业务逻辑进行更改。

    模版上传

    完成模版开发后,您可以将您的模版上传至 Registry,供大家公开复用。

    1. 在项目根目录下配置上传至 Registry 的项目模版信息:
    # serverless.yml
    name: mapreduce-demo # 项目模板的名字
    displayName: 基于 MapReduce 统计字数  #项目模板展示在控制台的名称(中文)
    author: Tencent Cloud, Inc. # 作者的名字
    org: Tencent Cloud, Inc. # 组织名称,可选
    type: template #项目类型,可填 template 或 component,此处为模版
    description: Deploy a MapReduce wordcount application. # 描述您的项目模板
    description-i18n:
      zh-cn: 本示例 Demo 演示怎么利用 COS 来做 MapReduce,一共需要 2 个函数:map_function 和 reduce_function,3 个 COS Bucket:srcmr 、middlestagebucket 和 destmr # 中文描述
    keywords: tencent, serverless, cos, scf, mapreduce # 关键字
    repo: # 源代码 Repo
    readme: # 详细的说明文件
    license: MIT # 版权声明
    src: # 描述项目中的哪些文件需要作为模板发布
      src: ./ # 指定具体的相对目录,此目录下的文件将作为模板发布
      exclude: #描述在指定的目录内哪些文件应该被排除
        - .env
        - serverless.yml
    
    1. 上传模版
    $ sls registry publish
    serverless ⚡ registry
    Publishing "[email protected]"...
    
    Serverless › Successfully published mapreduce-demo
    

    模版复用

    所有上传到 Registry 的模版都支持公开下载与复用的,操作如下:

    1. 下载模版
    $ sls init -t mapreduce-demo
    serverless ⚡ framework
    
    - Successfully created "mapreduce-demo" instance in the currennt working directory.
    - Don't forget to update serverless.yml and install dependencies if needed.
    - Whenever you're ready, run "serverless deploy" to deploy your new instance.
    
    mapreduce-demo › Created
    
    1. 在环境配置 .env 文件中填入您自己的密钥信息
    # .env
    TENCENT_SECRET_ID=123
    TENCENT_SECRET_KEY=123
    
    1. 部署项目
    $ cd mapreduce-demo
    $ sls deploy --all
    serverless ⚡ framework
    
    srcmr: 
      region:        ap-guangzhou
      bucket:        srcmr-0000000000
      cosOrigin:     srcmr-0000000000.cos.ap-guangzhou.myqcloud.com
      url:           http://srcmr-0000000000.cos.ap-guangzhou.myqcloud.com
      vendorMessage: null
    
    destmr: 
      region:        ap-guangzhou
      bucket:        destmr-0000000000
      cosOrigin:     destmr-0000000000.cos.ap-guangzhou.myqcloud.com
      url:           http://destmr-0000000000.cos.ap-guangzhou.myqcloud.com
      vendorMessage: null
    
    middlestagebucket: 
      region:        ap-guangzhou
      bucket:        middlestagebucket-0000000000
      cosOrigin:     middlestagebucket-0000000000.cos.ap-guangzhou.myqcloud.com
      url:           http://middlestagebucket-0000000000.cos.ap-guangzhou.myqcloud.com
      vendorMessage: null
    
    map_function: 
      functionName:  map_function
      description:   This is one of the MapReduce function which is map_function
      namespace:     default
      runtime:       Python2.7
      handler:       map_function.main_handler
      memorySize:    128
      lastVersion:   $LATEST
      traffic:       1
      triggers: 
        cos: 
          - srcmr-0000000000.cos.ap-guangzhou.myqcloud.com
      vendorMessage: null
    
    reduce-function: 
      functionName:  reduce_function
      description:   This is one of the MapReduce function which is reduce_function
      namespace:     default
      runtime:       Python2.7
      handler:       reduce_function.main_handler
      memorySize:    128
      lastVersion:   $LATEST
      traffic:       1
      triggers: 
        cos: 
          - middlestagebucket-0000000000.cos.ap-guangzhou.myqcloud.com
      vendorMessage: null
    
    8s › mapreduce-demo › Success
    

    项目测试

    1. 找到模版文档中的 test.txt 文件。
    2. 切换至对象存储控制台,选择创建好的 Bucket:srcmr,单击「上传文件」。
    3. 在弹出的「上传文件」窗口中,选择 test.txt ,单击「确定上传」。
    4. 切换至云函数控制台,查看执行结果。在运行日志中可以看到打印出来的日志信息。
    5. 切换至 对象存储控制台,选择创建好的 Bucket:destmr,查看生成的文件。

    项目移除

    可以通过以下命令移除应用

    $ sls remove --all
    
    serverless ⚡ framework
    
    8s › maprecude › Success
      
    

    立即体验腾讯云 Serverless Demo,获取免费试用额度 👉 serverless/start

    欢迎访问:Serverless 中文网

    目前尚无回复
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5656 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 34ms · UTC 02:43 · PVG 10:43 · LAX 19:43 · JFK 22:43
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.