久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

如何通過AWS EMR降低集群計算成本

155次閱讀
沒有評論

共計 5466 個字符,預(yù)計需要花費 14 分鐘才能閱讀完成。

如何通過 AWS EMR 降低集群計算成本,相信很多沒有經(jīng)驗的人對此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個問題。

AWS EMR 是一個計算集群。可以通過 ta 創(chuàng)建自定義配置的虛擬機,并自動安裝所需計算框架(Spark,Hadoop,Hive 等),以便用來進行大數(shù)據(jù)計算。

1. 項目背景

公司目前有一個項目,通過爬蟲收集數(shù)據(jù),離線計算得到用戶畫像,并將最終結(jié)果寫入 rds,通過 api 向外展示數(shù)據(jù)。

2. 架構(gòu)演進 2.1 技術(shù)棧

計算框架 Spark

調(diào)度框架 Airflow

數(shù)據(jù)存儲 Hadoop,Mysql

數(shù)倉工具 Hive,Presto

輔助工具 Zepplin

腳本語言 Java,Scala,Python

2.2 第一版

環(huán)境

我們在某云廠商開了 6 臺虛擬器(4 核 8G),spark on yarn 模式運行,其中 1 臺作為主節(jié)點,運行 hadoop 主節(jié)點和 airflow 調(diào)度程序,其余作為數(shù)據(jù)節(jié)點。

計算過程

通過 Spark Streaming 將數(shù)據(jù)落地到 Hadoop

Airflow 定時向主節(jié)點通過 Spark-submit 方式提交命令

Spark 計算后將最終結(jié)果寫入 Mysql

平時開發(fā)人員可以在 Zepplin 進行查詢

效果

計算流程可以正常進行

思考

通過一段時間的觀察分析,我們發(fā)現(xiàn)

大部分計算任務(wù)都能在較短時間內(nèi)完成

機器每天閑置時間很長

業(yè)務(wù)沒有很高的實時性要求

高配置虛擬器成本很高

結(jié)論

基于現(xiàn)狀,我們希望能有個即開即用的系統(tǒng),就像電腦一樣,要用就打開,用完就關(guān)閉。經(jīng)過調(diào)研,最終選擇了 AWS 的 EMR。

2.3 第二版

環(huán)境

在將系統(tǒng)遷移到 AWS EMR 之后,在 AWS 上開了一臺虛擬器(1 核 2G)運行 Airflow 和 Kinesis

這臺虛擬器需要一直運行,但 Airflow 本身不需要高配置

計算過程

通過 Kinesis 將數(shù)據(jù)落到 S3

Airflow 定時發(fā)起任務(wù)

發(fā)起創(chuàng)建 EMR 請求

可自定義機器配置,要安裝的計算框架,也可覆蓋框架配置。可通過 Python 腳本檢測集群是否創(chuàng)建成功

提交計算任務(wù)

關(guān)閉集群

效果

計算流程可以正常進行,但不需要長開機器了,只需要一臺低配來觸發(fā)定時任務(wù)即可

思考

通過一段時間的觀察

EMR 費用比起虛擬器,確實便宜很多

可以通過 console 臺查看集群狀態(tài),控制集群開關(guān)

不方便的地方,平時要查看 Hadoop 的數(shù)據(jù),需要自己寫腳本拉取,不能使用輔助工具了

Talk is cheap, show me the code

準備工作

注冊 AWS 賬號,登錄

開通 EMR,S3

開通 S3 的目的是為了持久化數(shù)據(jù),因為 EMR 集群本身不帶額外硬盤,需要外部介質(zhì)儲存

開通 AWS 內(nèi)網(wǎng)可訪問的 Mysql

如果不用 Hive,可跳過這一步,同理,需要外部介質(zhì)儲存 Hive 的數(shù)據(jù)結(jié)構(gòu)

準備創(chuàng)建 EMR 集群的腳本

這里有個坑,開始我們使用的 AWS SDK 來做這件事,但無法自定義計算框架配置(應(yīng)該是 BUG),最初我們通過修改 SDK 源碼解決了這個問題,但后來發(fā)現(xiàn)基本沒用到 SDK 其他功能時,我們將這部分代碼提成了單獨的文件,由于使用了 Airflow 進行調(diào)度,所以決定用了 Python

