เชจเชฎเชธเซเชคเซ! เช เชฎเซ เชฒเซเชเซเชจเซ เชฎเซเชเชพ เชกเซเชเชพ เชธเชพเชฅเซ เชเชพเชฎ เชเชฐเชตเชพเชจเซ เชคเชพเชฒเซเชฎ เชเชชเซเช เชเซเช. เชคเซเชจเชพ เชชเซเชคเชพเชจเชพ เชเซเชฒเชธเซเชเชฐ เชตเชฟเชจเชพ เชฎเซเชเชพ เชกเซเชเชพ เชชเชฐ เชถเซเชเซเชทเชฃเชฟเช เชชเซเชฐเซเชเซเชฐเชพเชฎเชจเซ เชเชฒเซเชชเชจเชพ เชเชฐเชตเซ เช เชถเชเซเชฏ เชเซ, เชเซเชจเชพ เชชเชฐ เชฌเชงเชพ เชธเชนเชญเชพเชเซเช เชธเชพเชฅเซ เชฎเชณเซเชจเซ เชเชพเชฎ เชเชฐเซ เชเซ. เช เชเชพเชฐเชฃเซเชธเชฐ, เช เชฎเชพเชฐเชพ เชชเซเชฐเซเชเซเชฐเชพเชฎเชฎเชพเช เชนเชเชฎเซเชถเชพ เชคเซ เชนเซเชฏ เชเซ ๐ เช เชฎเซ เชคเซเชจเชพ เชฐเซเชชเชฐเซเชเชพเชเชเชจ, เชเซเชฏเซเชจเชฟเชเช เช เชจเซ เชตเชนเซเชตเชเชฎเชพเช เชฐเซเชเชพเชฏเซเชฒเชพ เชเซเช, เช เชจเซ เชฒเซเชเซ เชธเซเชงเชพ เช เชคเซเชฏเชพเช MapReduce เชจเซเชเชฐเซเช เชถเชฐเซ เชเชฐเซ เชเซ เช เชจเซ เชธเซเชชเชพเชฐเซเชเชจเซ เชเชชเชฏเซเช เชเชฐเซ เชเซ.
เช เชชเซเชธเซเชเชฎเชพเช เช
เชฎเซ เชคเชฎเชจเซ เชเชฃเชพเชตเซเชถเซเช เชเซ เช
เชฎเซ เชเซเชฒเชพเชเชกเชจเซ เชเชชเชฏเซเช เชเชฐเซเชจเซ เช
เชฎเชพเชฐเซเช เชชเซเชคเชพเชจเซเช เชเชเซเชธเซเชเซเชฒเชฐ เชฒเชเซเชจเซ เช
เชธเชฎเชพเชจ เชเซเชฒเชธเซเชเชฐ เชฒเซเชกเชฟเชเชเชจเซ เชธเชฎเชธเซเชฏเชพเชจเซ เชเซเชตเซ เชฐเซเชคเซ เชนเชฒ เชเชฐเซ.
เชธเชฎเชธเซเชฏเชพ
เช เชฎเชพเชฐเชพ เชเซเชฒเชธเซเชเชฐเชจเซ เชเชชเชฏเซเช เชฒเชพเชเซเชทเชฃเชฟเช เชฎเซเชกเชฎเชพเช เชฅเชคเซ เชจเชฅเซ. เชจเชฟเชเชพเชฒ เช เชคเซเชฏเชเชค เช เชธเชฎเชพเชจ เชเซ. เชเชฆเชพเชนเชฐเชฃ เชคเชฐเซเชเซ, เชคเซเชฏเชพเช เชชเซเชฐเชพเชฏเซเชเชฟเช เชตเชฐเซเชเซ เชเซ, เชเซเชฏเชพเชฐเซ เชฌเชงเชพ 30 เชฒเซเชเซ เช เชจเซ เชเช เชถเชฟเชเซเชทเช เชเซเชฒเชธเซเชเชฐเชฎเชพเช เชเชพเชฏ เชเซ เช เชจเซ เชคเซเชจเซ เชเชชเชฏเซเช เชเชฐเชตเชพเชจเซเช เชถเชฐเซ เชเชฐเซ เชเซ. เช เชฅเชตเชพ เชซเชฐเซเชฅเซ, เชธเชฎเชฏเชฎเชฐเซเชฏเชพเชฆเชพ เชชเชนเซเชฒเชพเชจเชพ เชฆเชฟเชตเชธเซ เชนเซเชฏ เชเซ เชเซเชฏเชพเชฐเซ เชฒเซเชก เชฎเซเชเชพ เชชเซเชฐเชฎเชพเชฃเชฎเชพเช เชตเชงเซ เชเซ. เชฌเชพเชเซเชจเซ เชธเชฎเชฏ เชเซเชฒเชธเซเชเชฐ เช เชจเซเชกเชฐเชฒเซเชก เชฎเซเชกเชฎเชพเช เชเชพเชฐเซเชฏ เชเชฐเซ เชเซ.
เชธเซเชฒเซเชฏเซเชถเชจ #1 เช เชเช เชเซเชฒเชธเซเชเชฐ เชฐเชพเชเชตเชพเชจเซเช เชเซ เชเซ เชชเซเช เชฒเซเชกเชจเซ เชธเชพเชฎเชจเซ เชเชฐเชถเซ, เชชเชฐเชเชคเซ เชฌเชพเชเซเชจเชพ เชธเชฎเชฏเซ เชจเชฟเชทเซเชเซเชฐเชฟเชฏ เชฐเชนเซเชถเซ.
เชธเซเชฒเซเชฏเซเชถเชจ #2 เช เชเช เชจเชพเชจเซเช เชเซเชฒเชธเซเชเชฐ เชฐเชพเชเชตเซเช เชเซ, เชเซเชฎเชพเช เชคเชฎเซ เชตเชฐเซเชเซ เชชเชนเซเชฒเชพเช เช เชจเซ เชชเซเช เชฒเซเชก เชฆเชฐเชฎเชฟเชฏเชพเชจ เชฎเซเชจเซเชฏเซเช เชฒเซ เชจเซเชกเซเชธ เชเชฎเซเชฐเซ เชเซ.
เชธเซเชฒเซเชฏเซเชถเชจ #3 เช เชเช เชจเชพเชจเซเช เชเซเชฒเชธเซเชเชฐ เชฐเชพเชเชตเซเช เช เชจเซ เชเชเซเชธเซเชเซเชฒเชฐ เชฒเชเชตเชพเชจเซเช เชเซ เชเซ เชเซเชฒเชธเซเชเชฐเชจเชพ เชตเชฐเซเชคเชฎเชพเชจ เชฒเซเชกเชจเซ เชฎเซเชจเชฟเชเชฐ เชเชฐเชถเซ เช เชจเซ, เชตเชฟเชตเชฟเชง API เชจเซ เชเชชเชฏเซเช เชเชฐเซเชจเซ, เชเซเชฒเชธเซเชเชฐเชฎเชพเชเชฅเซ เชจเซเชกเซเชธ เชเชฎเซเชฐเซ เช เชจเซ เชฆเซเชฐ เชเชฐเชถเซ.
เช เชชเซเชธเซเชเชฎเชพเช เชเชชเชฃเซ เชเชเซเชฒ เชจเชเชฌเชฐ 3 เชตเชฟเชถเซ เชตเชพเชค เชเชฐเซเชถเซเช. เช เชเชเซเชธเซเชเซเชฒเชฐ เชเชเชคเชฐเชฟเช เชชเชฐเชฟเชฌเชณเซเชจเซ เชฌเชฆเชฒเซ เชฌเชพเชนเซเชฏ เชชเชฐเชฟเชฌเชณเซ เชชเชฐ เชเซเชฌ เช เชจเชฟเชฐเซเชญเชฐ เชเซ, เช เชจเซ เชชเซเชฐเชฆเชพเชคเชพเช เชเชฃเซเชตเชพเชฐ เชคเซ เชชเซเชฐเชฆเชพเชจ เชเชฐเชคเชพ เชจเชฅเซ. เช เชฎเซ Mail.ru เชเซเชฒเชพเชเชก เชธเซเชฒเซเชฏเซเชถเชจเซเชธ เชเซเชฒเชพเชเชก เชเชจเซเชซเซเชฐเชพเชธเซเชเซเชฐเชเซเชเชฐเชจเซ เชเชชเชฏเซเช เชเชฐเซเช เชเซเช เช เชจเซ MCS API เชจเซ เชเชชเชฏเซเช เชเชฐเซเชจเซ เชเชเซเชธเซเชเซเชฒเชฐ เชฒเชเซเช เชเซเช. เช เชจเซ เช เชฎเซ เชกเซเชเชพ เชธเชพเชฅเซ เชเซเชตเซ เชฐเซเชคเซ เชเชพเชฎ เชเชฐเชตเซเช เชคเซ เชถเซเชเชตเชคเชพ เชนเซเชตเชพเชฅเซ, เช เชฎเซ เชคเซ เชฌเชคเชพเชตเชตเชพเชจเซเช เชจเชเซเชเซ เชเชฐเซเชฏเซเช เชเซ เชคเชฎเซ เชคเชฎเชพเชฐเชพ เชชเซเชคเชพเชจเชพ เชนเซเชคเซเช เชฎเชพเชเซ เชธเชฎเชพเชจ เชเชเซเชธเซเชเซเชฒเชฐ เชเซเชตเซ เชฐเซเชคเซ เชฒเชเซ เชถเชเซ เชเซ เช เชจเซ เชคเซเชจเซ เชเชชเชฏเซเช เชคเชฎเชพเชฐเชพ เชเซเชฒเชพเชเชก เชธเชพเชฅเซ เชเชฐเซ เชถเชเซ เชเซ.
เชชเซเชฐเซเชตเชเชฐเซเชฐเซเชฏเชพเชคเซ
เชชเซเชฐเชฅเชฎ, เชคเชฎเชพเชฐเซ เชชเชพเชธเซ Hadoop เชเซเชฒเชธเซเชเชฐ เชนเซเชตเซเช เชเชตเชถเซเชฏเช เชเซ. เชเชฆเชพเชนเชฐเชฃ เชคเชฐเซเชเซ, เช เชฎเซ HDP เชตเชฟเชคเชฐเชฃเชจเซ เชเชชเชฏเซเช เชเชฐเซเช เชเซเช.
เชคเชฎเชพเชฐเชพ เชจเซเชกเซเชธ เชเชกเชชเชฅเซ เชเชฎเซเชฐเชตเชพ เช เชจเซ เชฆเซเชฐ เชเชฐเชตเชพ เชฎเชพเชเซ, เชคเชฎเชพเชฐเซ เชชเชพเชธเซ เชจเซเชกเซเชธ เชตเชเซเชเซ เชญเซเชฎเชฟเชเชพเชเชจเซเช เชเซเชเซเชเชธ เชตเชฟเชคเชฐเชฃ เชนเซเชตเซเช เชเชตเชถเซเชฏเช เชเซ.
- เชฎเชพเชธเซเชเชฐ เชจเซเชก. เช เซเช เชเซ, เชเชพเชธ เชเชฐเซเชจเซ เชเชเชเชชเชฃ เชธเชฎเชเชพเชตเชตเชพเชจเซ เชเชฐเซเชฐ เชจเชฅเซ: เชเซเชฒเชธเซเชเชฐเชจเซ เชฎเซเชเซเชฏ เชจเซเชก, เชเซเชจเชพ เชชเชฐ, เชเชฆเชพเชนเชฐเชฃ เชคเชฐเซเชเซ, เชเซ เชคเชฎเซ เชเชจเซเชเชฐเซเชเซเชเชฟเชต เชฎเซเชกเชจเซ เชเชชเชฏเซเช เชเชฐเซ เชเซ, เชคเซ เชธเซเชชเชพเชฐเซเช เชกเซเชฐเชพเชเชตเชฐ เชถเชฐเซ เชฅเชพเชฏ เชเซ.
- เชคเชพเชฐเซเช เชจเซเชก. เช เช เชจเซเชก เชเซ เชเซ เชเซเชจเชพ เชชเชฐ เชคเชฎเซ HDFS เชชเชฐ เชกเซเชเชพ เชธเซเชเซเชฐ เชเชฐเซ เชเซ เช เชจเซ เชเซเชฏเชพเช เชเชฃเชคเชฐเซเช เชฅเชพเชฏ เชเซ.
- เชเชฎเซเชชเซเชฏเซเชเชฟเชเช เชจเซเชก. เช เชเช เชจเซเชก เชเซ เชเซเชฏเชพเช เชคเชฎเซ HDFS เชชเชฐ เชเชเชเชชเชฃ เชธเชเชเซเชฐเชนเชฟเชค เชเชฐเชคเชพ เชจเชฅเซ, เชชเชฐเชเชคเซ เชเซเชฏเชพเช เชเชฃเชคเชฐเซเช เชฅเชพเชฏ เชเซ.
เชฎเชนเชคเซเชตเชจเซ เชฎเซเชฆเซเชฆเซ. เชคเซเชฐเซเชเชพ เชชเซเชฐเชเชพเชฐเชจเชพ เชจเซเชกเซเชธเชจเซ เชเชพเชฐเชฃเซ เชเชเซเชธเซเชเซเชฒเชฟเชเช เชฅเชถเซ. เชเซ เชคเชฎเซ เชฌเซเชเชพ เชชเซเชฐเชเชพเชฐเชจเชพ เชจเซเชกเซเชธ เชฒเซเชตเชพเชจเซเช เช เชจเซ เชเชฎเซเชฐเชตเชพเชจเซเช เชถเชฐเซ เชเชฐเซ เชเซ, เชคเซ เชชเซเชฐเชคเชฟเชธเชพเชฆเชจเซ เชเชกเชช เชเชฃเซ เชเชเซ เชนเชถเซ - เชกเชฟเชเชฎเชฟเชถเชจเชฟเชเช เช เชจเซ เชฐเชฟเชเชฎเชฟเชเชฟเชเช เชคเชฎเชพเชฐเชพ เชเซเชฒเชธเซเชเชฐ เชชเชฐ เชเชฒเชพเชเซ เชฒเซเชถเซ. เช, เช เชฒเชฌเชคเซเชค, เชคเชฎเซ เชเชเซเชธเซเชเซเชฒเชฟเชเชเชฅเซ เช เชชเซเชเซเชทเชพ เชฐเชพเชเชคเชพ เชจเชฅเซ. เชเชเชฒเซ เชเซ, เช เชฎเซ เชชเซเชฐเชฅเชฎ เช เชจเซ เชฌเซเชเชพ เชชเซเชฐเชเชพเชฐเชจเชพเช เชเชพเชเช เซเชจเซ เชธเซเชชเชฐเซเชถเชคเชพ เชจเชฅเซ. เชคเซเช เชจเซเชฏเซเชจเชคเชฎ เชตเซเชฏเชตเชนเชพเชฐเซ เชเซเชฒเชธเซเชเชฐเชจเซเช เชชเซเชฐเชคเชฟเชจเชฟเชงเชฟเชคเซเชต เชเชฐเชถเซ เชเซ เชชเซเชฐเซเชเซเชฐเชพเชฎเชจเชพ เชธเชฎเชเซเชฐ เชธเชฎเชฏเชเชพเชณเชพ เชฆเชฐเชฎเชฟเชฏเชพเชจ เช เชธเซเชคเชฟเชคเซเชตเชฎเชพเช เชฐเชนเซเชถเซ.
เชคเซเชฅเซ, เช
เชฎเชพเชฐเซเช เชเชเซเชธเซเชเซเชฒเชฐ Python 3 เชฎเชพเช เชฒเชเชพเชฏเซเชฒเซเช เชเซ, เชเซเชฒเชธเซเชเชฐ เชธเซเชตเชพเชเชจเซเช เชธเชเชเชพเชฒเชจ เชเชฐเชตเชพ เชฎเชพเชเซ Ambari API เชจเซ เชเชชเชฏเซเช เชเชฐเซ เชเซ,
เชธเซเชฒเซเชฏเซเชถเชจ เชเชฐเซเชเชฟเชเซเชเซเชเชฐ
- เชฎเซเชกเซเชฏเซเชฒ
autoscaler.py
. เชคเซเชฎเชพเช เชคเซเชฐเชฃ เชตเชฐเซเชเซ เชเซ: 1) เช เชเชฌเชฐเซ เชธเชพเชฅเซ เชเชพเชฎ เชเชฐเชตเชพ เชฎเชพเชเซเชจเชพ เชเชพเชฐเซเชฏเซ, 2) MCS เชธเชพเชฅเซ เชเชพเชฎ เชเชฐเชตเชพ เชฎเชพเชเซเชจเชพ เชเชพเชฐเซเชฏเซ, 3) เชเชเซเชธเซเชเซเชฒเชฐเชจเชพ เชคเชฐเซเช เชธเชพเชฅเซ เชธเซเชงเชพ เชธเชเชฌเชเชงเชฟเชค เชเชพเชฐเซเชฏเซ. - เชธเซเชเซเชฐเชฟเชชเซเช
observer.py
. เช เชจเชฟเชตเชพเชฐเซเชฏเชชเชฃเซ เชคเซ เชตเชฟเชตเชฟเชง เชจเชฟเชฏเชฎเซ เชงเชฐเชพเชตเซ เชเซ: เชเซเชฏเชพเชฐเซ เช เชจเซ เชเช เชเซเชทเชฃเซ เชเชเซเชธเซเชเซเชฒเชฐ เชซเชเชเซเชถเชจเชจเซ เชเซเชฒ เชเชฐเชตเซ. - เชฐเซเชชเชฐเซเชเชพเชเชเชจ เชซเชพเชเชฒ
config.py
. เชคเซเชฎเชพเช, เชเชฆเชพเชนเชฐเชฃ เชคเชฐเซเชเซ, เชเชเซเชธเซเชเซเชฒเชฟเชเช เชฎเชพเชเซ เชฎเชพเชจเซเชฏ เชจเซเชกเซเชธเชจเซ เชธเซเชเชฟ เช เชจเซ เช เชจเซเชฏ เชชเชฐเชฟเชฎเชพเชฃเซ เชเซ เชเซ เช เชธเชฐ เชเชฐเซ เชเซ, เชเชฆเชพเชนเชฐเชฃ เชคเชฐเซเชเซ, เชจเชตเซ เชจเซเชก เชเชฎเซเชฐเชตเชพเชจเซ เชเซเชทเชฃเชฅเซ เชเซเชเชฒเซ เชธเชฎเชฏ เชฐเชพเชน เชเซเชตเซ. เชตเชฐเซเชเซ เชถเชฐเซ เชเชฐเชตเชพ เชฎเชพเชเซ เชเชพเชเชฎเชธเซเชเซเชฎเซเชชเซเชธ เชชเชฃ เชเซ, เชเซเชฅเซ เชตเชฐเซเช เชชเชนเซเชฒเชพเช เชฎเชนเชคเซเชคเชฎ เช เชจเซเชฎเชคเชฟ เชชเซเชฐเชพเชชเซเชค เชเซเชฒเชธเซเชเชฐ เชเซเช เชตเชฃเซ เชถเชฐเซ เชเชฐเชตเชพเชฎเชพเช เชเชตเซ.
เชเชพเชฒเซ เชนเชตเซ เชชเซเชฐเชฅเชฎ เชฌเซ เชซเชพเชเชฒเซเชจเซ เช เชเชฆเชฐเชจเชพ เชเซเชกเชจเชพ เชเซเชเชกเชพเช เชเซเชเช.
1. Autoscaler.py เชฎเซเชกเซเชฏเซเชฒ
เช เชเชฌเชฐเซ เชตเชฐเซเช
เชตเชฐเซเช เชธเชฎเชพเชตเชฟเชทเซเช เชเซเชกเชจเซ เชญเชพเช เช เชเซเชตเซ เชฆเซเชเชพเชฏ เชเซ 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
เชเชชเชฐ, เชเชฆเชพเชนเชฐเชฃ เชคเชฐเซเชเซ, เชคเชฎเซ เชเชพเชฐเซเชฏเชจเชพ เช
เชฎเชฒเซเชเชฐเชฃเชจเซ เชเซเช เชถเชเซ เชเซ stop_all_services
, เชเซ เชเชเซเชเชฟเชค เชเซเชฒเชธเซเชเชฐ เชจเซเชก เชชเชฐ เชคเชฎเชพเชฎ เชธเซเชตเชพเชเชจเซ เช
เชเชเชพเชตเซ เชเซ.
เชตเชฐเซเชเชจเชพ เชชเซเชฐเชตเซเชถเชฆเซเชตเชพเชฐ เชชเชฐ Ambari
เชคเชฎเซ เชชเชพเชธ เชเชฐเซ:
ambari_url
, เชเชฆเชพเชนเชฐเชฃ เชคเชฐเซเชเซ, เชเซเชฎ'http://localhost:8080/api/v1/clusters/'
,cluster_name
- เช เชเชฌเชฐเซเชฎเชพเช เชคเชฎเชพเชฐเชพ เชเซเชฒเชธเซเชเชฐเชจเซเช เชจเชพเชฎ,headers = {'X-Requested-By': 'ambari'}
- เช
เชจเซ เช
เชเชฆเชฐ
auth
เช เชเชฌเชฐเซ เชฎเชพเชเซ เชคเชฎเชพเชฐเซเช เชฒเซเชเชฟเชจ เช เชจเซ เชชเชพเชธเชตเชฐเซเชก เช เชฐเชนเซเชฏเซ:auth = ('login', 'password')
.
เชซเชเชเซเชถเชจ เชชเซเชคเซ REST API เชฆเซเชตเชพเชฐเชพ เช
เชเชฌเชฐเซ เชชเชฐเชจเชพ เชฌเซ เชเซเชฒเซเชธ เชธเชฟเชตเชพเชฏ เชฌเซเชเซเช เชเชเช เชจเชฅเซ. เชคเชพเชฐเซเชเชฟเช เชฆเซเชทเซเชเชฟเชเซเชฃเชฅเซ, เช
เชฎเซ เชชเซเชฐเชฅเชฎ เชจเซเชก เชชเชฐ เชเชพเชฒเซ เชฐเชนเซเชฒเซ เชธเซเชตเชพเชเชจเซ เชธเซเชเชฟ เชชเซเชฐเชพเชชเซเชค เชเชฐเซเช เชเซเช, เช
เชจเซ เชชเชเซ เชเชชเซเชฒ เชเซเชฒเชธเซเชเชฐ เชชเชฐ, เชเชชเซเชฒ เชจเซเชก เชชเชฐ, เชธเซเชตเชพเชเชจเซ เชธเซเชเชฟเชฎเชพเชเชฅเซ เชฐเชพเชเซเชฏเชฎเชพเช เชธเซเชฅเชพเชจเชพเชเชคเชฐเชฟเชค เชเชฐเชตเชพ เชฎเชพเชเซ เชเชนเซเช เชเซเช. INSTALLED
. เชคเชฎเชพเชฎ เชธเซเชตเชพเช เชถเชฐเซ เชเชฐเชตเชพ, เชฐเชพเชเซเชฏเชฎเชพเช เชจเซเชกเซเชธ เชเซเชฐเชพเชจเซเชธเชซเชฐ เชเชฐเชตเชพ เชฎเชพเชเซเชจเชพ เชเชพเชฐเซเชฏเซ 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
เช
เชฎเซ เชเซเชฒเชพเชเชกเชจเซ เช
เชเชฆเชฐ เชชเซเชฐเซเชเซเชเซเช เชเชเชกเซ เช
เชจเซ เชฏเซเชเชฐ เชเชเชกเซ เชคเซเชฎเช เชคเซเชจเซ เชชเชพเชธเชตเชฐเซเชก เชชเชพเชธ เชเชฐเซเช เชเซเช. เชเชพเชฐเซเชฏเชฎเชพเช vm_turn_on
เช
เชฎเซ เชเช เชฎเชถเซเชจ เชเชพเชฒเซ เชเชฐเชตเชพ เชฎเชพเชเชเซเช เชเซเช. เช
เชนเซเชเชจเซ เชคเชฐเซเช เชฅเซเชกเซ เชตเชงเซ เชเชเชฟเชฒ เชเซ. เชเซเชกเชจเซ เชถเชฐเซเชเชคเชฎเชพเช, เช
เชจเซเชฏ เชคเซเชฐเชฃ เชซเชเชเซเชถเชจ เชเชนเซเชตเชพเชฎเชพเช เชเชตเซ เชเซ: 1) เชเชชเชฃเซ เชเซเชเชจ เชฎเซเชณเชตเชตเชพเชจเซ เชเชฐเซเชฐ เชเซ, 2) เชเชชเชฃเซ เชนเซเชธเซเชเชจเซเชฎเชจเซ MCS เชฎเชพเช เชฎเชถเซเชจเชจเชพ เชจเชพเชฎเชฎเชพเช เชเชจเซเชตเชฐเซเช เชเชฐเชตเชพเชจเซ เชเชฐเซเชฐ เชเซ, 3) เช เชฎเชถเซเชจเชจเซ เชเชเชกเซ เชฎเซเชณเชตเซ. เชเชเชณ, เช
เชฎเซ เชเชพเชฒเซ เชชเซเชธเซเช เชตเชฟเชจเชเชคเซ เชเชฐเซเช เชเซเช เช
เชจเซ เช เชฎเชถเซเชจเชจเซ เชฒเซเชจเซเช เชเชฐเซเช เชเซเช.
เชเซเชเชจ เชฎเซเชณเชตเชตเชพเชจเซเช เชเชพเชฐเซเชฏ เชเชจเชพ เชเซเชตเซเช เชฆเซเชเชพเชฏ เชเซ:
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
เชเชเซเชธเซเชเซเชฒเชฐ เชตเชฐเซเช
เช เชตเชฐเซเชเชฎเชพเช เชเชชเชฐเซเชเชฟเชเช เชคเชฐเซเช เชธเชพเชฅเซ เชธเชเชฌเชเชงเชฟเชค เชเชพเชฐเซเชฏเซ เชเซ.
เช เชตเชฐเซเช เชฎเชพเชเซ เชเซเชกเชจเซ เชญเชพเช เชเชจเชพ เชเซเชตเซ เชฆเซเชเชพเชฏ เชเซ:
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
, เชจเซเชกเซเชธเชจเซ เชธเซเชเชฟ เชเซ เชเซ เชธเซเชเซเชฒเชฟเชเช เชฎเชพเชเซ เชฎเชพเชจเซเชฏ เชเซ, เชคเซเชฎเช เชจเซเชก เชฐเซเชชเชฐเซเชเชพเชเชเชจ เชชเชฐเชฟเชฎเชพเชฃเซ: เชฎเซเชฎเชฐเซ เช
เชจเซ เชธเซเชชเซเชฏเซ เชฏเชพเชฐเซเชจเชฎเชพเช เชจเซเชกเชจเซ เชซเชพเชณเชตเชตเชพเชฎเชพเช เชเชตเซ เชเซ. เชคเซเชฏเชพเช เชชเชฃ 2 เชเชเชคเชฐเชฟเช เชชเชฐเชฟเชฎเชพเชฃเซ q_ram, q_cpu เชเซ, เชเซ เชเชคเชพเชฐ เชเซ. เชคเซเชจเซ เชเชชเชฏเซเช เชเชฐเซเชจเซ, เช
เชฎเซ เชตเชฐเซเชคเชฎเชพเชจ เชเซเชฒเชธเซเชเชฐ เชฒเซเชกเชจเชพ เชฎเซเชฒเซเชฏเซเชจเซ เชธเชเชเซเชฐเชนเชฟเชค เชเชฐเซเช เชเซเช. เชเซ เชเชชเชฃเซ เชเซเชเช เชเซ เชเซเชฒเซเชฒเซ 5 เชฎเชฟเชจเชฟเชเชฎเชพเช เชฒเซเชกเชฎเชพเช เชธเชคเชค เชตเชงเชพเชฐเซ เชฅเชฏเซ เชเซ, เชคเซ เช
เชฎเซ เชจเชเซเชเซ เชเชฐเซเช เชเซเช เชเซ เชเชชเชฃเซ เชเซเชฒเชธเซเชเชฐเชฎเชพเช +1 เชจเซเชก เชเชฎเซเชฐเชตเชพเชจเซ เชเชฐเซเชฐ เชเซ. เชเซเชฒเชธเซเชเชฐ เช
เชเชกเชฐเชฏเซเชเชฟเชฒเชพเชเชเซเชถเชจ เชธเซเชเซเช เชฎเชพเชเซ เชชเชฃ เชเชตเซเช เช เชเซ.
เชเชชเชฐเชจเซ เชเซเชก เช เชซเชเชเซเชถเชจเชจเซเช เชเชฆเชพเชนเชฐเชฃ เชเซ เชเซ เชเซเชฒเชธเซเชเชฐเชฎเชพเชเชฅเซ เชฎเชถเซเชจเชจเซ เชฆเซเชฐ เชเชฐเซ เชเซ เช
เชจเซ เชคเซเชจเซ เชเซเชฒเชพเชเชกเชฎเชพเช เชฐเซเชเซ เชเซ. เชชเซเชฐเชฅเชฎ เชคเซเชฏเชพเช เชกเชฟเชเชฎเชฟเชถเชจเชฟเชเช เชเซ YARN Nodemanager
, เชชเชเซ เชฎเซเชก เชเชพเชฒเซ เชฅเชพเชฏ เชเซ Maintenance
, เชชเชเซ เช
เชฎเซ เชฎเชถเซเชจ เชชเชฐเชจเซ เชฌเชงเซ เชธเซเชตเชพเช เชฌเชเชง เชเชฐเซเช เชเซเช เช
เชจเซ เชเซเชฒเชพเชเชกเชฎเชพเช เชตเชฐเซเชเซเชฏเซเช
เชฒ เชฎเชถเซเชจ เชฌเชเชง เชเชฐเซเช เชเซเช.
2. เชธเซเชเซเชฐเชฟเชชเซเช เชจเชฟเชฐเซเชเซเชทเช.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)
เชคเซเชฎเชพเช, เช
เชฎเซ เชคเชชเชพเชธ เชเชฐเซเช เชเซเช เชเซ เชเซเชฒเชธเซเชเชฐเชจเซ เชเซเชทเชฎเชคเชพ เชตเชงเชพเชฐเชตเชพ เชฎเชพเชเซ เชชเชฐเชฟเชธเซเชฅเชฟเชคเชฟเช เชตเชฟเชเชธเชฟเชค เชฅเช เชเซ เชเซ เชเซเชฎ เช
เชจเซ เช
เชจเชพเชฎเชคเชฎเชพเช เชเซเช เชฎเชถเซเชจ เชเซ เชเซ เชเซเชฎ, เชคเซเชฎเชพเชเชฅเซ เชเชเชจเซเช เชนเซเชธเซเชเชจเชพเชฎ เชฎเซเชณเชตเซเช เชเซเช, เชคเซเชจเซ เชเซเชฒเชธเซเชเชฐเชฎเชพเช เชเชฎเซเชฐเซเช เชเซเช เช
เชจเซ เช
เชฎเชพเชฐเซ เชเซเชฎเชจเชพ เชธเซเชฒเซเช เชชเชฐ เชคเซเชจเชพ เชตเชฟเชถเซ เชธเชเชฆเซเชถ เชชเซเชฐเชเชพเชถเชฟเชค เชเชฐเซเช เชเซเช. เชเซ เชชเชเซ เชคเซ เชถเชฐเซ เชฅเชพเชฏ เชเซ cooldown_period
, เชเซเชฏเชพเชฐเซ เช
เชฎเซ เชเซเชฒเชธเซเชเชฐเชฎเชพเชเชฅเซ เชเชเชเชชเชฃ เชเชฎเซเชฐเชคเชพ เชจเชฅเซ เช
เชฅเชตเชพ เชฆเซเชฐ เชเชฐเชคเชพ เชจเชฅเซ, เชชเชฐเชเชคเซ เชซเชเซเชค เชฒเซเชกเชจเซเช เชจเชฟเชฐเซเชเซเชทเชฃ เชเชฐเซเช เชเซเช. เชเซ เชคเซ เชธเซเชฅเชฟเชฐ เชฅเช เชเชฏเซเช เชเซ เช
เชจเซ เชถเซเชฐเซเชทเซเช เชฒเซเชก เชฎเซเชฒเซเชฏเซเชจเชพ เชเซเชฐเชฟเชกเซเชฐเชฎเชพเช เชเซ, เชคเซ เช
เชฎเซ เชซเชเซเชค เชฆเซเชเชฐเซเช เชเชพเชฒเซ เชฐเชพเชเซเช เชเซเช. เชเซ เชเช เชจเซเชก เชชเซเชฐเชคเซ เชจ เชนเชคเซ, เชคเซ เช
เชฎเซ เชฌเซเชเซ เชเชฎเซเชฐเซ.
เชเชตเชพ เชเชฟเชธเซเชธเชพเช เชฎเชพเชเซ เชเซเชฏเชพเชฐเซ เช เชฎเชพเชฐเซ เชชเชพเชธเซ เชชเชพเช เชเชเชณ เชนเซเชฏ, เช เชฎเซ เชชเชนเซเชฒเชพเชฅเซ เช เชเชพเชคเชฐเซเชชเซเชฐเซเชตเช เชเชพเชฃเซเช เชเซเช เชเซ เชเช เชจเซเชก เชชเซเชฐเชคเซ เชจเชฅเซ, เชคเซเชฅเซ เช เชฎเซ เชคเชฐเชค เช เชคเชฎเชพเชฎ เชฎเชซเชค เชเชพเชเช เซ เชถเชฐเซ เชเชฐเซเช เชเซเช เช เชจเซ เชชเชพเช เชจเชพ เช เชเชค เชธเซเชงเซ เชคเซเชฎเชจเซ เชธเชเซเชฐเชฟเชฏ เชฐเชพเชเซเช เชเซเช. เช เชชเซเชฐเชตเซเชคเซเชคเชฟ เชเชพเชเชฎเชธเซเชเซเชฎเซเชชเซเชธเชจเซ เชธเซเชเชฟเชจเซ เชเชชเชฏเซเช เชเชฐเซเชจเซ เชฅเชพเชฏ เชเซ.
เชจเชฟเชทเซเชเชฐเซเชท
เชเซเชฏเชพเชฐเซ เชคเชฎเซ เช เชธเชฎเชพเชจ เชเซเชฒเชธเซเชเชฐ เชฒเซเชกเชฟเชเชเชจเซ เช เชจเซเชญเชต เชเชฐเซ เชเซ เชคเซเชฏเชพเชฐเซ เชคเซ เชเซเชธ เชฎเชพเชเซ เชเชเซเชธเซเชเซเชฒเชฐ เช เชธเชพเชฐเซ เช เชจเซ เช เชจเซเชเซเชณ เชเชเซเชฒ เชเซ. เชคเชฎเซ เชเชเชธเชพเชฅเซ เชชเซเช เชฒเซเชก เชฎเชพเชเซ เชเชเซเชเชฟเชค เชเซเชฒเชธเซเชเชฐ เชเซเช เชตเชฃเซ เชนเชพเชเชธเชฒ เชเชฐเซ เชเซ เช เชจเซ เชคเซ เช เชธเชฎเชฏเซ เช เชเซเชฒเชธเซเชเชฐเชจเซ เช เชเชกเชฐเชฒเซเชก เชฆเชฐเชฎเชฟเชฏเชพเชจ เชฐเชพเชเชถเซ เชจเชนเซเช, เชชเซเชธเชพเชจเซ เชฌเชเชค เชเชฐเซ. เชธเชพเชฐเซเช, เชตเชคเซเชคเชพ เช เชฌเชงเซเช เชคเชฎเชพเชฐเซ เชธเชนเชญเชพเชเชฟเชคเชพ เชตเชฟเชจเชพ เชเชชเชฎเซเชณเซ เชฅเชพเชฏ เชเซ. เชเชเซเชธเซเชเซเชฒเชฐ เชชเซเชคเซ เชเซเชฒเชธเซเชเชฐ เชฎเซเชจเซเชเชฐ API เช เชจเซ เชเซเชฒเชพเชเชก เชชเซเชฐเชฆเชพเชคเชพ API เชจเซ เชตเชฟเชจเชเชคเซเชเชจเชพ เชธเชฎเซเชน เชธเชฟเชตเชพเชฏ เชฌเซเชเซเช เชเชเช เชจเชฅเซ, เชเซ เชเซเชเซเชเชธ เชคเชฐเซเช เช เชจเซเชธเชพเชฐ เชฒเชเชพเชฏเซเชฒ เชเซ. เชคเชฎเชพเชฐเซ เชเซ เชเซเชเซเชเชธเชชเชฃเซ เชฏเชพเชฆ เชฐเชพเชเชตเชพเชจเซ เชเชฐเซเชฐ เชเซ เชคเซ เชเชพเชเช เซเชจเซเช 3 เชชเซเชฐเชเชพเชฐเซเชฎเชพเช เชตเชฟเชญเชพเชเชจ เชเซ, เชเซเชฎ เชเชชเชฃเซ เช เชเชพเช เชฒเชเซเชฏเซเช เชนเชคเซเช. เช เชจเซ เชคเชฎเซ เชเซเชถ เชฅเชถเซ.
เชธเซเชฐเซเชธ: www.habr.com