Mar a nì thu an autoscaler agad fhèin airson buidheann

Halò! Bidh sinn a’ trèanadh dhaoine gu bhith ag obair le dàta mòr. Tha e do-dhèanta smaoineachadh air prògram foghlaim air dàta mòr às aonais a bhuidheann fhèin, air am bi a h-uile com-pàirtiche ag obair còmhla. Air an adhbhar seo, tha e an-còmhnaidh aig a’ phrògram againn 🙂 Tha sinn an sàs ann an rèiteachadh, gleusadh agus rianachd, agus bidh na balaich a’ cur air bhog obraichean MapReduce gu dìreach an sin agus a’ cleachdadh Spark.

Anns an dreuchd seo innsidh sinn dhut mar a dh’ fhuasgail sinn an duilgheadas a thaobh luchdachadh cnuasachaidh neo-chòmhnard le bhith a’ sgrìobhadh an autoscaler againn fhèin a’ cleachdadh an sgòth Mail.ru Cloud Solutions.

duilgheadas

Chan eil an cruinneachadh againn air a chleachdadh ann am modh àbhaisteach. Tha cur às gu tur neo-chothromach. Mar eisimpleir, tha clasaichean practaigeach ann, nuair a thèid a h-uile 30 neach agus tidsear don bhuidheann agus tòisichidh iad ga chleachdadh. No a-rithist, tha làithean ann ron cheann-latha nuair a bhios an luchd ag àrdachadh gu mòr. An còrr den ùine bidh am buidheann ag obair ann am modh fo-luchdachadh.

Is e fuasgladh #1 cruinneachadh a chumail a sheasas ri luchdan as àirde, ach a bhios leisg an còrr den ùine.

Is e fuasgladh #2 cruinneachadh beag a chumail, ris an cuir thu nodan le làimh ro chlasaichean agus aig àm luchdan as àirde.

Is e fuasgladh #3 cruinneachadh beag a chumail agus autoscaler a sgrìobhadh a choimheadas an luchd gnàthach den bhuidheann agus, a’ cleachdadh diofar APIan, cuir ris agus thoir air falbh nodan bhon bhuidheann.

Anns an dreuchd seo bruidhnidh sinn mu fhuasgladh #3. Tha an autoscaler seo gu mòr an urra ri factaran bhon taobh a-muigh seach feadhainn a-staigh, agus gu tric cha bhith solaraichean ga thoirt seachad. Bidh sinn a’ cleachdadh bun-structar sgòthan Mail.ru Cloud Solutions agus sgrìobh sinn autoscaler a’ cleachdadh an MCS API. Agus leis gu bheil sinn a’ teagasg mar a dh’obraicheas tu le dàta, chuir sinn romhainn sealltainn mar as urrainn dhut autoscaler coltach ris a sgrìobhadh airson na h-adhbharan agad fhèin agus a chleachdadh leis an sgòth agad

Prerequisites

An toiseach, feumaidh buidheann Hadoop a bhith agad. Mar eisimpleir, bidh sinn a’ cleachdadh an sgaoileadh HDP.

Gus an tèid na nodan agad a chuir ris agus a thoirt air falbh gu sgiobalta, feumaidh tu cuairteachadh sònraichte de dhleastanasan am measg nan nodan.

  1. Prìomh nod. Uill, chan fheumar dad a mhìneachadh gu sònraichte: prìomh nód a ’chnuasaich, air am bi, mar eisimpleir, an draibhear Spark air a chuir air bhog, ma chleachdas tu am modh eadar-ghnìomhach.
  2. Òrdugh cinn-latha. Is e seo an nòta air am bi thu a’ stòradh dàta air HDFS agus far an tèid àireamhachadh a dhèanamh.
  3. Nod coimpiutaireachd. Is e seo nód far nach bi thu a’ stòradh dad air HDFS, ach far a bheil àireamhachadh a’ tachairt.

