Conas do uathoibríoch-scálaálaí a dhéanamh le haghaidh braisle

Dia dhuit! Cuirimid oiliúint ar dhaoine chun oibriú le sonraí móra. Tá sé dodhéanta clár oideachais ar shonraí móra a shamhlú gan a bhraisle féin, ar a n-oibríonn na rannpháirtithe go léir le chéile. Ar an gcúis seo, bíonn sé i gcónaí ar ár gclár :) Táimid ag gabháil lena chumraíocht, a thiúnta agus a riarachán, agus seolann na guys go díreach poist MapReduce ann agus úsáideann siad Spark.

Sa phost seo inseoimid duit conas a réitigh muid an fhadhb a bhaineann le luchtú braisle míchothrom trínár n-uathscálaálaí féin a scríobh ag baint úsáide as an scamall Mail.ru Cloud Solutions.

fadhb

Ní úsáidtear ár mbraisle i mód tipiciúil. Tá an diúscairt an-míchothrom. Mar shampla, tá ranganna praiticiúla ann, nuair a théann gach 30 duine agus múinteoir chuig an gcnuasach agus tosaíonn siad á úsáid. Nó arís, tá laethanta roimh an spriocdháta nuair a mhéadaíonn an t-ualach go mór. Feidhmíonn an braisle i mód gannualach an chuid eile den am.

Réiteach #1 ná braisle a choinneáil a sheasfaidh le buaicualaí, ach a bheidh díomhaoin an chuid eile den am.

Is é réiteach #2 ná braisle beag a choinneáil, a gcuireann tú nóid leis de láimh roimh ranganna agus le linn buaicualaí.

Is é réiteach #3 ná braisle beag a choinneáil agus uathscálaálaí a scríobh a dhéanfaidh monatóireacht ar ualach reatha an bhraisle agus, ag baint úsáide as APIanna éagsúla, nóid a chur leis agus a bhaint as an mbraisle.

Sa phost seo beimid ag caint faoi réiteach #3. Braitheann an t-uathscalóir seo go mór ar fhachtóirí seachtracha seachas cinn inmheánacha, agus is minic nach soláthraíonn soláthraithe é. Bainimid úsáid as bonneagar scamall Mail.ru Cloud Solutions agus scríobhamar autoscaler ag baint úsáide as API MCS. Agus ós rud é go bhfuil muid ag múineadh conas oibriú le sonraí, shocraigh muid a thaispeáint conas is féidir leat autoscaler den chineál céanna a scríobh chun do chuspóirí féin agus é a úsáid le do scamall

Réamhriachtanais

Ar dtús, caithfidh tú braisle Hadoop a bheith agat. Mar shampla, úsáidimid an dáileadh HDP.

D'fhonn do nóid a chur leis agus a bhaint go tapa, caithfidh dáileadh áirithe róil a bheith agat i measc na nóid.

  1. Nód máistir. Bhuel, níl aon rud fíor-riachtanach le míniú anseo: príomhnód an bhraisle, ar a seolfar, mar shampla, an tiománaí Spark, má úsáideann tú an modh idirghníomhach.
  2. Nód dáta. Seo é an nód ar a stórálann tú sonraí ar HDFS agus ina ndéantar ríomhanna.
  3. Nód ríomhaireachta. Nód é seo nach stórálann tú rud ar bith ar HDFS, ach nuair a dhéantar ríomhanna.

Pointe tábhachtach. Tarlóidh uathscálú mar gheall ar nóid den tríú cineál. Má thosaíonn tú ag tógáil agus ag cur nóid den dara cineál, beidh an luas freagartha an-íseal - tógfaidh díchoimisiúnú agus athghealladh uaireanta ar do bhraisle. Ní hé seo, ar ndóigh, a bhfuil tú ag súil leis ó scálú uathoibríoch. Is é sin, ní dhéanaimid teagmháil le nóid an chéad agus an dara cineál. Is éard a bheidh iontu ná braisle inmharthana íosta a bheidh ann le linn ré an chláir.

