通過騰訊雲 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 "[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
  

One More Thing

快速體驗騰訊雲 Serverless Demo 並領取新手代金券 👉 serverless/start

歡迎訪問:Serverless 中文網

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章