Me pehea te hanga i a koe ake autoscaler mo te tautau

Kia ora! Ka whakangungu matou i nga tangata ki te mahi me nga raraunga nui. E kore e taea te whakaaro he kaupapa ako i runga i nga raraunga nui karekau he kahui, e mahi tahi ai nga kaiuru katoa. Mo tenei take, kei a maatau te kaupapa :) Kei te mahi matou ki tana whirihoranga, ki te whakatikatika me te whakahaere, a ka tukuna tika nga mahi a MapReduce ki reira ka whakamahi i te Spark.

I roto i tenei pou ka korero atu matou ki a koe me pehea ta matou whakaoti i te raru o te utaina o nga tautau koretake ma te tuhi i a maatau ake autoscaler ma te whakamahi i te kapua. Mail.ru Cloud Solutions.

raruraru

Kaore e whakamahia ana to tatou tautau i roto i te aratau angamaheni. Ko te tukunga he tino koretake. Hei tauira, he karaehe mahi, ina haere nga tangata 30 katoa me tetahi kaiako ki te roopu ka timata ki te whakamahi. Ranei ano, he ra i mua i te wa mutunga ka nui haere te kawenga. Ko te toenga o te wa ka mahi te tautau i roto i te aratau underload.

Ko te otinga #1 ko te pupuri i tetahi tautau ka mau ki nga taumahatanga teitei, engari ka noho mangere i te toenga o te waa.

Ko te otinga #2 ko te pupuri i tetahi kahui iti, ka taapirihia e koe nga pona i mua i nga karaehe me nga kawenga teitei.

Ko te otinga #3 ko te pupuri i tetahi kahui iti me te tuhi i tetahi kaitoi-aunoa hei aroturuki i te kawenga o te kahui, a, ma te whakamahi i nga momo API, ka taapiri me te tango i nga pona mai i te kohinga.

I tenei pou ka korero tatou mo te otinga #3. Ko tenei autoscaler e tino ti'aturi ana ki nga mea o waho, kaua ki nga mea o roto, a he maha nga wa kaore e whakaratohia e nga kaiwhakarato. Ka whakamahia e matou te hanganga kapua Mail.ru Cloud Solutions me te tuhi i tetahi autoscaler ma te whakamahi i te API MCS. A, i te mea e whakaako ana matou me pehea te mahi me nga raraunga, i whakatau matou ki te whakaatu me pehea e taea ai e koe te tuhi i tetahi autoscaler rite mo o ake kaupapa me te whakamahi me to kapua.

hiahiatanga

Tuatahi, me whai koe i te roopu Hadoop. Hei tauira, ka whakamahia e matou te tohatoha HDP.

Kia tere te taapiri me te tango i o pona, me whai tohatanga o nga waahi ki waenga i nga pokapu.

  1. Kopuku matua. Ana, kaore he mea e tino tika ana ki te whakamarama i konei: ko te kohanga matua o te kohinga, hei tauira, ka whakarewahia te taraiwa Spark, mena ka whakamahi koe i te aratau tauwhitiwhiti.
  2. Node rā. Koinei te node e penapena ai koe i nga raraunga i runga i te HDFS me te waahi ka mahia nga tatauranga.
  3. Node rorohiko. He node tenei kaore koe e penapena i tetahi mea ki runga HDFS, engari kei hea nga tatauranga.

Te take nui. Ka puta te whakaira-aunoa na runga i nga pona o te momo tuatoru. Mena ka timata koe ki te tango me te taapiri i nga pona o te momo tuarua, ka tino iti te tere o te whakautu - he maha nga haora i runga i to kahui te whakakore me te tuku ano. Ko te tikanga, ehara tenei i te mea e tumanakohia ana e koe mai i te autoscaling. Arā, kāre mātou e pā ki ngā kōpuku o ngā momo tuatahi me te tuarua. Ka tohu ratou i te kahui iti ka taea te noho puta noa i te roanga o te kaupapa.

Na, kua tuhia to maatau autoscaler ki Python 3, ka whakamahi i te API Ambari ki te whakahaere i nga ratonga tautau, whakamahi API mai i Mail.ru Cloud Solutions (MCS) mo te tiimata me te whakamutu i nga miihini.

hoahoanga otinga

  1. Takahauira autoscaler.py. E toru nga karaehe: 1) nga mahi mo te mahi me te Ambari, 2) nga mahi mo te mahi me te MCS, 3) nga mahi e pa ana ki te arorau o te autoscaler.
  2. Hōtuhi observer.py. Ko te tikanga he rereke nga ture: ahea me nga wa ka karangahia nga mahi autoscaler.
  3. Kōnae whirihoranga config.py. Kei roto, hei tauira, he rarangi o nga pona e whakaaetia ana mo te whakamaarama aunoa me etahi atu tawhā e pa ana, hei tauira, te roa o te tatari mai i te wa i taapirihia ai he pona hou. He tohu wa ano mo te timatanga o nga karaehe, kia whakarewahia ai i mua i te karaehe te whirihoranga tautau morahi e whakaaetia ana.

Me titiro inaianei ki nga wahanga o te waehere kei roto i nga konae tuatahi e rua.

1. Autoscaler.py kōwae

Te karaehe Ambari