Mar sin, tá ár autoscaler scríofa i Python 3, úsáideann an API Ambari chun seirbhísí braisle a bhainistiú, úsáidí API ó Mail.ru Cloud Solutions (MCS) le haghaidh meaisíní tosaithe agus stoptha.

Ailtireacht réitigh

  1. Modúl autoscaler.py. Tá trí rang ann: 1) feidhmeanna chun oibriú le Ambari, 2) feidhmeanna chun oibriú le MCS, 3) feidhmeanna a bhaineann go díreach le loighic an scálaire uathoibríoch.
  2. Script observer.py. Go bunúsach tá sé comhdhéanta de rialacha éagsúla: cathain agus ag cén chuimhneacháin chun glaoch ar an autoscaler feidhmeanna.
  3. Comhad cumraíochta config.py. Cuimsíonn sé, mar shampla, liosta de na nóid a cheadaítear le haghaidh uathscálú agus paraiméadair eile a dhéanann difear, mar shampla, cé chomh fada le fanacht ón nóiméad a cuireadh nód nua leis. Tá stampaí ama ann freisin do thús na ranganna, ionas go seoltar an t-uaschumraíocht braisle ceadaithe roimh an rang.

Breathnaímid anois ar na píosaí cód taobh istigh den chéad dá chomhad.

1. Modúl Autoscaler.py

Rang Ambari

Seo an chuma atá ar phíosa cód ina bhfuil rang Ambari:

class Ambari:
    def __init__(self, ambari_url, cluster_name, headers, auth):
        self.ambari_url = ambari_url
        self.cluster_name = cluster_name
        self.headers = headers
        self.auth = auth

    def stop_all_services(self, hostname):
        url = self.ambari_url + self.cluster_name + '/hosts/' + hostname + '/host_components/'
        url2 = self.ambari_url + self.cluster_name + '/hosts/' + hostname
        req0 = requests.get(url2, headers=self.headers, auth=self.auth)
        services = req0.json()['host_components']
        services_list = list(map(lambda x: x['HostRoles']['component_name'], services))
        data = {
            "RequestInfo": {
                "context":"Stop All Host Components",
                "operation_level": {
                    "level":"HOST",
                    "cluster_name": self.cluster_name,
                    "host_names": hostname
                },
                "query":"HostRoles/component_name.in({0})".format(",".join(services_list))
            },
            "Body": {
                "HostRoles": {
                    "state":"INSTALLED"
                }
            }
        }
        req = requests.put(url, data=json.dumps(data), headers=self.headers, auth=self.auth)
        if req.status_code in [200, 201, 202]:
            message = 'Request accepted'
        else:
            message = req.status_code
        return message

Thuas, mar shampla, is féidir leat breathnú ar chur i bhfeidhm na feidhme stop_all_services, a stopann gach seirbhís ar an nód braisle atá ag teastáil.

Ag an mbealach isteach chuig an rang Ambari pasann tú:

  • ambari_url, mar shampla, cosúil le 'http://localhost:8080/api/v1/clusters/',
  • cluster_name – ainm do bhraisle in Ambari,
  • headers = {'X-Requested-By': 'ambari'}
  • agus istigh auth Seo é do logáil isteach agus do phasfhocal le haghaidh Ambari: auth = ('login', 'password').

Níl an fheidhm féin níos mó ná cúpla glaoch tríd an REST API chuig Ambari. Ó thaobh loighciúil de, faighimid ar dtús liosta de sheirbhísí reatha ar nód, agus ansin iarraimid ar bhraisle ar leith, ar nód ar leith, seirbhísí a aistriú ón liosta go dtí an stát INSTALLED. Feidhmeanna chun gach seirbhís a sheoladh, chun nóid a aistriú chuig an stát Maintenance srl cuma den chineál céanna - níl iontu ach cúpla iarratas tríd an API.

Aicme Mcs

Seo an chuma atá ar phíosa cód ina bhfuil rang Mcs:

class Mcs:
    def __init__(self, id1, id2, password):
        self.id1 = id1
        self.id2 = id2
        self.password = password
        self.mcs_host = 'https://infra.mail.ru:8774/v2.1'

    def vm_turn_on(self, hostname):
        self.token = self.get_mcs_token()
        host = self.hostname_to_vmname(hostname)
        vm_id = self.get_vm_id(host)
        mcs_url1 = self.mcs_host + '/servers/' + self.vm_id + '/action'
        headers = {
            'X-Auth-Token': '{0}'.format(self.token),
            'Content-Type': 'application/json'
        }
        data = {'os-start' : 'null'}
        mcs = requests.post(mcs_url1, data=json.dumps(data), headers=headers)
        return mcs.status_code

Ag an mbealach isteach chuig an rang Mcs cuirimid an t-aitheantas tionscadail taobh istigh den scamall agus an t-aitheantas úsáideora, chomh maith lena phasfhocal. I bhfeidhm vm_turn_on ba mhaith linn ceann de na meaisíní a chasadh air. Tá an loighic anseo beagán níos casta. Ag tús an chóid, tugtar trí fheidhm eile: 1) ní mór dúinn comhartha a fháil, 2) ní mór dúinn an t-óstainm a thiontú go hainm an mheaisín i MCS, 3) faigh aitheantas an mheaisín seo. Ansin, ní dhéanaimid ach iarratas poist agus an meaisín seo a sheoladh.

Seo an chuma atá ar an bhfeidhm chun comhartha a fháil:

def get_mcs_token(self):
        url = 'https://infra.mail.ru:35357/v3/auth/tokens?nocatalog'
        headers = {'Content-Type': 'application/json'}
        data = {
            'auth': {
                'identity': {
                    'methods': ['password'],
                    'password': {
                        'user': {
                            'id': self.id1,
                            'password': self.password
                        }
                    }
                },
                'scope': {
                    'project': {
                        'id': self.id2
                    }
                }
            }
        }
        params = (('nocatalog', ''),)
        req = requests.post(url, data=json.dumps(data), headers=headers, params=params)
        self.token = req.headers['X-Subject-Token']
        return self.token

Aicme uath-scála

Tá feidhmeanna san aicme seo a bhaineann leis an loighic oibriúcháin féin.

Seo an chuma atá ar phíosa cód don rang seo:

class Autoscaler:
    def __init__(self, ambari, mcs, scaling_hosts, yarn_ram_per_node, yarn_cpu_per_node):
        self.scaling_hosts = scaling_hosts
        self.ambari = ambari
        self.mcs = mcs
        self.q_ram = deque()
        self.q_cpu = deque()
        self.num = 0
        self.yarn_ram_per_node = yarn_ram_per_node
        self.yarn_cpu_per_node = yarn_cpu_per_node

    def scale_down(self, hostname):
        flag1 = flag2 = flag3 = flag4 = flag5 = False
        if hostname in self.scaling_hosts:
            while True:
                time.sleep(5)
                status1 = self.ambari.decommission_nodemanager(hostname)
                if status1 == 'Request accepted' or status1 == 500:
                    flag1 = True
                    logging.info('Decomission request accepted: {0}'.format(flag1))
                    break
            while True:
                time.sleep(5)
                status3 = self.ambari.check_service(hostname, 'NODEMANAGER')
                if status3 == 'INSTALLED':
                    flag3 = True
                    logging.info('Nodemaneger decommissioned: {0}'.format(flag3))
                    break
            while True:
                time.sleep(5)
                status2 = self.ambari.maintenance_on(hostname)
                if status2 == 'Request accepted' or status2 == 500:
                    flag2 = True
                    logging.info('Maintenance request accepted: {0}'.format(flag2))
                    break
            while True:
                time.sleep(5)
                status4 = self.ambari.check_maintenance(hostname, 'NODEMANAGER')
                if status4 == 'ON' or status4 == 'IMPLIED_FROM_HOST':
                    flag4 = True
                    self.ambari.stop_all_services(hostname)
                    logging.info('Maintenance is on: {0}'.format(flag4))
                    logging.info('Stopping services')
                    break
            time.sleep(90)
            status5 = self.mcs.vm_turn_off(hostname)
            while True:
                time.sleep(5)
                status5 = self.mcs.get_vm_info(hostname)['server']['status']
                if status5 == 'SHUTOFF':
                    flag5 = True
                    logging.info('VM is turned off: {0}'.format(flag5))
                    break
            if flag1 and flag2 and flag3 and flag4 and flag5:
                message = 'Success'
                logging.info('Scale-down finished')
                logging.info('Cooldown period has started. Wait for several minutes')
        return message

