เจธเจค เจธเฉเจฐเฉ เจ เจเจพเจฒ! เจ เจธเฉเจ เจฒเฉเจเจพเจ เจจเฉเฉฐ เจตเฉฑเจกเฉ เจกเฉเจเจพ เจจเจพเจฒ เจเฉฐเจฎ เจเจฐเจจ เจฒเจ เจธเจฟเจเจฒเจพเจ เจฆเจฟเฉฐเจฆเฉ เจนเจพเจเฅค เจเจธ เจฆเฉ เจเจชเจฃเฉ เจเจฒเฉฑเจธเจเจฐ เจคเฉเจ เจฌเจฟเจจเจพเจ เจตเฉฑเจกเฉ เจกเฉเจเจพ 'เจคเฉ เจตเจฟเจฆเจฟเจ เจ เจชเฉเจฐเฉเจเจฐเจพเจฎ เจฆเฉ เจเจฒเจชเจจเจพ เจเจฐเจจเจพ เจ เจธเฉฐเจญเจต เจนเฉ, เจเจฟเจธ 'เจคเฉ เจธเจพเจฐเฉ เจญเจพเจเฉเจฆเจพเจฐ เจเจเฉฑเจ เฉ เจเฉฐเจฎ เจเจฐเจฆเฉ เจนเจจ. เจเจธ เจเจพเจฐเจจ เจเจฐเจเฉ, เจธเจพเจกเฉ เจชเฉเจฐเฉเจเจฐเจพเจฎ เจตเจฟเฉฑเจ เจนเจฎเฉเจธเจผเจพ เจเจน เจนเฉเฉฐเจฆเจพ เจนเฉ ๐ เจ เจธเฉเจ เจเจธเจฆเฉ เจธเฉฐเจฐเจเจจเจพ, เจเจฟเจเจจเจฟเฉฐเจ เจ เจคเฉ เจชเฉเจฐเจธเจผเจพเจธเจจ เจตเจฟเฉฑเจ เจฐเฉเฉฑเจเฉ เจนเฉเจ เจนเจพเจ, เจ เจคเฉ เจฒเฉเจ เจธเจฟเฉฑเจงเฉ MapReduce เจจเฉเจเจฐเฉเจเจ เจจเฉเฉฐ เจเฉฑเจฅเฉ เจฒเจพเจเจ เจเจฐเจฆเฉ เจนเจจ เจ เจคเฉ เจธเจชเจพเจฐเจ เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจฆเฉ เจนเจจเฅค
เจเจธ เจชเฉเจธเจ เจตเจฟเฉฑเจ เจ
เจธเฉเจ เจคเฉเจนเจพเจจเฉเฉฐ เจฆเฉฑเจธเจพเจเจเฉ เจเจฟ เจ
เจธเฉเจ เจเจฒเจพเจเจก เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจเฉ เจเจชเจฃเจพ เจเจเฉเจธเจเฉเจฒเจฐ เจฒเจฟเจ เจเฉ เจ
เจธเจฎเจพเจจ เจเจฒเฉฑเจธเจเจฐ เจฒเฉเจกเจฟเฉฐเจ เจฆเฉ เจธเจฎเฉฑเจธเจฟเจ เจจเฉเฉฐ เจเจฟเจตเฉเจ เจนเฉฑเจฒ เจเฉเจคเจพ เจนเฉเฅค
เจธเจฎเฉฑเจธเจฟเจ
เจธเจพเจกเจพ เจเจฒเฉฑเจธเจเจฐ เจเฉฑเจ เจเจฎ เจฎเฉเจก เจตเจฟเฉฑเจ เจจเจนเฉเจ เจตเจฐเจคเจฟเจ เจเจพเจเจฆเจพ เจนเฉเฅค เจจเจฟเจชเจเจพเจฐเจพ เจฌเจนเฉเจค เจ เจธเจฎเจพเจจ เจนเฉเฅค เจเจฆเจพเจนเจฐเจจ เจฒเจ, เจชเฉเจฐเฉเจเจเฉเจเจฒ เจเจฒเจพเจธเจพเจ เจนเฉเฉฐเจฆเฉเจเจ เจนเจจ, เจเจฆเฉเจ เจธเจพเจฐเฉ 30 เจฒเฉเจ เจ เจคเฉ เจเฉฑเจ เจ เจงเจฟเจเจชเจ เจเจฒเฉฑเจธเจเจฐ เจตเจฟเฉฑเจ เจเจพเจเจฆเฉ เจนเจจ เจ เจคเฉ เจเจธเจจเฉเฉฐ เจตเจฐเจคเจฃเจพ เจธเจผเฉเจฐเฉ เจเจฐเจฆเฉ เจนเจจเฅค เจเจพเจ เจฆเฉเจฌเจพเจฐเจพ, เจกเฉเฉฑเจกเจฒเจพเจเจจ เจคเฉเจ เจชเจนเจฟเจฒเจพเจ เจฆเฉ เจฆเจฟเจจ เจนเฉเฉฐเจฆเฉ เจนเจจ เจเจฆเฉเจ เจฒเฉเจก เจฌเจนเฉเจค เจตเจง เจเจพเจเจฆเจพ เจนเฉ. เจฌเจพเจเฉ เจธเจฎเจพเจ เจเจฒเฉฑเจธเจเจฐ เจ เฉฐเจกเจฐเจฒเฉเจก เจฎเฉเจก เจตเจฟเฉฑเจ เจเฉฐเจฎ เจเจฐเจฆเจพ เจนเฉเฅค
เจนเฉฑเจฒ #1 เจเฉฑเจ เจเจฒเฉฑเจธเจเจฐ เจฐเฉฑเจเจฃเจพ เจนเฉ เจเฉ เจชเฉเจ เจฒเฉเจก เจฆเจพ เจธเจพเจฎเฉเจนเจฃเจพ เจเจฐเฉเจเจพ, เจชเจฐ เจฌเจพเจเฉ เจธเจฎเฉเจ เจตเจฟเฉฑเจ เจตเจฟเจนเจฒเจพ เจฐเจนเฉเจเจพเฅค
เจนเฉฑเจฒ #2 เจเฉฑเจ เจเฉเจเจพ เจเจฒเฉฑเจธเจเจฐ เจฐเฉฑเจเจฃเจพ เจนเฉ, เจเจฟเจธ เจตเจฟเฉฑเจ เจคเฉเจธเฉเจ เจเจฒเจพเจธเจพเจ เจคเฉเจ เจชเจนเจฟเจฒเจพเจ เจ เจคเฉ เจชเฉเจ เจฒเฉเจก เจฆเฉเจฐเจพเจจ เจนเฉฑเจฅเฉเจ เจจเฉเจก เจเฉเฉเจฆเฉ เจนเฉเฅค
เจนเฉฑเจฒ #3 เจเฉฑเจ เจเฉเจเจพ เจเจฒเฉฑเจธเจเจฐ เจฐเฉฑเจเจฃเจพ เจนเฉ เจ เจคเฉ เจเฉฑเจ เจเจเฉเจธเจเฉเจฒเจฐ เจฒเจฟเจเจฃเจพ เจนเฉ เจเฉ เจเจฒเฉฑเจธเจเจฐ เจฆเฉ เจฎเฉเจเฉเจฆเจพ เจฒเฉเจก เจฆเฉ เจจเจฟเจเจฐเจพเจจเฉ เจเจฐเฉเจเจพ เจ เจคเฉ, เจตเฉฑเจ-เจตเฉฑเจ API เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจเฉ, เจเจฒเฉฑเจธเจเจฐ เจคเฉเจ เจจเฉเจกเจพเจ เจจเฉเฉฐ เจเฉเฉเจจเจพ เจ เจคเฉ เจนเจเจพเจเจฃเจพ เจนเฉเฅค
เจเจธ เจชเฉเจธเจ เจตเจฟเฉฑเจ เจ เจธเฉเจ เจนเฉฑเจฒ #3 เจฌเจพเจฐเฉ เจเฉฑเจฒ เจเจฐเจพเจเจเฉเฅค เจเจน เจเจเฉเจธเจเฉเจฒเจฐ เจ เฉฐเจฆเจฐเฉเจจเฉ เจเจพเจฐเจเจพเจ เจฆเฉ เจฌเจเจพเจ เจฌเจพเจนเจฐเฉ เจเจพเจฐเจเจพเจ 'เจคเฉ เจฌเจนเฉเจค เจเจผเจฟเจเจฆเจพ เจจเจฟเจฐเจญเจฐ เจนเฉ, เจ เจคเฉ เจชเฉเจฐเจฆเจพเจคเจพ เจ เจเจธเจฐ เจเจธเจจเฉเฉฐ เจชเฉเจฐเจฆเจพเจจ เจจเจนเฉเจ เจเจฐเจฆเฉ เจนเจจเฅค เจ เจธเฉเจ Mail.ru Cloud Solutions เจเจฒเจพเจเจก เจฌเฉเจจเจฟเจเจฆเฉ เจขเจพเจเจเฉ เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจฆเฉ เจนเจพเจ เจ เจคเฉ MCS API เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจฆเฉ เจนเฉเจ เจเฉฑเจ เจเจเฉเจธเจเฉเจฒเจฐ เจฒเจฟเจเจฟเจ เจนเฉเฅค เจ เจคเฉ เจเจฟเจเจเจเจฟ เจ เจธเฉเจ เจธเจฟเจเจพเจเจเจฆเฉ เจนเจพเจ เจเจฟ เจกเฉเจเจพ เจจเจพเจฒ เจเจฟเจตเฉเจ เจเฉฐเจฎ เจเจฐเจจเจพ เจนเฉ, เจ เจธเฉเจ เจเจน เจฆเจฟเจเจพเจเจฃ เจฆเจพ เจซเฉเจธเจฒเจพ เจเฉเจคเจพ เจนเฉ เจเจฟ เจคเฉเจธเฉเจ เจเจชเจฃเฉ เจเฉเจฆ เจฆเฉ เจเจฆเฉเจธเจผเจพเจ เจฒเจ เจเฉฑเจ เจธเจฎเจพเจจ เจเจเฉเจธเจเฉเจฒเจฐ เจเจฟเจตเฉเจ เจฒเจฟเจ เจธเจเจฆเฉ เจนเฉ เจ เจคเฉ เจเจธเจจเฉเฉฐ เจเจชเจฃเฉ เจเจฒเจพเจเจก เจจเจพเจฒ เจตเจฐเจค เจธเจเจฆเฉ เจนเฉเฅค
เจชเฉเจฐเจฟ-เจฒเฉเฉเจพเจ
เจชเจนเจฟเจฒเจพเจ, เจคเฉเจนเจพเจกเฉ เจเฉเจฒ เจเฉฑเจ เจนเฉเจกเฉเจช เจเจฒเฉฑเจธเจเจฐ เจนเฉเจฃเจพ เจเจพเจนเฉเจฆเจพ เจนเฉเฅค เจเจฆเจพเจนเจฐเจจ เจฒเจ, เจ เจธเฉเจ HDP เจตเฉฐเจก เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจฆเฉ เจนเจพเจเฅค
เจคเฉเจนเจพเจกเฉ เจจเฉเจกเจพเจ เจจเฉเฉฐ เจคเฉเจเจผเฉ เจจเจพเจฒ เจเฉเฉเจจ เจ เจคเฉ เจนเจเจพเจ เจเจพเจฃ เจฒเจ, เจคเฉเจนเจพเจกเฉ เจเฉเจฒ เจจเฉเจกเจพเจ เจตเจฟเฉฑเจ เจญเฉเจฎเจฟเจเจพเจตเจพเจ เจฆเฉ เจเฉฑเจ เจเจพเจธ เจตเฉฐเจก เจนเฉเจฃเฉ เจเจพเจนเฉเจฆเฉ เจนเฉเฅค
- เจฎเจพเจธเจเจฐ เจจเฉเจก. เจเฉเจฐ, เจเจพเจธ เจคเฉเจฐ 'เจคเฉ เจเฉเจ เจตเฉ เจธเจฎเจเจพเจเจฃ เจฆเฉ เจเจผเจฐเฉเจฐเจค เจจเจนเฉเจ เจนเฉ: เจเจฒเฉฑเจธเจเจฐ เจฆเจพ เจฎเฉเฉฑเจ เจจเฉเจก, เจเจฟเจธ 'เจคเฉ, เจเจฆเจพเจนเจฐเจจ เจฒเจ, เจธเจชเจพเจฐเจ เจกเจฐเจพเจเจตเจฐ เจฒเจพเจเจ เจเฉเจคเจพ เจเจฟเจ เจนเฉ, เจเฉ เจคเฉเจธเฉเจ เจเฉฐเจเจฐเจเจเจเจฟเจต เจฎเฉเจก เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจฆเฉ เจนเฉ.
- เจฎเจฟเจคเฉ เจจเฉเจก. เจเจน เจเจน เจจเฉเจก เจนเฉ เจเจฟเจธ 'เจคเฉ เจคเฉเจธเฉเจ HDFS 'เจคเฉ เจกเจพเจเจพ เจธเจเฉเจฐ เจเจฐเจฆเฉ เจนเฉ เจ เจคเฉ เจเจฟเฉฑเจฅเฉ เจเจฃเจจเจพ เจเฉเจคเฉ เจเจพเจเจฆเฉ เจนเฉเฅค
- เจเฉฐเจชเจฟเจเจเจฟเฉฐเจ เจจเฉเจก. เจเจน เจเฉฑเจ เจจเฉเจก เจนเฉ เจเจฟเฉฑเจฅเฉ เจคเฉเจธเฉเจ HDFS 'เจคเฉ เจเฉเจ เจตเฉ เจธเจเฉเจฐ เจจเจนเฉเจ เจเจฐเจฆเฉ, เจชเจฐ เจเจฟเฉฑเจฅเฉ เจเจฃเจจเจพ เจนเฉเฉฐเจฆเฉ เจนเฉเฅค
เจฎเจนเฉฑเจคเจตเจชเฉเจฐเจจ เจฌเจฟเฉฐเจฆเฉ. เจคเฉเจเฉ เจเจฟเจธเจฎ เจฆเฉ เจจเฉเจกเจพเจ เจฆเฉ เจเจพเจฐเจจ เจเจเฉเจธเจเฉเจฒเจฟเฉฐเจ เจนเฉเจตเฉเจเฉเฅค เจเฉเจเจฐ เจคเฉเจธเฉเจ เจฆเฉเจเฉ เจเจฟเจธเจฎ เจฆเฉ เจจเฉเจกเจพเจ เจจเฉเฉฐ เจฒเฉเจฃเจพ เจ เจคเฉ เจเฉเฉเจจเจพ เจธเจผเฉเจฐเฉ เจเจฐเจฆเฉ เจนเฉ, เจคเจพเจ เจเจตเจพเจฌ เจฆเฉ เจเจคเฉ เจฌเจนเฉเจค เจเฉฑเจ เจนเฉเจตเฉเจเฉ - เจกเฉเจเจฎเจฟเจธเจผเจจเจฟเฉฐเจ เจ เจคเฉ เจฐเฉเจเจฎเจฟเจเจฟเฉฐเจ เจคเฉเจนเจพเจกเฉ เจเจฒเฉฑเจธเจเจฐ 'เจคเฉ เจเฉฐเจเฉ เจฒเจตเฉเจเฉเฅค เจเจน, เจฌเฉเจธเจผเจ, เจเจน เจจเจนเฉเจ เจนเฉ เจเฉ เจคเฉเจธเฉเจ เจเจเฉเจธเจเฉเจฒเจฟเฉฐเจ เจคเฉเจ เจเจฎเฉเจฆ เจเจฐเจฆเฉ เจนเฉเฅค เจญเจพเจต, เจ เจธเฉเจ เจชเจนเจฟเจฒเฉ เจ เจคเฉ เจฆเฉเจเฉ เจเจฟเจธเจฎ เจฆเฉ เจจเฉเจกเจพเจ เจจเฉเฉฐ เจจเจนเฉเจ เจเฉเจนเจฆเฉ. เจเจน เจเฉฑเจ เจเฉฑเจเฉ-เจเฉฑเจ เจตเจฟเจนเจพเจฐเจ เจเจฒเฉฑเจธเจเจฐ เจฆเฉ เจจเฉเจฎเจพเจเฉฐเจฆเจเฉ เจเจฐเจจเจเฉ เจเฉ เจชเฉเจฐเฉเจเจฐเจพเจฎ เจฆเฉ เจชเฉเจฐเฉ เจธเจฎเฉเจ เจฆเฉเจฐเจพเจจ เจฎเฉเจเฉเจฆ เจฐเจนเฉเจเจพเฅค
เจเจธ เจฒเจ, เจธเจพเจกเจพ เจเจเฉเจธเจเฉเจฒเจฐ เจชเจพเจเจฅเจจ 3 เจตเจฟเฉฑเจ เจฒเจฟเจเจฟเจ เจเจฟเจ เจนเฉ, เจเจฒเฉฑเจธเจเจฐ เจธเฉเจตเจพเจตเจพเจ เจฆเจพ เจชเฉเจฐเจฌเฉฐเจงเจจ เจเจฐเจจ เจฒเจ เจ
เฉฐเจฌเจฐเฉ API เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจฆเจพ เจนเฉ, เจตเจฐเจคเจฆเจพ เจนเฉ
เจนเฉฑเจฒ เจเจฐเจเฉเจเฉเจเจเจฐ
- เจฎเฉเจกเฉuleเจฒ
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
, เจเจฆเจพเจนเจฐเจจ เจฒเจ, like'http://localhost:8080/api/v1/clusters/'
,cluster_name
- เจ เฉฐเจฌเจฐเฉ เจตเจฟเฉฑเจ เจคเฉเจนเจพเจกเฉ เจเจฒเฉฑเจธเจเจฐ เจฆเจพ เจจเจพเจฎ,headers = {'X-Requested-By': 'ambari'}
- เจ
เจคเฉ เจ
เฉฐเจฆเจฐ
auth
เจ เฉฐเจฌเจฐเฉ เจฒเจ เจคเฉเจนเจพเจกเจพ เจฒเฉเจเจเจจ เจ เจคเฉ เจชเจพเจธเจตเจฐเจก เจเจน เจนเฉ:auth = ('login', 'password')
.
เจซเฉฐเจเจธเจผเจจ เจเจชเจฃเฉ เจเจช เจตเจฟเฉฑเจ เจ
เฉฐเจฌเจฐเฉ เจจเฉเฉฐ REST API เจฆเฉเจเจฐเจพ เจฆเฉ เจเจพเจฒเจพเจ เจคเฉเจ เจตเฉฑเจง เจเฉเจ เจจเจนเฉเจ เจนเฉเฅค เจคเจฐเจเจชเฉเจฐเจจ เจฆเฉเจฐเจฟเจธเจผเจเฉเจเฉเจฃ เจคเฉเจ, เจ
เจธเฉเจ เจชเจนเจฟเจฒเจพเจ เจเฉฑเจ เจจเฉเจก 'เจคเฉ เจเฉฑเจฒ เจฐเจนเฉเจเจ เจธเฉเจตเจพเจตเจพเจ เจฆเฉ เจเฉฑเจ เจธเฉเจเฉ เจชเฉเจฐเจพเจชเจค เจเจฐเจฆเฉ เจนเจพเจ, เจ
เจคเฉ เจซเจฟเจฐ เจเฉฑเจ เจฆเจฟเฉฑเจคเฉ เจเจฒเฉฑเจธเจเจฐ 'เจคเฉ, เจฆเจฟเฉฑเจคเฉ เจจเฉเจก 'เจคเฉ, เจธเฉเจเฉ เจคเฉเจ เจฐเจพเจ เจตเจฟเฉฑเจ เจธเฉเจตเจพเจตเจพเจ เจเฉเจฐเจพเจเจธเจซเจฐ เจเจฐเจจ เจฒเจ เจเจนเจฟเฉฐเจฆเฉ เจนเจพเจเฅค INSTALLED
. เจธเจพเจฐเฉเจเจ เจธเฉเจตเจพเจตเจพเจ เจจเฉเฉฐ เจธเจผเฉเจฐเฉ เจเจฐเจจ เจฒเจ เจซเฉฐเจเจธเจผเจจ, เจจเฉเจกเจธ เจจเฉเฉฐ เจฐเจพเจ เจตเจฟเฉฑเจ เจคเจฌเจฆเฉเจฒ เจเจฐเจจ เจฒเจ Maintenance
เจเจฆเจฟ เจธเจฎเจพเจจ เจฆเจฟเจเจพเจ เจฆเจฟเฉฐเจฆเฉ เจนเจจ - เจเจน API เจฆเฉเจเจฐเจพ เจเฉเจ เจฌเฉเจจเจคเฉเจเจ เจนเจจเฅค
เจเจฒเจพเจธ เจเจฎ.เจธเฉ.เจเจธ
เจเจน เจเจน เจนเฉ เจเจฟเจธ เจตเจฟเฉฑเจ เจเฉฑเจ เจเจฒเจพเจธ เจตเจพเจฒเจพ เจเฉเจก เจฆเจพ เจเฉฑเจ เจเฉเจเฉเจพ เจฆเจฟเจเจพเจ เจฆเจฟเฉฐเจฆเจพ เจนเฉ 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
, เจจเฉเจกเจพเจ เจฆเฉ เจธเฉเจเฉ เจเฉ เจธเจเฉเจฒเจฟเฉฐเจ เจฒเจ เจฎเจจเจเจผเฉเจฐ เจนเจจ, เจจเจพเจฒ เจนเฉ เจจเฉเจก เจเฉเจเจซเจฟเจเจฐเฉเจธเจผเจจ เจชเฉเจฐเจพเจฎเฉเจเจฐ: เจฎเฉเจฎเฉเจฐเฉ เจ
เจคเฉ CPU YARN เจตเจฟเฉฑเจ เจจเฉเจก เจจเฉเฉฐ เจจเจฟเจฐเจงเจพเจฐเจค เจเฉเจคเจพ เจเจฟเจ เจนเฉเฅค เจเฉฑเจฅเฉ 2 เจ
เฉฐเจฆเจฐเฉเจจเฉ เจชเฉเจฐเจพเจฎเฉเจเจฐ q_ram, q_cpu เจตเฉ เจนเจจ, เจเฉ เจเจฟ เจเจคเจพเจฐ เจนเจจเฅค เจเจนเจจเจพเจ เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจเฉ, เจ
เจธเฉเจ เจฎเฉเจเฉเจฆเจพ เจเจฒเฉฑเจธเจเจฐ เจฒเฉเจก เจฆเฉ เจฎเฉเฉฑเจฒเจพเจ เจจเฉเฉฐ เจธเจเฉเจฐ เจเจฐเจฆเฉ เจนเจพเจเฅค เจเฉเจเจฐ เจ
เจธเฉเจ เจฆเฉเจเจฆเฉ เจนเจพเจ เจเจฟ เจชเจฟเจเจฒเฉ 5 เจฎเจฟเฉฐเจเจพเจ เจตเจฟเฉฑเจ เจเฉฑเจ เจฒเจเจพเจคเจพเจฐ เจตเจงเจฟเจ เจฒเฉเจก เจนเฉเจเจ เจนเฉ, เจคเจพเจ เจ
เจธเฉเจ เจซเฉเจธเจฒเจพ เจเจฐเจฆเฉ เจนเจพเจ เจเจฟ เจธเจพเจจเฉเฉฐ เจเจฒเฉฑเจธเจเจฐ เจตเจฟเฉฑเจ +1 เจจเฉเจก เจเฉเฉเจจ เจฆเฉ เจฒเฉเฉ เจนเฉเฅค เจเจนเฉ เจเจฒเฉฑเจธเจเจฐ เจ
เฉฐเจกเจฐเจฏเฉเจเฉเจฒเจพเจเจเจผเฉเจธเจผเจจ เจธเจฅเจฟเจคเฉ เจฒเจ เจธเฉฑเจ เจนเฉเฅค
เจเจชเจฐเฉเจเจค เจเฉเจก เจเฉฑเจ เจซเฉฐเจเจธเจผเจจ เจฆเจพ เจเฉฑเจ เจเจฆเจพเจนเจฐเจฃ เจนเฉ เจเฉ เจเฉฑเจ เจฎเจธเจผเฉเจจ เจจเฉเฉฐ เจเจฒเฉฑเจธเจเจฐ เจคเฉเจ เจนเจเจพ เจฆเจฟเฉฐเจฆเจพ เจนเฉ เจ
เจคเฉ เจเจธเจจเฉเฉฐ เจเจฒเจพเจเจก เจตเจฟเฉฑเจ เจฐเฉเจเจฆเจพ เจนเฉเฅค เจชเจนเจฟเจฒเจพเจ เจเฉฑเจ เจกเฉเจเจฎเจฟเจธเจผเจจเจฟเฉฐเจ เจนเฉ YARN Nodemanager
, เจซเจฟเจฐ เจฎเฉเจก เจเจพเจฒเฉ เจนเฉเฉฐเจฆเจพ เจนเฉ Maintenance
, เจซเจฟเจฐ เจ
เจธเฉเจ เจฎเจธเจผเฉเจจ 'เจคเฉ เจธเจพเจฐเฉเจเจ เจธเฉเจตเจพเจตเจพเจ เจฌเฉฐเจฆ เจเจฐ เจฆเจฟเฉฐเจฆเฉ เจนเจพเจ เจ
เจคเฉ เจเจฒเจพเจเจก เจตเจฟเฉฑเจ เจตเจฐเจเฉเจ
เจฒ เจฎเจธเจผเฉเจจ เจจเฉเฉฐ เจฌเฉฐเจฆ เจเจฐ เจฆเจฟเฉฐเจฆเฉ เจนเจพเจเฅค
2. เจธเจเฉเจฐเจฟเจชเจ 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)
เจเจธ เจตเจฟเฉฑเจ, เจ
เจธเฉเจ เจเจพเจเจ เจเจฐเจฆเฉ เจนเจพเจ เจเจฟ เจเฉ เจเจฒเฉฑเจธเจเจฐ เจฆเฉ เจธเจฎเจฐเฉฑเจฅเจพ เจตเจงเจพเจเจฃ เจฒเจ เจธเจฅเจฟเจคเฉเจเจ เจฌเจฃเจพเจเจเจ เจเจเจเจ เจนเจจ เจ
เจคเฉ เจเฉ เจฐเจฟเจเจผเจฐเจต เจตเจฟเฉฑเจ เจเฉเจ เจฎเจธเจผเฉเจจเจพเจ เจนเจจ, เจเจนเจจเจพเจ เจตเจฟเฉฑเจเฉเจ เจเฉฑเจ เจฆเจพ เจฎเฉเจเจผเจฌเจพเจจ เจจเจพเจฎ เจชเฉเจฐเจพเจชเจค เจเจฐเฉ, เจเจธเจจเฉเฉฐ เจเจฒเฉฑเจธเจเจฐ เจตเจฟเฉฑเจ เจธเจผเจพเจฎเจฒ เจเจฐเฉ เจ
เจคเฉ เจธเจพเจกเฉ เจเฉเจฎ เจฆเฉ เจธเจฒเฉเจ 'เจคเฉ เจเจธ เจฌเจพเจฐเฉ เจเฉฑเจ เจธเฉฐเจฆเฉเจธเจผ เจชเฉเจฐเจเจพเจธเจผเจฟเจค เจเจฐเฉเฅค เจเจฟเจธ เจคเฉเจ เจฌเจพเจ
เจฆ เจธเจผเฉเจฐเฉ เจนเฉเฉฐเจฆเจพ เจนเฉ cooldown_period
, เจเจฆเฉเจ เจ
เจธเฉเจ เจเจฒเฉฑเจธเจเจฐ เจคเฉเจ เจเฉเจ เจตเฉ เจเฉเฉเจฆเฉ เจเจพเจ เจนเจเจพเจเจเจฆเฉ เจจเจนเฉเจ เจนเจพเจ, เจชเจฐ เจฌเจธ เจฒเฉเจก เจฆเฉ เจจเจฟเจเจฐเจพเจจเฉ เจเจฐเจฆเฉ เจนเจพเจเฅค เจเฉ เจเจน เจธเจฅเจฟเจฐ เจนเฉ เจเจฟเจ เจนเฉ เจ
เจคเฉ เจ
เจจเฉเจเฉเจฒ เจฒเฉเจก เจฎเฉเฉฑเจฒเจพเจ เจฆเฉ เจเจฒเจฟเจเจฐเฉ เจฆเฉ เจ
เฉฐเจฆเจฐ เจนเฉ, เจคเจพเจ เจ
เจธเฉเจ เจธเจฟเจฐเจซเจผ เจจเจฟเจเจฐเจพเจจเฉ เจเจพเจฐเฉ เจฐเฉฑเจเจฆเฉ เจนเจพเจเฅค เจเฉ เจเฉฑเจ เจจเฉเจก เจเจพเจซเจผเฉ เจจเจนเฉเจ เจธเฉ, เจคเจพเจ เจ
เจธเฉเจ เจเฉฑเจ เจนเฉเจฐ เจเฉเฉเจฆเฉ เจนเจพเจ.
เจเจนเจจเจพเจ เจฎเจพเจฎเจฒเจฟเจเจ เจฒเจ เจเจฆเฉเจ เจธเจพเจกเฉ เจเฉเจฒ เจเฉฑเจ เจชเจพเจ เจ เฉฑเจเฉ เจนเฉ, เจ เจธเฉเจ เจชเจนเจฟเจฒเจพเจ เจนเฉ เจเจน เจฏเจเฉเจจเฉ เจคเฉเจฐ 'เจคเฉ เจเจพเจฃเจฆเฉ เจนเจพเจ เจเจฟ เจเฉฑเจ เจจเฉเจก เจเจพเจซเจผเฉ เจจเจนเฉเจ เจนเฉเจตเฉเจเจพ, เจเจธ เจฒเจ เจ เจธเฉเจ เจคเฉเจฐเฉฐเจค เจธเจพเจฐเฉ เจฎเฉเจซเจค เจจเฉเจกเจพเจ เจจเฉเฉฐ เจธเจผเฉเจฐเฉ เจเจฐเจฆเฉ เจนเจพเจ เจ เจคเฉ เจชเจพเจ เจฆเฉ เจ เฉฐเจค เจคเฉฑเจ เจเจนเจจเจพเจ เจจเฉเฉฐ เจเจฟเจฐเจฟเจเจธเจผเฉเจฒ เจฐเฉฑเจเจฆเฉ เจนเจพเจเฅค เจเจน เจเจคเฉเจตเจฟเจงเฉ เจเจพเจเจฎเจธเจเฉเจเจชเจพเจ เจฆเฉ เจธเฉเจเฉ เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจเฉ เจตเจพเจชเจฐเจฆเจพ เจนเฉเฅค
เจธเจฟเฉฑเจเจพ
เจเจเฉเจธเจเฉเจฒเจฐ เจเจนเจจเจพเจ เจฎเจพเจฎเจฒเจฟเจเจ เจฒเจ เจเฉฑเจ เจเฉฐเจเจพ เจ เจคเฉ เจธเฉเจตเจฟเจงเจพเจเจจเจ เจนเฉฑเจฒ เจนเฉ เจเจฆเฉเจ เจคเฉเจธเฉเจ เจ เจธเจฎเจพเจจ เจเจฒเฉฑเจธเจเจฐ เจฒเฉเจกเจฟเฉฐเจ เจฆเจพ เจ เจจเฉเจญเจต เจเจฐเจฆเฉ เจนเฉเฅค เจคเฉเจธเฉเจ เจเฉฑเจเฉ เจธเจฎเฉเจ เจชเฉเจ เจฒเฉเจก เจฒเจ เจฒเฉเฉเฉเจฆเฉ เจเจฒเฉฑเจธเจเจฐ เจธเฉฐเจฐเจเจจเจพ เจจเฉเฉฐ เจชเฉเจฐเจพเจชเจค เจเจฐเจฆเฉ เจนเฉ เจ เจคเฉ เจเจธเจฆเฉ เจจเจพเจฒ เจนเฉ เจชเฉเจธเฉ เจฆเฉ เจฌเจเจค เจเจฐเจฆเฉ เจนเฉเจ, เจ เฉฐเจกเจฐเจฒเฉเจก เจฆเฉเจฐเจพเจจ เจเจธ เจเจฒเฉฑเจธเจเจฐ เจจเฉเฉฐ เจจเจพ เจฐเฉฑเจเฉเฅค เจเฉเจฐ, เจจเจพเจฒ เจนเฉ เจเจน เจธเจญ เจคเฉเจนเจพเจกเฉ เจญเจพเจเฉเจฆเจพเจฐเฉ เจคเฉเจ เจฌเจฟเจจเจพเจ เจเจชเจฃเฉ เจเจช เจนเฉ เจตเจพเจชเจฐเจฆเจพ เจนเฉเฅค เจเจเฉเจธเจเฉเจฒเจฐ เจเจชเจฃเฉ เจเจช เจตเจฟเฉฑเจ เจเจฒเฉฑเจธเจเจฐ เจฎเฉเจจเฉเจเจฐ API เจ เจคเฉ เจเจฒเจพเจเจก เจชเฉเจฐเจฆเจพเจคเจพ API เจจเฉเฉฐ เจฌเฉเจจเจคเฉเจเจ เจฆเฉ เจเฉฑเจ เจธเจฎเฉเจน เจคเฉเจ เจตเฉฑเจง เจเฉเจ เจจเจนเฉเจ เจนเฉ, เจเฉฑเจ เจเจพเจธ เจคเจฐเจ เจฆเฉ เจ เจจเฉเจธเจพเจฐ เจฒเจฟเจเจฟเจ เจเจฟเจ เจนเฉเฅค เจเฉ เจคเฉเจนเจพเจจเฉเฉฐ เจฏเจเฉเจจเฉ เจคเฉเจฐ 'เจคเฉ เจฏเจพเจฆ เจฐเฉฑเจเจฃ เจฆเฉ เจฒเฉเฉ เจนเฉ เจเจน เจนเฉ 3 เจเจฟเจธเจฎเจพเจ เจตเจฟเฉฑเจ เจจเฉเจกเจพเจ เจฆเฉ เจตเฉฐเจก, เจเจฟเจตเฉเจ เจเจฟ เจ เจธเฉเจ เจชเจนเจฟเจฒเจพเจ เจฒเจฟเจเจฟเจ เจธเฉเฅค เจ เจคเฉ เจคเฉเจธเฉเจ เจเฉเจธเจผ เจนเฉเจตเฉเจเฉเฅค
เจธเจฐเฉเจค: www.habr.com