在學習 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 將會用來接收最終的統計結果,
開發步驟
- 通過 COS 組件完成創建上傳檔案的 COS 存盤桶的組態檔撰寫,yml 檔案配置如下
# serverless.yml
org: serverless
app: MapReduce_Demo
stage: dev
component: cos
name: destmr
inputs:
bucket: destmr
region: ap-guangzhou
同理,完成其它兩個存盤桶配置,
- 完成函式代碼撰寫,本模版中需要創建兩個函式: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
- 完成配置后,整個應用模版結構如下:
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,供大家公開復用,
- 在專案根目錄下配置上傳至 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
- 上傳模版
$ sls registry publish
serverless ? registry
Publishing "[email protected]"...
Serverless ? Successfully published mapreduce-demo
模版復用
所有上傳到 Registry的模版都支持公開下載與復用的,操作如下:
- 下載模版
$ 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
- 在環境配置 .env 檔案中填入您自己的密鑰資訊
# .env
TENCENT_SECRET_ID=123
TENCENT_SECRET_KEY=123
- 部署專案
$ 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
專案測驗
- 找到模版檔案中的 test.txt 檔案,
- 切換至物件存盤控制臺,選擇創建好的 Bucket:srcmr,單擊「上傳檔案」,
- 在彈出的「上傳檔案」視窗中,選擇 test.txt,單擊「確定上傳」,
- 切換至云函式控制臺,查看執行結果,在運行日志中可以看到列印出來的日志資訊,
- 切換至 物件存盤控制臺,選擇創建好的 Bucket:destmr,查看生成的檔案,
專案移除
可以通過以下命令移除應用
$ sls remove --all
serverless ? framework
8s ? maprecude ? Success
One More Thing
快速體驗騰訊云 Serverless Demo 并領取新手代金券 ?? serverless/start
歡迎訪問:Serverless 中文網!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/73625.html
標籤:其他
上一篇:菜鳥求助簡單問題!