Koinei te ahua o tetahi waahanga waehere kei roto he karaehe 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

I runga ake, hei tauira, ka taea e koe te titiro ki te whakatinanatanga o te mahi stop_all_services, ka mutu nga ratonga katoa i runga i te node tautau e hiahiatia ana.

I te tomokanga ki te karaehe Ambari haere koe:

  • ambari_url, hei tauira, rite 'http://localhost:8080/api/v1/clusters/',
  • cluster_name – te ingoa o to tautau i Ambari,
  • headers = {'X-Requested-By': 'ambari'}
  • me roto auth Anei to ingoa kaiwhakamahi me to kupuhipa mo Ambari: auth = ('login', 'password').

Ko te mahi ano he mea ke atu i nga waea e rua ma te REST API ki Ambari. Mai i te tirohanga arorau, ka whiwhi tuatahi matou i te rarangi o nga ratonga whakahaere i runga i te node, katahi ka patai i runga i tetahi kahui, i runga i tetahi node, ki te whakawhiti ratonga mai i te rarangi ki te kawanatanga INSTALLED. Nga mahi mo te whakarewa i nga ratonga katoa, mo te whakawhiti i nga pona ki te whenua Maintenance he rite tonu te ahua - he iti noa nga tono ma te API.

Karaehe Mcs

Koinei te ahua o tetahi waahanga waehere kei roto he karaehe 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

I te tomokanga ki te karaehe Mcs ka tukuna e matou te id kaupapa i roto i te kapua me te id kaiwhakamahi, me tana kupuhipa. I roto i te mahi vm_turn_on e hiahia ana matou ki te huri i tetahi o nga miihini. Ko te arorau i konei he uaua ake. I te timatanga o te waehere, ka karangahia etahi atu mahi e toru: 1) me whiwhi tohu, 2) me huri te ingoa o te kaihautu ki te ingoa o te miihini i roto i te MCS, 3) tiki i te id o tenei miihini. I muri mai, ka tukuna he tono panui ka whakarewahia tenei miihini.

Koinei te ahua o te mahi mo te whiwhi tohu tohu:

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

Karaehe Autoscaler

Kei roto i tenei akomanga nga mahi e pa ana ki te arorau whakahaere.

Koinei te ahua o tetahi waahanga waehere mo tenei akomanga:

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

Ka whakaae matou ki nga karaehe mo te urunga. Ambari и Mcs, he rarangi o nga node e whakaaetia ana mo te tauine, me nga tawhā whirihoranga node: te mahara me te cpu kua tohaina ki te node i te YARN. E rua ano nga tawhā o roto q_ram, q_cpu, he rarangi. Ma te whakamahi i a raatau, ka penapenahia e maatau nga uara o te uta o naianei. Mena ka kite tatou i roto i nga meneti 2 kua pahure ake nei kua piki haere tonu te kawenga, katahi ka whakatau me taapirihia te +5 node ki te tautau. He pera ano mo te ahua o te kore whakamahi kahui.

Ko te waehere i runga ake nei he tauira o te mahi e tango ana i te miihini mai i te tautau ka mutu i roto i te kapua. Tuatahi ko te whakakorenga YARN Nodemanager, ka huri te aratau Maintenance, ka mutu nga ratonga katoa i runga i te miihini ka whakawetohia te miihini mariko i roto i te kapua.

2. Script observer.py

Tauira waehere mai i reira:

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)

I roto, ka tirohia mena kua hangaia nga tikanga mo te whakanui ake i te kaha o te kahui me te mea he miihini kei roto i te rahui, tikina te ingoa kaihautu o tetahi o ratou, taapiri atu ki te roopu me te whakaputa korero mo taua mea ki te Slack o ta matou roopu. Whai muri ka timata cooldown_period, ki te kore e taapiri, ki te tango ranei i tetahi mea mai i te tautau, engari ka aro turuki noa i te kawenga. Mena kua u, kei roto i te kauhanga o nga uara kawenga tino pai, katahi ka haere tonu taatau ki te tirotiro. Mena karekau tetahi node i nui, katahi ka taapirihia tetahi atu.

Mo nga keehi ka whai akoranga tatou kei mua, kua tino mohio tatou karekau e ranea te node kotahi, no reira ka timata tonu tatou i nga pona kore utu katoa ka pupuri kia kaha tae noa ki te mutunga o te akoranga. Ka puta tenei ma te whakamahi i te rarangi tohu tohu waahi mahi.

mutunga

Ko te Autoscaler he otinga pai me te watea mo era keehi ka pa ki a koe te utaina o te kahui. I te wa kotahi ka tutuki koe i te whirihoranga tautau e hiahiatia ana mo nga kawenga teitei, me te wa ano kaua e pupuri i tenei kahui i te wa e paheke ana, ka penapena moni. Ae, me tenei ka puta aunoa me te kore koe e whai waahi. Ko te autoscaler ake he mea noa atu i te huinga tono ki te API kaiwhakahaere tautau me te API kaiwhakarato kapua, i tuhia kia rite ki etahi whakaaro. Ko te mea me mahara koe ko te wehewehenga o nga pona ki nga momo 3, pera i ta matou i tuhi i mua. A ka koa koe.

Source: will.com

Tāpiri i te kōrero