Glacaimid le ranganna le haghaidh iontrála. Ambari и Mcs, liosta de na nóid a cheadaítear le haghaidh scálaithe, chomh maith le paraiméadair chumraíocht nód: cuimhne agus cpu a leithdháileadh ar an nód i YARN. Tá 2 pharaiméadair inmheánacha ann freisin q_ram, q_cpu, atá ina scuainí. Ag baint úsáide as iad, stóráilimid luachanna an ualach braisle atá ann faoi láthair. Má fheicimid go bhfuil ualach méadaithe go seasta ann le 5 nóiméad anuas, ansin socraímid go gcaithfimid +1 nód a chur leis an mbraisle. Tá an rud céanna fíor maidir leis an stát tearcúsáidte braisle.

Is sampla é an cód thuas d’fheidhm a bhaineann meaisín as an mbraisle agus a stopann sa scamall é. Ar dtús tá díchoimisiúnú YARN Nodemanager, ansin casann an modh ar Maintenance, ansin stopann muid gach seirbhís ar an meaisín agus an meaisín fíorúil sa scamall a mhúchadh.

2. Script bhreathnadóir.py

Cód samplach as sin:

if scaler.assert_up(config.scale_up_thresholds) == True:
        hostname = cloud.get_vm_to_up(config.scaling_hosts)
        if hostname != None:
            status1 = scaler.scale_up(hostname)
            if status1 == 'Success':
                text = {"text": "{0} has been successfully scaled-up".format(hostname)}
                post = {"text": "{0}".format(text)}
                json_data = json.dumps(post)
                req = requests.post(webhook, data=json_data.encode('ascii'), headers={'Content-Type': 'application/json'})
                time.sleep(config.cooldown_period*60)

Anseo, déanaimid seiceáil an bhfuil coinníollacha cruthaithe chun cumas an bhraisle a mhéadú agus an bhfuil aon mheaisíní in áirithe, faigh an t-óstainm ar cheann acu, cuir leis an mbraisle é agus foilsímid teachtaireacht faoi ar ár bhfoireann Slack. Tar éis a thosaíonn sé cooldown_period, nuair nach ndéanaimid aon rud a chur leis nó a bhaint as an mbraisle, ach go simplí monatóireacht a dhéanamh ar an ualach. Má tá sé cobhsaithe agus go bhfuil sé laistigh de chonair na n-uasluachanna ualaigh, níl le déanamh againn ach leanúint den mhonatóireacht. Mura leor nód amháin, cuirimid ceann eile leis.

I gcásanna ina bhfuil ceacht romhainn, tá a fhios againn go cinnte nach leor nód amháin, mar sin cuirimid tús láithreach leis na nóid saor in aisce go léir agus coinnímid gníomhach iad go dtí deireadh an cheachta. Tarlaíonn sé seo trí úsáid a bhaint as liosta stampaí ama gníomhaíochta.

Conclúid

Is réiteach maith agus áisiúil é Autoscaler do na cásanna sin nuair a bhíonn luchtú braisle míchothrom agat. Déanann tú an cumraíocht braisle atá ag teastáil a bhaint amach ag an am céanna le haghaidh buaic-ualaí agus ag an am céanna ní choinníonn tú an braisle seo le linn gannualach, rud a shábháil airgead. Bhuel, móide a tharlaíonn sé seo go léir go huathoibríoch gan do rannpháirtíocht. Níl an t-autoscaler féin níos mó ná sraith iarratas chuig an mbainisteoir braisle API agus an API soláthraí scamall, scríofa de réir loighic áirithe. Is cinnte gur gá duit cuimhneamh ar na nóid a roinnt ina 3 chineál, mar a scríobh muid níos luaithe. Agus beidh tú sásta.

Foinse: will.com

Add a comment