欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

如何通過AWSEMR降低集群計(jì)算成本

如何通過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ì)算。

1. 項(xiàng)目背景

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

2. 架構(gòu)演進(jìn)

2.1 技術(shù)棧
  • 計(jì)算框架 Spark

  • 調(diào)度框架 Airflow

  • 數(shù)據(jù)存儲(chǔ) Hadoop,MySQL

  • 數(shù)倉(cāng)工具 Hive,Presto

  • 輔助工具 Zepplin

  • 腳本語言 Java,Scala,Python

2.2 第一版

環(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。

2.3 第二版

環(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ù),需要自己寫腳本拉取,不能使用輔助工具了

Talk is cheap, show me the code

準(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)

3. 其他坑

  • 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)

綿陽(yáng)服務(wù)器托管