乐趣区

关于腾讯云:通过腾讯云-Serverless-Regsitry-快速开发与部署一个-WordCount-实例

在学习 MapReduce 的过程中,不少人接触的第一个我的项目就是单词计数。单词计数通过两个函数 Map 和 Reduce,能够疾速地统计出文本文件中每个单词呈现的个数,它尽管简略,但也是最能体现 MapReduce 思维的程序之一。而 Serverless 的呈现,为 MapReduce 进行大数据处理又提供了一个新的部署计划,Serverless 与 MapReduce 到底如何联合呢?

本文将通过一个简略的教程,领导大家疾速开发一个基于 MapReduce 的 WordCount 利用模版,并在 Serverless 利用核心 Registry 里实现复用。

前提条件

已装置 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 "mapreduce-demo@0.0.0"...

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
  

One More Thing

疾速体验腾讯云 Serverless Demo 并支付老手代金券 ???? serverless/start

欢送拜访:Serverless 中文网!

退出移动版