編寫 Spark 任務(wù),打包上傳至 S3

EMR LIB

# coding: UTF-8
import boto3, json, requests, requests
from datetime import datetime
def get_region():
 #  這個地址不用改
 r = requests.get(http://169.254.169.254/latest/dynamic/instance-identity/document)
 response_json = r.json()
 return response_json.get(region)
def client(region_name):
 global emr
 emr = boto3.client(emr , region_name=region_name)
#  創(chuàng)建 EMR
def create_cluster(name):
 param = {
 #  修改需要的框架
  Applications :[{
  Name : Hadoop 
 },{
  Name : Hive 
 },{
  Name : Spark 
 }],
 #  這里的名字會顯示到控制臺
  Name :name,
  ServiceRole : EMR_DefaultRole ,
  Tags :[],
  ReleaseLabel : emr-5.26.0 ,
  Instances :{
  TerminationProtected :False,
  EmrManagedMasterSecurityGroup : sg-0085fba9c3a6818f5 ,
  InstanceGroups :[{
  InstanceCount :1,
  Name : 主實例組  - 1 ,
  InstanceRole : MASTER ,
  EbsConfiguration :{
  EbsBlockDeviceConfigs :[{
  VolumeSpecification :{
  SizeInGB :32,
  VolumeType : gp2 
 },
  VolumesPerInstance :1
 }]
 },
 #  修改需要的硬件配置
  InstanceType : m4.large ,
  Market : ON_DEMAND ,
  Configurations :[{
 #  修改 Hive 的 meta 源
  Classification : hive-site ,
  Properties :{
  javax.jdo.option.ConnectionURL : jdbc:mysql://host:port/db?useUnicode=true characterEncoding=UTF-8 ,
  javax.jdo.option.ConnectionDriverName : org.mariadb.jdbc.Driver ,
  javax.jdo.option.ConnectionUserName : user ,
  javax.jdo.option.ConnectionPassword : pwd 
 }
 },{
  Classification : yarn-env ,
  Properties :{},
  Configurations :[{
  Classification : export ,
  Properties :{
  AWS_REGION : cn-northwest-1 ,
  S3_ENDPOINT : s3.cn-northwest-1.amazonaws.com.cn ,
  S3_USE_HTTPS : 0 ,
  S3_VERIFY_SSL : 0 
 }
 }]
 }]
 },{
  InstanceRole : CORE ,
  InstanceCount :1,
  Name : 核心實例組  - 2 ,
  Market : ON_DEMAND ,
 #  修改需要的硬件配置
  InstanceType : r5d.2xlarge ,
  Configurations :[{
  Classification : hive-site ,
  Properties :{
  javax.jdo.option.ConnectionURL : jdbc:mysql://host:port/db?useUnicode=true characterEncoding=UTF-8 ,
  javax.jdo.option.ConnectionDriverName : org.mariadb.jdbc.Driver ,
  javax.jdo.option.ConnectionUserName : user ,
  javax.jdo.option.ConnectionPassword : pwd 
 }
 },{
  Classification : yarn-env ,
  Properties :{},
  Configurations :[{
  Classification : export ,
  Properties :{
  AWS_REGION : cn-northwest-1 ,
  S3_ENDPOINT : s3.cn-northwest-1.amazonaws.com.cn ,
  S3_USE_HTTPS : 0 ,
  S3_VERIFY_SSL : 0 
 }
 }]
 }]
 },{
 #  修改需要的工作節(jié)點數(shù)
  InstanceCount :4,
  Name : 任務(wù)實例組  - 4 ,
  InstanceRole : TASK ,
  EbsConfiguration :{
  EbsBlockDeviceConfigs :[{
  VolumeSpecification :{
  SizeInGB :32,
  VolumeType : gp2 
 },
  VolumesPerInstance :4
 }]
 },
 #  修改需要的硬件配置
  InstanceType : r5d.2xlarge ,
  Market : ON_DEMAND ,
  Configurations :[{
  Classification : hive-site ,
  Properties :{
  javax.jdo.option.ConnectionURL : jdbc:mysql://host:port/db?useUnicode=true characterEncoding=UTF-8 ,
  javax.jdo.option.ConnectionDriverName : org.mariadb.jdbc.Driver ,
  javax.jdo.option.ConnectionUserName : user ,
  javax.jdo.option.ConnectionPassword : pwd 
 }
 },{
  Classification : yarn-env ,
  Properties :{},
  Configurations :[{
  Classification : export ,
  Properties :{
  AWS_REGION : cn-northwest-1 ,
  S3_ENDPOINT : s3.cn-northwest-1.amazonaws.com.cn ,
  S3_USE_HTTPS : 0 ,
  S3_VERIFY_SSL : 0 
 }
 }]
 }]
 }],
  KeepJobFlowAliveWhenNoSteps :True,
  Ec2SubnetId : subnet-027bff297ea95039b ,
  Ec2KeyName : hifive.airflow ,
  EmrManagedSlaveSecurityGroup : sg-05a0e076ee7babb9e 
 },
  JobFlowRole : EMR_EC2_DefaultRole ,
  Steps :[{
  HadoopJarStep :{  Args :[ state-pusher-script],
  Jar : command-runner.jar 
 },
  Name : Setup Hadoop Debugging 
 }],
  ScaleDownBehavior : TERMINATE_AT_TASK_COMPLETION ,
  VisibleToAllUsers :True,
  EbsRootVolumeSize :10,
  LogUri : s3n://aws-logs-550775287661-cn-northwest-1/elasticmapreduce/ ,
  AutoScalingRole : EMR_AutoScaling_DefaultRole 
 }
 cluster_response = emr.run_job_flow(**param)
 return cluster_response[JobFlowId]
#  獲取 EMR 訪問入口
def get_cluster_dns(cluster_id):
 response = emr.describe_cluster(ClusterId=cluster_id)
 return response[Cluster][MasterPublicDnsName]
#  等待集群創(chuàng)建完成
def wait_for_cluster_creation(cluster_id):
 emr.get_waiter(cluster_running).wait(ClusterId=cluster_id)
#  關(guān)閉 EMR
def terminate_cluster(cluster_id):
 emr.terminate_job_flows(JobFlowIds=[cluster_id])

調(diào)用測試

#  創(chuàng)建 6 臺機器的集群(1 master,1 core,4 worker)cluster_id = create_cluster(biz_daily_2020_10_09)
#  阻塞直到創(chuàng)建成功
wait_for_cluster_creation(cluster_id)
# dns 相當于虛擬機的 ssh 地址,每次都不同
# ssh 登錄這個地址可以提交 spark 命令了,這里使用 Airflow 的 SSHOperator 模擬登錄并提交命令
cluster_dns = get_cluster_dns(cluster_id)
#  關(guān)閉集群
terminate_cluster(cluster_id)

3. 其他坑

Airflow 1.9.0 的時間模板 {{ds}} 生成的是格林尼治時間,要改為我國時間,需手動加 8 小時,不知道新版本是否支持本地時間。

ssh 登錄 dns 用戶名 hadoop,這個用戶是 AWS 生成的,似乎無法修改。

看完上述內(nèi)容,你們掌握如何通過 AWS EMR 降低集群計算成本的方法了嗎?如果還想學到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注丸趣 TV 行業(yè)資訊頻道,感謝各位的閱讀!

正文完
 
丸趣
版權(quán)聲明:本站原創(chuàng)文章,由 丸趣 2023-08-04發(fā)表,共計5466字。
轉(zhuǎn)載說明:除特殊說明外本站除技術(shù)相關(guān)以外文章皆由網(wǎng)絡(luò)搜集發(fā)布,轉(zhuǎn)載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 南京市| 乌兰浩特市| 陆丰市| 长葛市| 富阳市| 临沭县| 安徽省| 长春市| 阜南县| 甘德县| 天峨县| 江源县| 惠水县| 隆化县| 灵川县| 甘德县| 阿鲁科尔沁旗| 江山市| 凤庆县| 武清区| 光山县| 新源县| 鸡西市| 新沂市| 赣榆县| 凤城市| 瑞金市| 永嘉县| 乾安县| 花莲市| 西城区| 黄大仙区| 徐水县| 汾阳市| 民和| 龙川县| 健康| 上思县| 张家口市| 北辰区| 临朐县|