Puing chudromach. Bidh fèin-sgèileadh a’ tachairt air sgàth nodan den treas seòrsa. Ma thòisicheas tu a’ gabhail agus a’ cur a-steach nodan den dàrna seòrsa, bidh an astar freagairt glè ìosal - bheir dì-choimiseanadh agus ath-ghealladh uairean air a’ bhuidheann agad. Chan e seo, gu dearbh, a tha thu a’ dùileachadh bho bhith a ’sgèileadh gu fèin-ghluasadach. Is e sin, chan eil sinn a 'suathadh nodan den chiad agus an dàrna seòrsa. Bidh iad a’ riochdachadh a’ bhuidheann as lugha a bhios comasach a bhith ann fad beatha a’ phrògraim.

Mar sin, tha an autoscaler againn sgrìobhte ann am Python 3, a’ cleachdadh an Ambari API gus seirbheisean brabhsair, cleachdaidhean a riaghladh API bho Mail.ru Cloud Solutions (MCS) airson innealan tòiseachaidh is stad.

Ailtireachd fuasgladh

  1. Modal autoscaler.py. Tha trì clasaichean ann: 1) gnìomhan airson a bhith ag obair le Ambari, 2) gnìomhan airson a bhith ag obair le MCS, 3) gnìomhan co-cheangailte gu dìreach ri loidsig an autoscaler.
  2. Sgriobt observer.py. Gu bunaiteach tha e air a dhèanamh suas de riaghailtean eadar-dhealaichte: cuin agus dè na h-amannan airson na gnìomhan autoscaler a ghairm.
  3. Faidhle rèiteachaidh config.py. Tha e a’ toirt a-steach, mar eisimpleir, liosta de nodan a tha ceadaichte airson fèin-sgèileadh agus crìochan eile a bheir buaidh, mar eisimpleir, dè cho fada ri feitheamh bhon mhionaid a chaidh nód ùr a chur ris. Tha clàran-ama ann cuideachd airson toiseach chlasaichean, gus an tèid an rèiteachadh brabhsair ceadaichte as àirde a chuir air bhog ron chlas.

Bheir sinn sùil a-nis air na pìosan còd taobh a-staigh a’ chiad dà fhaidhle.

1. Autoscaler.py modal

Clas Ambari

Seo mar a tha pìos còd anns a bheil clas coltach 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

Gu h-àrd, mar eisimpleir, faodaidh tu coimhead air buileachadh a 'ghnìomh stop_all_services, a chuireas stad air a h-uile seirbheis air an nód brabhsair a tha thu ag iarraidh.

Aig an t-slighe a-steach don chlas Ambari thèid thu seachad:

  • ambari_url, mar eisimpleir, mar 'http://localhost:8080/api/v1/clusters/',
  • cluster_name - ainm do bhuidheann ann an Ambari,
  • headers = {'X-Requested-By': 'ambari'}
  • agus a-staigh auth Seo an logadh a-steach agus am facal-faire agad airson Ambari: auth = ('login', 'password').

Chan eil an gnìomh fhèin nas motha na fios no dhà tron ​​​​REST API gu Ambari. Bho shealladh loidsigeach, bidh sinn an-toiseach a’ faighinn liosta de sheirbheisean ruith air nód, agus an uairsin ag iarraidh air cruinneachadh sònraichte, air nód sònraichte, seirbheisean a ghluasad bhon liosta chun na stàite. INSTALLED. Gnìomhan airson a h-uile seirbheis a chuir air bhog, airson nodan a ghluasad gu stàite Maintenance msaa coimhead coltach - chan eil annta ach beagan iarrtasan tron ​​​​API.

Clas Mcs

Seo mar a tha pìos còd anns a bheil clas coltach 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

Aig an t-slighe a-steach don chlas Mcs bidh sinn a’ dol seachad air id a’ phròiseict taobh a-staigh an sgòth agus id an neach-cleachdaidh, a bharrachd air am facal-faire aige. Ann an gnìomh vm_turn_on tha sinn airson aon de na h-innealan a chuir air. Tha an loidsig an seo beagan nas iom-fhillte. Aig toiseach a 'chòd, canar trì gnìomhan eile ris: 1) feumaidh sinn comharra fhaighinn, 2) feumaidh sinn an t-ainm aoigheachd a thionndadh gu ainm an inneil ann an MCS, 3) faigh id an inneil seo. An uairsin, bidh sinn dìreach a ’dèanamh iarrtas puist agus a’ cur air bhog an inneal seo.

