如何通過AWS EMR降低集群計(jì)算成本,相信很多沒有經(jīng)驗(yàn)的人對(duì)此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個(gè)問題。
創(chuàng)新互聯(lián)建站是一家朝氣蓬勃的網(wǎng)站建設(shè)公司。公司專注于為企業(yè)提供信息化建設(shè)解決方案。從事網(wǎng)站開發(fā),網(wǎng)站制作,網(wǎng)站設(shè)計(jì),網(wǎng)站模板,微信公眾號(hào)開發(fā),軟件開發(fā),小程序制作,10余年建站對(duì)柴油發(fā)電機(jī)等多個(gè)行業(yè),擁有多年的網(wǎng)站設(shè)計(jì)經(jīng)驗(yàn)。
AWS EMR是一個(gè)計(jì)算集群。可以通過ta創(chuàng)建自定義配置的虛擬機(jī),并自動(dòng)安裝所需計(jì)算框架(Spark,Hadoop,Hive等),以便用來進(jìn)行大數(shù)據(jù)計(jì)算。
公司目前有一個(gè)項(xiàng)目,通過爬蟲收集數(shù)據(jù),離線計(jì)算得到用戶畫像,并將最終結(jié)果寫入rds,通過api向外展示數(shù)據(jù)。
計(jì)算框架 Spark
調(diào)度框架 Airflow
數(shù)據(jù)存儲(chǔ) Hadoop,MySQL
數(shù)倉(cāng)工具 Hive,Presto
輔助工具 Zepplin
腳本語言 Java,Scala,Python
環(huán)境
我們?cè)谀吃茝S商開了6臺(tái)虛擬器(4核8G),spark on yarn模式運(yùn)行,其中1臺(tái)作為主節(jié)點(diǎn),運(yùn)行hadoop主節(jié)點(diǎn)和airflow調(diào)度程序,其余作為數(shù)據(jù)節(jié)點(diǎn)。
計(jì)算過程
通過Spark Streaming將數(shù)據(jù)落地到Hadoop
Airflow定時(shí)向主節(jié)點(diǎn)通過Spark-submit方式提交命令
Spark計(jì)算后將最終結(jié)果寫入Mysql
平時(shí)開發(fā)人員可以在Zepplin進(jìn)行查詢
效果
計(jì)算流程可以正常進(jìn)行
思考
通過一段時(shí)間的觀察分析,我們發(fā)現(xiàn)
大部分計(jì)算任務(wù)都能在較短時(shí)間內(nèi)完成
機(jī)器每天閑置時(shí)間很長(zhǎng)
業(yè)務(wù)沒有很高的實(shí)時(shí)性要求
高配置虛擬器成本很高
結(jié)論
基于現(xiàn)狀,我們希望能有個(gè)即開即用的系統(tǒng),就像電腦一樣,要用就打開,用完就關(guān)閉。經(jīng)過調(diào)研,最終選擇了AWS的EMR。
環(huán)境
在將系統(tǒng)遷移到AWS EMR之后,在AWS上開了一臺(tái)虛擬器(1核2G)運(yùn)行Airflow和Kinesis
這臺(tái)虛擬器需要一直運(yùn)行,但Airflow本身不需要高配置
計(jì)算過程
通過Kinesis將數(shù)據(jù)落到S3
Airflow定時(shí)發(fā)起任務(wù)
發(fā)起創(chuàng)建EMR請(qǐng)求
可自定義機(jī)器配置,要安裝的計(jì)算框架,也可覆蓋框架配置。可通過Python腳本檢測(cè)集群是否創(chuàng)建成功
提交計(jì)算任務(wù)
關(guān)閉集群
效果
計(jì)算流程可以正常進(jìn)行,但不需要長(zhǎng)開機(jī)器了,只需要一臺(tái)低配來觸發(fā)定時(shí)任務(wù)即可
思考
通過一段時(shí)間的觀察
EMR費(fèi)用比起虛擬器,確實(shí)便宜很多
可以通過console臺(tái)查看集群狀態(tài),控制集群開關(guān)
不方便的地方,平時(shí)要查看Hadoop的數(shù)據(jù),需要自己寫腳本拉取,不能使用輔助工具了
準(zhǔn)備工作
注冊(cè)AWS賬號(hào),登錄
開通EMR,S3
開通S3的目的是為了持久化數(shù)據(jù),因?yàn)镋MR集群本身不帶額外硬盤,需要外部介質(zhì)儲(chǔ)存
開通AWS內(nèi)網(wǎng)可訪問的Mysql
如果不用Hive,可跳過這一步,同理,需要外部介質(zhì)儲(chǔ)存Hive的數(shù)據(jù)結(jié)構(gòu)
準(zhǔn)備創(chuàng)建EMR集群的腳本
這里有個(gè)坑,開始我們使用的AWS SDK來做這件事,但無法自定義計(jì)算框架配置(應(yīng)該是BUG),最初我們通過修改SDK源碼解決了這個(gè)問題,但后來發(fā)現(xiàn)基本沒用到SDK其他功能時(shí),我們將這部分代碼提成了單獨(dú)的文件,由于使用了Airflow進(jìn)行調(diào)度,所以決定用了Python
編寫Spark任務(wù),打包上傳至S3
EMR LIB
# coding: UTF-8 import boto3, json, requests, requests from datetime import datetime def get_region(): # 這個(gè)地址不用改 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" }], # 這里的名字會(huì)顯示到控制臺(tái) "Name":name, "ServiceRole":"EMR_DefaultRole", "Tags":[], "ReleaseLabel":"emr-5.26.0", "Instances":{ "TerminationProtected":False, "EmrManagedMasterSecurityGroup":"sg-0085fba9c3a6818f5", "InstanceGroups":[{ "InstanceCount":1, "Name":"主實(shí)例組 - 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":"核心實(shí)例組 - 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é)點(diǎn)數(shù) "InstanceCount":4, "Name":"任務(wù)實(shí)例組 - 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)用測(cè)試
# 創(chuàng)建6臺(tái)機(jī)器的集群(1 master,1 core,4 worker) cluster_id = create_cluster("biz_daily_2020_10_09") # 阻塞直到創(chuàng)建成功 wait_for_cluster_creation(cluster_id) # dns相當(dāng)于虛擬機(jī)的ssh地址,每次都不同 # ssh登錄這個(gè)地址可以提交spark命令了,這里使用Airflow的SSHOperator模擬登錄并提交命令 cluster_dns = get_cluster_dns(cluster_id) # 關(guān)閉集群 terminate_cluster(cluster_id)
Airflow 1.9.0的時(shí)間模板{{ ds }}生成的是格林尼治時(shí)間,要改為我國(guó)時(shí)間,需手動(dòng)加8小時(shí),不知道新版本是否支持本地時(shí)間。
ssh登錄dns用戶名hadoop,這個(gè)用戶是AWS生成的,似乎無法修改。
看完上述內(nèi)容,你們掌握如何通過AWS EMR降低集群計(jì)算成本的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!
新聞標(biāo)題:如何通過AWSEMR降低集群計(jì)算成本
分享路徑:http://chinadenli.net/article28/ihoocp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)頁(yè)設(shè)計(jì)公司、用戶體驗(yàn)、外貿(mào)建站、網(wǎng)站導(dǎo)航、做網(wǎng)站、品牌網(wǎng)站制作
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)
移動(dòng)網(wǎng)站建設(shè)知識(shí)