áááºá¹ááá¬áá«! áá»áœááºá¯ááºááá¯á·ááẠáá°áá»á¬ážááᯠáá±áá¬ááŒá®ážááŒá®ážáá¬ážáá¬ážááŒáá·áº áá¯ááºáá±á¬ááºááẠáá±á·áá»áá·áºáá±ážáááºá áá«áááºáá°á¡á¬ážáá¯á¶ážá¡áá°áááœáá¯ááºáá±á¬ááºááá¯ááºááá·áº ááá¯ááºááá¯ááºá¡á á¯á¡áá±ážááá«áá² áá±áá¬ááŒá®ážááŒá®ážáá¬ážáá¬ážá¡ááœáẠááá¬áá±ážááá¯ááºáᬠáááá¯ááááºáá áºáá¯ááᯠá áááºáá°ážááŒáá·áºááẠáááŒá áºááá¯ááºáá«á á€á¡ááŒá±á¬ááºážááŒá±á¬áá·áºá áá»áœááºá¯ááºááá¯á·ááááá¯ááááºááẠáááºážááá¯á¡ááŒá²áááºážááŸáá ð áá»áœááºá¯ááºááá¯á·ááẠáááºážáááœá²á·á ááºážáá¯á¶ááŒááºáááºááŒááºážá áá»áááºááŸáááŒááºážááŸáá·áº á á®áá¶ááá·áºááœá²ááŒááºážááá¯á·ááœáẠáá«áááºáá±ááŒá®áž áááºážááá¯á·ááẠMapReduce á¡áá¯ááºáá»á¬ážááᯠááá¯áá±áá¬ááœáẠááá¯ááºááá¯ááºááœáá·áºááŒá®áž Spark ááᯠá¡áá¯á¶ážááŒá¯áá«áááºá
á€ááá¯á·á
áºááœáẠáá»áœááºá¯ááºááá¯á·ááẠcloud ááá¯á¡áá¯á¶ážááŒá¯á áá»áœááºá¯ááºááá¯á·áááá¯ááºááá¯áẠá¡á±á¬áºááá¯á
áá±ážáááááá¬ááá¯áá±ážáá¬ážááŒááºážááŒáá·áº ááá®ááá¬áá±á¬á¡á
á¯á¡á
ááºážáá»á¬ážáááºááŒááºážááŒá¿áá¬ááᯠáá»áœááºá¯ááºááá¯á·ááŒá±ááŸááºážáá¯á¶ááᯠááŒá±á¬ááŒáá«áááºá
ááŒá¿áá¬
áá»áœááºá¯ááºááá¯á·áá¡á á¯á¡áá±ážááᯠáá¯á¶ááŸááºáá¯ááºááœáẠá¡áá¯á¶ážáááŒá¯áá«á á áœáá·áºáá áºááŒááºážááẠá¡ááœááºááá®áá¬áá«á á¥ááá¬á¡á¬ážááŒáá·áºá áá° 30 ááŸáá·áº ááá¬áá áºáŠážááá¯á·ááẠá¡á á¯á¡áá±ážááá¯á·ááœá¬ážááŒá®áž áááºážááᯠá áááºá¡áá¯á¶ážááŒá¯áá±á¬á¡áá« áááºááœá±á·á¡áááºážáá»á¬ážááŸááááºá ááá¯á·ááá¯áẠáá±á¬ááºááááºá áááºá¡ááœááºá¡áá»áœá¶ááá¯ážáá¬áá±á¬á¡áá« áá±á¬ááºáá¯á¶ážáááºááŸááºáááºáááá¯ááºáá® áááºáá»á¬ážááŸááááºá áá»ááºá¡áá»áááºáá»á¬ážááœáẠcluster ááẠunderload mode ááœáẠáá¯ááºáá±á¬ááºáááºá
ááŒá±ááŸááºážáá»áẠ#1 ááẠpeak loads áá»á¬ážááá¯áá¶ááá¯ááºáááºááŸáááá·áº cluster áá áºáá¯ááᯠááááºážááááºážáá¬ážáááºááŒá áºáá±á¬áºáááºáž áá»ááºá¡áá»áááºáá»á¬ážááœáẠidle ááŒá áºáá±áá«áááºá
ááŒá±ááŸááºážáá»áẠ#2 ááẠá¡áááºážáá»á¬ážááááºáá® ááŸáá·áº peak loads áá»á¬ážá¡ááœááºáž áááºááá¯ááºááá¯áẠáá±á«ááºážááá·áºááá·áº á¡á á¯á¡áá±ážáááºáá áºáá¯ááᯠáá¬ážááŸááááºááŒá áºáááºá
ááŒá±ááŸááºážáá»áẠ#3 ááẠá¡á á¯á¡áá±ážáááºáá áºáá¯ááᯠááááºážáááºážáááºááŸáá·áº á¡á á¯á¡áá±ážá áááºááŸááááºááᯠá á±á¬áá·áºááŒáá·áºááá·áº autoscaler ááŸáá·áº API á¡áá»áá¯ážáá»áá¯ážááᯠá¡áá¯á¶ážááŒá¯á á¡á á¯á¡áá±ážá០node áá»á¬ážááᯠáá±á«ááºážááá·áºáᬠáááºááŸá¬ážáááºááŒá áºáááºá
áá® post ááŸá¬ á¡ááŒá± áá¶áá«áẠ3 á¡ááŒá±á¬ááºážááᯠááŒá±á¬ááŒáá«áááºá á€á¡á±á¬áºááá¯á áá±ážáááááá¬ááẠá¡ááœááºážááá¯ááºážá¡áá¬áá»á¬ážááẠááŒááºáá¡áá»ááºáá»á¬ážáá±á«áºááœáẠáá»á¬ážá áœá¬áá°áááºáá±ááŒá®áž áááºáá±á¬ááºááŸá¯áá±ážáá°áá»á¬ážááẠáááºážááᯠáááŒá¬áá ááá±ážáá±á¬ááºááŒáá«á áá»áœááºá¯ááºááá¯á·ááẠMail.ru Cloud Solutions cloud á¡ááŒá±áá¶á¡áá±á¬ááºá¡á¡á¯á¶ááá¯á¡áá¯á¶ážááŒá¯ááŒá®áž MCS API ááá¯á¡áá¯á¶ážááŒá¯á autoscaler áá áºáá¯áá±ážáá¬ážáá²á·áááºá áá±áá¬ááŸáá·áº á¡áá¯ááºáá¯ááºáá¯á¶ááᯠáá»áœááºá¯ááºááá¯á· áááºáá±ážáá±á¬ááŒá±á¬áá·áºá ááá·áºááá¯ááºááá¯ááºáááºááœááºáá»ááºáá»á¬ážá¡ááœáẠá¡áá¬ážáá° autoscaler ááᯠáááºáááºáá²á·ááá¯á·áá±ážáá¬ážááá¯ááºááŒá®áž ááá·áº cloud ááœáẠáááºážááá¯á¡áá¯á¶ážááŒá¯áá¯á¶ááᯠááŒáááẠáá¯á¶ážááŒááºáá²á·áááºá
ááŸá±ážáá®ážááá¯á¡áá»ááá»áŒ
ááááŠážá áœá¬á ááá·áºááœáẠHadoop á¡á á¯á¡áá±ážáá áºáá¯ááŸáááááºá á¥ááá¬á¡á¬ážááŒáá·áºá áá»áœááºá¯ááºááá¯á·ááẠHDP ááŒáá·áºááŒá°ážááŸá¯ááᯠá¡áá¯á¶ážááŒá¯áááºá
ááá·áº node áá»á¬ážááᯠáá»ááºááŒááºá áœá¬ áá±á«ááºážááá·áºáááºááŸáá·áº áááºááŸá¬ážáááºá¡ááœááºá node áá»á¬ážááŒá¬ážááœáẠá¡áá»áá¯á·áá±á¬ á¡áááºážááá¹ááá»á¬ážááᯠááœá²áá±áá±ážááá«áááºá
- áá¬á áᬠnode á áá±á¬ááºážááŒá®á á¡áá°ážááááºááŸááºážááŒáááºáááá¯á¡ááºáá«- á¥ááá¬á¡á¬ážááŒáá·áºá áááºá¡ááŒááºá¡ááŸááºá¡áá»áá¯ážáááºáá±á¬ááºááŸá¯áá¯ááºááá¯á¡áá¯á¶ážááŒá¯áá«á Spark áááá¯ááºáá¬ááá¯ááœáá·áºáá±ážááá·áºá¡á á¯á¡áá±ážáá¡ááá node áá áºáá¯ááŒá áºáááºá
- áááºá áœá²á¡ááŸááºá á€áááºááŸá¬ HDFS ááœáẠáá±áá¬ááááºážáááºážááá·áºáá±áá¬ááŒá áºááŒá®áž ááœááºáá»ááºááŸá¯áá»á¬ážááŒá¯áá¯ááºááá·áºáá±áá¬ááŒá áºáááºá
- ááœááºáá»á°áá¬á¡ááŸááºá¡áá¬ážá á€áááºááŸá¬ HDFS ááœáẠáááºááá·áºá¡áá¬ááá¯áá»áŸ ááááºážáááºážááŒááºážáááŒá¯áá² ááœááºáá»ááºááŸá¯áá»á¬áž ááŒá áºáá±á«áºáá¬ááá·áºáá±áá¬ááŒá áºáááºá
á¡áá±ážááŒá®ážáá±á¬á¡áá»ááºá ááááá¡áá»áá¯ážá¡á á¬ážá node áá»á¬ážááŒá±á¬áá·áº á¡á±á¬áºááá¯á áá±ážáá»á²á·ááŒááºáž ááŒá áºáá±á«áºáááá·áºáááºá á¡áááºá áááºááẠáá¯áááá¡áá»áá¯ážá¡á á¬ážá áá¯á¶ááŸááºáá»á¬ážááᯠá áááºááá·áºááœááºážáá«áá áá¯á¶á·ááŒááºááŸá¯á¡ááŒááºááŸá¯ááºážááẠá¡ááœááºáááá·áºáá±áááá·áºááẠ- áá»ááºááááºážááŒááºážááŸáá·áº ááŒááºáááºááœá²á·á ááºážááŒááºážááẠááá·áºá¡á á¯á¡áá±ážááœáẠáá¬áá®áá±á«ááºážáá»á¬ážá áœá¬ ááŒá¬áááºááŒá áºáááºá á€áááºááŸá¬ autoscaling á០áááºáá»áŸá±á¬áºááá·áºáá¬ážááá·áºá¡áá¬ááá¯ááºáá«á ááá¯ááá¯áááºááŸá¬á áá»áœááºá¯ááºááá¯á·ááẠáááááŸáá·áº áá¯áááá¡áá»áá¯ážá¡á á¬ážáá»á¬ážá áá¯á¶ááŸááºáá»á¬ážááᯠááááá«á áááºážááá¯á·ááẠáááá¯ááááºá ááŒá¬ááŒáá·áºáá»áááºáá áºáá»áŸá±á¬ááºááœáẠááŸááá±ááá·áº á¡áááºážáá¯á¶áž á¡áá¯á¶ážááŒá¯ááá¯ááºááá·áº á¡á á¯á¡áá±ážááᯠááá¯ááºá á¬ážááŒá¯áááºááŒá áºáááºá
ááá¯á·ááŒá±á¬áá·áºá áá»áœááºá¯ááºááá¯á·á autoscaler ááᯠPython 3 ááœáẠáá±ážáá¬ážáá¬ážááŒá®ážá á¡á
á¯ááá¯ááºáááºáá±á¬ááºááŸá¯áá»á¬ážááᯠá
á®áá¶ááá·áºááœá²ááẠAmbari API ááᯠá¡áá¯á¶ážááŒá¯áááºá
ááŒá±ááŸááºážáá»ááºáááá¯áá¬
- á¡ááá¯ááºáž
autoscaler.py
. áááºážááœáẠá¡áááºážáá¯á¶ážáá»áá¯ážáá«áááºáááº- 1) Ambari ááŸáá·áº áá¯ááºáá±á¬ááºááẠáá¯ááºáá±á¬ááºáá»ááºáá»á¬ážá 2) MCS ááŸáá·áº áá¯ááºáá±á¬ááºáááºá¡ááœáẠáá¯ááºáá±á¬ááºáá»ááºáá»á¬ážá 3) autoscaler á áá¯áá¹áááá±áááŸáá·áº ááá¯ááºááá¯ááºáááºááá¯ááºááá·áº áá¯ááºáá±á¬ááºáá»ááºáá»á¬ážá - áá¬ááºááœáŸááºáž
observer.py
. á¡ááŒá±áá¶á¡á¬ážááŒáá·áº áááºážááœáẠááœá²ááŒá¬ážááŒá¬ážáá¬ážáá±á¬ á ááºážáá»ááºážáá»á¬áž áá«áááºáááº- autoscaler áá¯ááºáá±á¬ááºáá»ááºáá»á¬ážááᯠáá±á«áºááẠáááºááá·áºá¡áá»áááºááŸáá·áº áááºááá·áºá¡áá»áááºáá»á¬ážááœáẠáá«áááºáááºá - ááœá²á·á
ááºážááŸá¯ááá¯ááº
config.py
. á¥ááá¬á¡á¬ážááŒáá·áºá áááºážááœáẠá¡á±á¬áºááá¯á áá±ážáá»ááŒááºážá¡ááœáẠááœáá·áºááŒá¯áá±á¬ node áá»á¬ážá á¬áááºážááŸáá·áº á¥ááá¬á node á¡áá áºáá áºáá¯ááá·áºááœááºážááá·áºá¡áá»áááºááŸá á áááºáá»áŸááŒá¬ááŒá¬á á±á¬áá·áºááá¯ááºážááááºáááºážá á¡áááºážá áááºáá»áááºá¡ááœáẠá¡áá»áááºáá¶ááááºáá»á¬ážáááºáž áá«ááŸááá«áááºá ááá¯á·ááŒá±á¬áá·áº á¡áááºážáá áá® á¡áá»á¬ážáá¯á¶ážááœáá·áºááŒá¯áá¬ážáá±á¬ á¡á á¯á¡áá±ážááœá²á·á ááºážááŸá¯áá¯á¶á á¶ááᯠá áááºááá¯ááºáá«á
á¡áᯠáááááá¯ááºááŸá áºáá¯áá²á áá¯ááºá¡ááá¯ááºážá¡á ááœá±ááᯠááŒáá·áºáá¡á±á¬ááºá
1. Autoscaler.py áá±á¬áºáá»á°áž
Ambari á¡áááºáž
á€áááºááŸá¬ á¡áááºážáá
áºáá¯áá«áááºáá±á¬ áá¯ááºá¡ááá¯ááºážá¡á
áá
áºáá¯ááŒá
áºáááºá 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
á¡áááºááœááºá á¥ááá¬áá
áºáá¯á¡áá±ááŒáá·áºá áááºááẠfunction áá¡áá±á¬ááºá¡áááºáá±á¬áºááŸá¯ááá¯ááŒáá·áºááŸá¯ááá¯ááºáááºá stop_all_services
ááá¯áá»ááºáá±á¬ cluster node áá±á«áºááŸá áááºáá±á¬ááºááŸá¯á¡á¬ážáá¯á¶ážááᯠáááºááá·áºá
á±áá±á¬á
á¡áááºážáá¶áá«ážáááŸá¬ Ambari
áááºááŒááºáááºáž:
ambari_url
á¥ááᬠááŒáá¯ááºáááºá'http://localhost:8080/api/v1/clusters/'
,cluster_name
- Ambari ááŸá ááá·áºá¡á á¯á¡áá±ážáá¡áááºáheaders = {'X-Requested-By': 'ambari'}
- á¡ááœááºážááá¯ááºáž
auth
á€áááºááŸá¬ Ambari á¡ááœáẠááá·áºá¡áá¯á¶ážááŒá¯áá°á¡áááºááŸáá·áº á áá¬ážááŸááºááŒá áºáá«áááºáauth = ('login', 'password')
.
áá¯ááºáá±á¬ááºáá»ááºááá¯ááºááá¯ááºá REST API ááŸáá
áºááá·áº Ambari ááá¯á· áá¯ááºážáá±á«áºááá¯ááŸá¯ ááŸá
áºááŒáááºááẠáááá¯áá«á áá¯áá¹áááá±áá¡ááŒááºá¡áá áá»áœááºá¯ááºááá¯á·ááẠnode áá
áºáá¯áá±á«áºááœááºáááºáááºáá±áá±á¬áááºáá±á¬ááºááŸá¯áá»á¬ážá
á¬áááºážááᯠáŠážá
áœá¬áááºáá¶áááŸáááŒá®ážáá±á¬ááºá áá±ážáá¬ážáá±á¬ á¡á
á¯á¡áá±ážáá
áºáá¯ááœááºá áá±ážáá¬ážáá±á¬ node áá
áºáá¯áá±á«áºááœááºá á
á¬áááºážá០áááºáá±á¬ááºááŸá¯áá»á¬ážááᯠá¡ááŒá±á¡áá±ááá¯á·ááœáŸá²ááŒá±á¬ááºážááẠáá±á¬ááºážááá¯áá«áááºá INSTALLED
. node áá»á¬ážááᯠááŒááºáááºááá¯á· ááœáŸá²ááŒá±á¬ááºážááŒááºážá¡ááœáẠáááºáá±á¬ááºááŸá¯á¡á¬ážáá¯á¶ážááᯠá
áááºááŒááºážá¡ááœáẠáá¯ááºáá±á¬ááºáá»ááºáá»á¬áž Maintenance
á
áááºááá¯á·ááẠáááºáá°ááẠ- áááºážááá¯á·ááẠAPI ááŸáááá·áº áá±á¬ááºážááá¯ááŸá¯ á¡áááºážáááºáá»áŸáá¬ááŒá
áºáááºá
á¡áááºáž Mcs
á€áááºááŸá¬ á¡áááºážáá
áºáá¯áá«áááºáá±á¬ áá¯ááºá¡ááá¯ááºážá¡á
áá
áºáá¯ááŒá
áºáááºá 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
á¡áááºážáá¶áá«ážáááŸá¬ Mcs
áá»áœááºá¯ááºááá¯á·ááẠcloud á¡ááœááºážááœáẠááá±á¬áá»áẠID ááŸáá·áº á¡áá¯á¶ážááŒá¯áá° id ááŸáá·áº áá°á á
áá¬ážááŸááºááᯠááŒááºáááºážáá«áááºá áá¯ááºáá±á¬ááºááŸá¯ááœáẠvm_turn_on
á
ááºáá»á¬ážáá²á០áá
áºáá¯ááᯠááœáá·áºáá»ááºáá«áááºá á€áá±áá¬ááœáẠáá¯áá¹áááá±áááẠá¡áááºážááẠááá¯ááŸá¯ááºááœá±ážáá«áááºá áá¯ááºáá¡á
ááœááºá á¡ááŒá¬ážáá¯ááºáá±á¬ááºáá»ááºáá¯á¶ážáá¯ááᯠáá±á«áºáááº- 1) áá»áœááºá¯ááºááá¯á·ááẠááá¯áááºáá
áºáá¯áááẠááá¯á¡ááºáááºá 2) hostname ááᯠMCS ááŸá á
ááºáá¡áááºááá¯á· ááŒá±á¬ááºážááẠááá¯á¡ááºáááºá 3) á€á
ááºá id ááᯠááá°áá«á ááá¯á·áá±á¬ááºá áá»áœááºá¯ááºááá¯á·ááẠááá¯á·á
áºáá
áºáá¯áá±á¬ááºážááá¯ááŒá®áž á€á
ááºááá¯ááœáá·áºááá¯ááºáá«á
ááá¯áááºááá°ááŒááºážá¡ááœáẠáá¯ááºáá±á¬ááºááŸá¯ááŸá¬ á¡á±á¬ááºáá«á¡ááá¯ááºážááŒá áºáááºá
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
Autoscaler á¡áááºáž
á€á¡áááºážááœáẠáááºáááºáá±á¬á·áá»á áºááá¯ááºááá¯ááºááŸáá·áº áááºááá¯ááºááá·áº áá¯ááºáá±á¬ááºáá»ááºáá»á¬áž áá«ááŸááááºá
á€á¡áááºážá¡ááœáẠáá¯ááºá¡ááá¯ááºážá¡á ááẠáá¯á¶ááá¹áá¬ááºááŒá áºáááº-
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
áááºááœáá·áºá¡ááœáẠá¡áááºážáá»á¬ážááᯠáááºáá¶áá«áááºá Ambari
О Mcs
á
áá±ážáá»á²á·ááŒááºážá¡ááœáẠááœáá·áºááŒá¯áá¬ážáá±á¬ node á
á¬áááºážá¡ááŒáẠnode configuration parameters- memory ááŸáá·áº cpu ááẠYARN ááŸá node ááá¯á· ááœá²áá±áá±ážáá¬ážáááºá á
á®áááºážáá»á¬ážááŒá
áºááá·áº q_ramá q_cpuá á¡ááœááºážááá¯ááºážáá±á¬áẠááŸá
áºáá¯áááºáž ááŸááá«áááºá áááºážááá¯á·ááá¯á¡áá¯á¶ážááŒá¯ááŒááºážááŒáá·áº áá»áœááºá¯ááºááá¯á·ááẠáááºááŸáá¡á
á¯ááá¯ááºáááºááááºááá¯ážáá»á¬ážááᯠááááºážáááºážáá«áááºá ááŒá®ážáá²á·áá±á¬ 2 áááá
áºá¡ááœááºáž áááááºáááºáž ááá¯ážáá¬áááºááᯠááœá±á·áá«áá ááá¯á·áá±á¬áẠá¡á
á¯á¡áá±ážááá¯á· +5 node áá±á«ááºážááá·áºááẠáá¯á¶ážááŒááºáááºá cluster underutilization á¡ááŒá±á¡áá±á¡ááœáẠá¡áá¬ážáá°áááºááŒá
áºáááºá
á¡áááºáá±á¬áºááŒáá« áá¯ááºááẠá
ááºááᯠá¡á
á¯á¡áá±ážá០áááºááŸá¬ážááŒá®áž cloud ááœáẠáááºááá·áºá
á±ááá·áº áá¯ááºáá±á¬ááºáá»ááºáá
áºáá¯á á¥ááá¬áá
áºáá¯ááŒá
áºáááºá ááááá±á¬á· áá»ááºááááºážááœáá·áºááŸááááºá YARN Nodemanager
ááá¯á·áá±á¬áẠmode ááá¯ááœáá·áºáááºá Maintenance
ááá¯á·áá±á¬áẠáá»áœááºá¯ááºááá¯á·ááẠá
ááºáá±á«áºááŸá áááºáá±á¬ááºááŸá¯á¡á¬ážáá¯á¶ážááᯠáááºááá·áºááŒá®áž cloud ááŸá virtual machine ááᯠááááºááá¯ááºáá«á
2. Script observer.py
ááá¯áá±áá¬á០ááá°áá¬áá¯ááº
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)
áááºážááœááºá á¡á
á¯á¡áá±ážáá
áœááºážáááºááŒáŸáá·áºáááºáááºá¡ááœáẠá¡ááŒá±á¡áá±áá»á¬ážááᯠáááºáá®ážáá¬ážááŒááºážááŸáá áááŸáááŸáá·áº á¡áááºáá¬ážááŸáááá·áºá
ááºáá»á¬áž ááŸááááŸáá áááºážááá¯á·á¡áááºá០áááºáá¶áá±á¬ááºááœááºáá±ážáá°á¡áááºááᯠááá°áá«á áááºážááᯠá¡á
á¯á¡áá±ážááá¯á· áá±á«ááºážááá·áºáᬠáá»áœááºá¯ááºááá¯á·áá¡ááœá²á·á Slack ááœáẠáááºážááŸáá·áºáááºáááºááá·áº áááºáá±á·áá»áºááᯠáá¯ááºááŒááºáá«á áááºážáá±á¬ááºááŸá
áááºáááºá cooldown_period
áá»áœááºá¯ááºááá¯á·ááẠá¡á
á¯á¡áá±ážá០áááºááá·áºá¡áá¬ááá¯áá»áŸ ááá·áºááŒááºáž ááá¯á·ááá¯áẠáááºááŸá¬ážááŒááºážáááŒá¯ááá·áºá¡áá«á áááºááᯠá
á±á¬áá·áºááŒáá·áºáá¯á¶áá¬ááŒá
áºáááºá áááºážááẠáááºááŒáááºááŒá®áž á¡áá±á¬ááºážáá¯á¶ážáááºáááºááá¯ážáá»á¬ážá á
ááºá¹ááŒá¶á¡ááœááºážááœáẠááŸááá±áá«áá áá»áœááºá¯ááºááá¯á· áááºáááºá
á±á¬áá·áºááŒáá·áºáá±áá«áááºá node áá
áºáá¯ááá¯á¶áá±á¬ááºáá«áá áá±á¬ááºáá
áºáá¯áááºááá·áºáá«á
áá»áœááºá¯ááºááá¯á·ááŸá±á·ááœáẠáááºáááºážá á¬áá áºáá¯ááá±á¬á¡áá«ááœááºá node áá áºáá¯ááẠáá¯á¶áá±á¬ááºáááºááá¯ááºááŒá±á¬ááºáž áá»áœááºá¯ááºááá¯á·áá±áá»á¬áááá¬ážááŒá®ážááŒá áºáá±á¬ááŒá±á¬áá·áº áá»áœááºá¯ááºááá¯á·ááẠá¡ááá²á· node á¡á¬ážáá¯á¶ážááᯠáá»ááºáá»ááºážá áááºááŒá®áž áááºáááºážá á¬ááŒá®ážáá¯á¶ážáááºá¡áá áááºážááá¯á·ááᯠáááºááŒáœá áœá¬áá¯ááºáá±á¬ááºáá«á ááŸá¯ááºááŸá¬ážááŸá¯á¡áá»áááºáá¶ááááºáá»á¬ážá á¬áááºážááᯠá¡áá¯á¶ážááŒá¯á áááºážááẠááŒá áºáá±á«áºáááºá
áá±á¬ááºáá»ááº
Autoscaler ááẠááá®ááá¬ááŒá áºáá±áá±á¬ á¡á á¯á¡áá±ážááá¯ááœáá·áºááŒááºážááᯠááœá±á·ááŒá¯á¶ááá±á¬á¡áá« ááá¯ááá á¹á áá»á¬ážá¡ááœáẠáá±á¬ááºážááœááºááŒá®áž á¡áááºááŒá±ááá·áºááŒá±ááŸááºážáá»ááºáá áºáá¯ááŒá áºáááºá áááºááẠá¡ááœááºá¡áááẠáááºáá¯ááºáááºááá¯ážá¡ááœáẠá¡ááá¯ááŸááá±á¬ á¡á á¯á¡áá±áž ááœá²á·á ááºážááŸá¯áá¯á¶á á¶ááᯠáá áºááŒáá¯ááºááẠáááŸáááŒá®áž áá áºáá»áááºáááºážááœáẠá€á¡á á¯á¡áá±ážááᯠáá±á«ááºážáá¯ááºááœá²áá±á ááºá¡ááœááºáž áááááºážáá¬ážáá² ááœá±áá¯ááºáááºáá¬á á±áááºá áá±á¬ááºážááŒá®á áá«ááœá±á¡á¬ážáá¯á¶ážá áááºážáá²á·áá«áááºááŸá¯áááŸááá² á¡ááá¯á¡áá»á±á¬ááºááŒá áºááœá¬ážáá¬á autoscaler ááá¯ááºááá¯ááºááẠá¡áá»áá¯á·áá±á¬ logic áá áºáá¯á¡á áá±ážáá¬ážáá¬ážáá±á¬ cluster manager API ááŸáá·áº cloud provider API á¡ááœáẠáá±á¬ááºážááá¯áá»ááºá¡á á¯á¡áá±ážáá áºáá¯áá»áŸáá¬ááŒá áºáááºá á á±á¬á á±á¬ááá±ážáá²á·áá²á·á¡ááá¯ááºáž Node ááœá±ááᯠá¡áá»áá¯ážá¡á á¬áž 3 áá»áá¯ážááœá²áᬠáá±áá»á¬ááŸááºáá¬ážááá¯á· ááá¯áá«áááºá áááºáá»á±á¬áºááœáŸááºáááá·áºáááºá
source: www.habr.com