Seo mar a tha an gnìomh airson tòcan fhaighinn coltach:

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

Clas fèin-sgèile

Anns a’ chlas seo tha gnìomhan co-cheangailte ris an loidsig obrachaidh fhèin.

Seo cò ris a tha pìos còd airson a’ chlas seo coltach:

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

Gabhaidh sinn ri clasaichean airson faighinn a-steach. Ambari и Mcs, liosta de nodan a tha ceadaichte airson sgèileadh, a bharrachd air paramadairean rèiteachaidh nód: cuimhne agus cpu air a riarachadh don nód ann an YARN. Tha 2 pharamadair a-staigh ann cuideachd q_ram, q_cpu, a tha nan ciudhaichean. Le bhith gan cleachdadh, bidh sinn a’ stòradh luachan an luchd cnuasachaidh gnàthach. Ma chì sinn gu bheil àrdachadh cunbhalach air a bhith ann anns na 5 mionaidean mu dheireadh, an uairsin bidh sinn a’ co-dhùnadh gum feum sinn nód +1 a chuir ris a’ bhuidheann. Tha an aon rud fìor airson staid fo-chleachdadh na buidhne.

Tha an còd gu h-àrd na eisimpleir de ghnìomh a bheir air falbh inneal bhon bhuidheann agus a chuireas stad air san sgòth. An toiseach tha dì-choimiseanadh ann YARN Nodemanager, an uairsin tionndaidh am modh air Maintenance, an uairsin stadaidh sinn a h-uile seirbheis air an inneal agus cuir dheth an inneal brìgheil san sgòth.

2. Sgriobt neach-coimhid.py

Còd sampall às an 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)

Ann, bidh sinn a’ sgrùdadh an deach suidheachaidhean a chruthachadh airson comas a’ chnuas a mheudachadh agus a bheil innealan ann an tèarmann, faigh ainm aoigheachd aon dhiubh, cuir ris a’ bhuidheann e agus foillsich teachdaireachd mu dheidhinn air Slack an sgioba againn. Às deidh sin tha e a 'tòiseachadh cooldown_period, nuair nach cuir sinn ris no a bheir sinn air falbh dad bhon bhuidheann, ach dìreach cùm sùil air an luchd. Ma tha e air socrachadh agus gu bheil e taobh a-staigh trannsa nan luachan luchdan as fheàrr, bidh sinn dìreach a’ cumail sùil air. Mura robh aon nód gu leòr, cuiridh sinn fear eile ris.

Airson cùisean nuair a tha leasan againn air thoiseach, tha fios againn mu thràth le cinnt nach bi aon nód gu leòr, agus mar sin bidh sinn a’ tòiseachadh air na nodan an-asgaidh sa bhad agus gan cumail gnìomhach gu deireadh an leasain. Bidh seo a’ tachairt a’ cleachdadh liosta de chlàran-ama gnìomhachd.

co-dhùnadh

Tha Autoscaler na fhuasgladh math agus goireasach airson na cùisean sin nuair a gheibh thu eòlas air luchdachadh cnuasachaidh neo-chòmhnard. Bidh thu aig an aon àm a’ coileanadh an rèiteachadh brabhsair a tha thu ag iarraidh airson luchdan as àirde agus aig an aon àm na cùm am buidheann seo aig àm fo luchdachadh, a’ sàbhaladh airgead. Uill, a bharrachd air an sin bidh seo uile a’ tachairt gu fèin-ghluasadach às aonais do chom-pàirt. Chan eil an autoscaler fhèin nas motha na seata de dh’ iarrtasan gu manaidsear brabhsair API agus an solaraiche sgòthan API, air a sgrìobhadh a rèir loidsig sònraichte. Is e an rud a dh’ fheumas tu a chuimhneachadh gu cinnteach a bhith a’ roinn nodan ann an 3 seòrsaichean, mar a sgrìobh sinn na bu thràithe. Agus bidh thu toilichte.

Source: www.habr.com

Cuir beachd ann