แƒ แƒแƒ’แƒแƒ  แƒ’แƒแƒแƒ™แƒ”แƒ—แƒแƒ— แƒ—แƒฅแƒ•แƒ”แƒœแƒ˜ แƒกแƒแƒ™แƒฃแƒ—แƒแƒ แƒ˜ แƒแƒ•แƒขแƒแƒกแƒ™แƒแƒšแƒ”แƒ แƒ˜ แƒ™แƒšแƒแƒกแƒขแƒ”แƒ แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก

แƒ’แƒแƒ›แƒแƒ แƒฏแƒแƒ‘แƒ! แƒฉแƒ•แƒ”แƒœ แƒ•แƒแƒ›แƒ–แƒแƒ“แƒ”แƒ‘แƒ— แƒแƒ“แƒแƒ›แƒ˜แƒแƒœแƒ”แƒ‘แƒก แƒ“แƒ˜แƒ“ แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ”แƒ‘แƒ—แƒแƒœ แƒ›แƒฃแƒจแƒแƒแƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก. แƒจแƒ”แƒฃแƒซแƒšแƒ”แƒ‘แƒ”แƒšแƒ˜แƒ แƒฌแƒแƒ แƒ›แƒแƒ•แƒ˜แƒ“แƒ’แƒ˜แƒœแƒแƒ— แƒกแƒแƒ’แƒแƒœแƒ›แƒแƒœแƒแƒ—แƒšแƒ”แƒ‘แƒšแƒ แƒžแƒ แƒแƒ’แƒ แƒแƒ›แƒ แƒ“แƒ˜แƒ“ แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ”แƒ‘แƒ–แƒ” แƒกแƒแƒ™แƒฃแƒ—แƒแƒ แƒ˜ แƒ™แƒšแƒแƒกแƒขแƒ”แƒ แƒ˜แƒก แƒ’แƒแƒ แƒ”แƒจแƒ”, แƒ แƒแƒ›แƒ”แƒšแƒ–แƒ”แƒช แƒงแƒ•แƒ”แƒšแƒ แƒ›แƒแƒœแƒแƒฌแƒ˜แƒšแƒ” แƒ”แƒ แƒ—แƒแƒ“ แƒ›แƒฃแƒจแƒแƒแƒ‘แƒก. แƒแƒ› แƒ›แƒ˜แƒ–แƒ”แƒ–แƒ˜แƒ—, แƒฉแƒ•แƒ”แƒœแƒก แƒžแƒ แƒแƒ’แƒ แƒแƒ›แƒแƒก แƒงแƒแƒ•แƒ”แƒšแƒ—แƒ•แƒ˜แƒก แƒแƒฅแƒ•แƒก แƒ˜แƒก ๐Ÿ™‚ แƒฉแƒ•แƒ”แƒœ แƒฉแƒแƒ แƒ—แƒฃแƒšแƒ˜ แƒ•แƒแƒ แƒ— แƒ›แƒ˜แƒก แƒ™แƒแƒœแƒคแƒ˜แƒ’แƒฃแƒ แƒแƒชแƒ˜แƒแƒจแƒ˜, แƒขแƒฃแƒœแƒ˜แƒœแƒ’แƒกแƒ แƒ“แƒ แƒแƒ“แƒ›แƒ˜แƒœแƒ˜แƒกแƒขแƒ แƒ˜แƒ แƒ”แƒ‘แƒแƒจแƒ˜ แƒ“แƒ แƒ‘แƒ˜แƒญแƒ”แƒ‘แƒ˜ แƒžแƒ˜แƒ แƒ“แƒแƒžแƒ˜แƒ  แƒแƒ›แƒฃแƒจแƒแƒ•แƒ”แƒ‘แƒ”แƒœ MapReduce แƒกแƒแƒ›แƒฃแƒจแƒแƒแƒ”แƒ‘แƒก แƒ˜แƒฅ แƒ“แƒ แƒ˜แƒงแƒ”แƒœแƒ”แƒ‘แƒ”แƒœ Spark-แƒก.

แƒแƒ› แƒžแƒแƒกแƒขแƒจแƒ˜ แƒฉแƒ•แƒ”แƒœ แƒ’แƒ”แƒขแƒงแƒ•แƒ˜แƒ—, แƒ—แƒฃ แƒ แƒแƒ’แƒแƒ  แƒ’แƒแƒ“แƒแƒ•แƒญแƒ แƒ˜แƒ— แƒ™แƒšแƒแƒกแƒขแƒ”แƒ แƒ˜แƒก แƒแƒ แƒแƒ—แƒแƒœแƒแƒ‘แƒแƒ แƒ˜ แƒ“แƒแƒขแƒ•แƒ˜แƒ แƒ—แƒ•แƒ˜แƒก แƒžแƒ แƒแƒ‘แƒšแƒ”แƒ›แƒ แƒฆแƒ แƒฃแƒ‘แƒšแƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒ— แƒกแƒแƒ™แƒฃแƒ—แƒแƒ แƒ˜ แƒแƒ•แƒขแƒแƒกแƒ™แƒแƒšแƒ”แƒ แƒ˜แƒก แƒ“แƒแƒฌแƒ”แƒ แƒ˜แƒ— Mail.ru Cloud Solutions.

แƒžแƒ แƒแƒ‘แƒšแƒ”แƒ›แƒ

แƒฉแƒ•แƒ”แƒœแƒ˜ แƒ™แƒšแƒแƒกแƒขแƒ”แƒ แƒ˜ แƒแƒ  แƒ’แƒแƒ›แƒแƒ˜แƒงแƒ”แƒœแƒ”แƒ‘แƒ แƒขแƒ˜แƒžแƒ˜แƒฃแƒ  แƒ แƒ”แƒŸแƒ˜แƒ›แƒจแƒ˜. แƒ’แƒแƒœแƒแƒ“แƒ’แƒฃแƒ แƒ”แƒ‘แƒ แƒซแƒแƒšแƒ–แƒ” แƒแƒ แƒแƒ—แƒแƒœแƒแƒ‘แƒแƒ แƒ˜แƒ. แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒแƒ“, แƒแƒ แƒ˜แƒก แƒžแƒ แƒแƒฅแƒขแƒ˜แƒ™แƒฃแƒšแƒ˜ แƒ’แƒแƒ™แƒ•แƒ”แƒ—แƒ˜แƒšแƒ”แƒ‘แƒ˜, แƒ แƒแƒ“แƒ”แƒกแƒแƒช 30-แƒ•แƒ” แƒแƒ“แƒแƒ›แƒ˜แƒแƒœแƒ˜ แƒ“แƒ แƒ›แƒแƒกแƒฌแƒแƒ•แƒšแƒ”แƒ‘แƒ”แƒšแƒ˜ แƒ›แƒ˜แƒ“แƒ˜แƒแƒœ แƒ™แƒšแƒแƒกแƒขแƒ”แƒ แƒจแƒ˜ แƒ“แƒ แƒ˜แƒฌแƒงแƒ”แƒ‘แƒ”แƒœ แƒ›แƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒแƒก. แƒแƒœ แƒ™แƒ˜แƒ“แƒ”แƒ•, แƒแƒ แƒ˜แƒก แƒ•แƒแƒ“แƒแƒ›แƒ“แƒ” แƒ“แƒฆแƒ”แƒ”แƒ‘แƒ˜, แƒ แƒแƒ“แƒ”แƒกแƒแƒช แƒ“แƒแƒขแƒ•แƒ˜แƒ แƒ—แƒ•แƒ แƒ›แƒœแƒ˜แƒจแƒ•แƒœแƒ”แƒšแƒแƒ•แƒœแƒแƒ“ แƒ˜แƒ–แƒ แƒ“แƒ”แƒ‘แƒ. แƒ“แƒแƒœแƒแƒ แƒฉแƒ”แƒœ แƒ“แƒ แƒแƒก แƒ™แƒšแƒแƒกแƒขแƒ”แƒ แƒ˜ แƒ›แƒฃแƒจแƒแƒแƒ‘แƒก แƒ“แƒแƒขแƒ•แƒ˜แƒ แƒ—แƒฃแƒš แƒ แƒ”แƒŸแƒ˜แƒ›แƒจแƒ˜.

ะ ะตัˆะตะฝะธะต โ„–1 โ€“ ัั‚ะพ ะดะตั€ะถะฐั‚ัŒ ะบะปะฐัั‚ะตั€, ะบะพั‚ะพั€ั‹ะน ะฑัƒะดะตั‚ ะฒั‹ะดะตั€ะถะธะฒะฐั‚ัŒ ะฟะธะบะพะฒั‹ะต ะทะฐะณั€ัƒะทะบะธ, ะฝะพ ะฑัƒะดะตั‚ ะฟั€ะพัั‚ะฐะธะฒะฐั‚ัŒ ะฒะพ ะฒัะต ะพัั‚ะฐะปัŒะฝะพะต ะฒั€ะตะผั.

แƒ’แƒแƒ›แƒแƒกแƒแƒ•แƒแƒšแƒ˜ #2 แƒแƒ แƒ˜แƒก แƒžแƒแƒขแƒแƒ แƒ แƒ™แƒšแƒแƒกแƒขแƒ”แƒ แƒ˜แƒก แƒจแƒ”แƒœแƒแƒ แƒฉแƒฃแƒœแƒ”แƒ‘แƒ, แƒ แƒแƒ›แƒ”แƒšแƒกแƒแƒช แƒฎแƒ”แƒšแƒ˜แƒ— แƒแƒ›แƒแƒขแƒ”แƒ‘แƒ— แƒ™แƒ•แƒแƒœแƒซแƒ”แƒ‘แƒก แƒ™แƒšแƒแƒกแƒ”แƒ‘แƒ˜แƒก แƒฌแƒ˜แƒœ แƒ“แƒ แƒžแƒ˜แƒ™แƒฃแƒ แƒ˜ แƒ“แƒแƒขแƒ•แƒ˜แƒ แƒ—แƒ•แƒ˜แƒก แƒ“แƒ แƒแƒก.

แƒ’แƒแƒ›แƒแƒกแƒแƒ•แƒแƒšแƒ˜ #3 แƒแƒ แƒ˜แƒก แƒžแƒแƒขแƒแƒ แƒ แƒ™แƒšแƒแƒกแƒขแƒ”แƒ แƒ˜แƒก แƒจแƒ”แƒœแƒแƒฎแƒ•แƒ แƒ“แƒ แƒแƒ•แƒขแƒแƒกแƒ™แƒแƒšแƒ”แƒ แƒ˜แƒก แƒ“แƒแƒฌแƒ”แƒ แƒ, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒ›แƒแƒœแƒ˜แƒขแƒแƒ แƒ˜แƒœแƒ’แƒก แƒ’แƒแƒฃแƒฌแƒ”แƒ•แƒก แƒ™แƒšแƒแƒกแƒขแƒ”แƒ แƒ˜แƒก แƒ›แƒ˜แƒ›แƒ“แƒ˜แƒœแƒแƒ แƒ” แƒ“แƒแƒขแƒ•แƒ˜แƒ แƒ—แƒ•แƒแƒก แƒ“แƒ แƒกแƒฎแƒ•แƒแƒ“แƒแƒกแƒฎแƒ•แƒ API-แƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒ— แƒ“แƒแƒแƒ›แƒแƒขแƒ”แƒ‘แƒก แƒ“แƒ แƒแƒ›แƒแƒ˜แƒฆแƒ”แƒ‘แƒก แƒ™แƒ•แƒแƒœแƒซแƒ”แƒ‘แƒก แƒ™แƒšแƒแƒกแƒขแƒ”แƒ แƒ˜แƒ“แƒแƒœ.

แƒแƒ› แƒžแƒแƒกแƒขแƒจแƒ˜ แƒ•แƒ˜แƒกแƒแƒฃแƒ‘แƒ แƒ”แƒ‘แƒ— แƒ’แƒแƒ›แƒแƒกแƒแƒ•แƒแƒšแƒ–แƒ” #3. แƒ”แƒก แƒแƒ•แƒขแƒแƒกแƒ™แƒแƒšแƒ”แƒ แƒ˜ แƒ“แƒ˜แƒ“แƒแƒ“ แƒแƒ แƒ˜แƒก แƒ“แƒแƒ›แƒแƒ™แƒ˜แƒ“แƒ”แƒ‘แƒฃแƒšแƒ˜ แƒ’แƒแƒ แƒ” แƒคแƒแƒฅแƒขแƒแƒ แƒ”แƒ‘แƒ–แƒ” แƒ“แƒ แƒแƒ แƒ แƒจแƒ˜แƒ“แƒ แƒคแƒแƒฅแƒขแƒแƒ แƒ”แƒ‘แƒ–แƒ” แƒ“แƒ แƒžแƒ แƒแƒ•แƒแƒ˜แƒ“แƒ”แƒ แƒ”แƒ‘แƒ˜ แƒฎแƒจแƒ˜แƒ แƒแƒ“ แƒแƒ  แƒแƒฌแƒ•แƒ“แƒ˜แƒแƒœ แƒ›แƒแƒก. แƒฉแƒ•แƒ”แƒœ แƒ•แƒ˜แƒงแƒ”แƒœแƒ”แƒ‘แƒ— Mail.ru Cloud Solutions แƒฆแƒ แƒฃแƒ‘แƒšแƒแƒ•แƒแƒœ แƒ˜แƒœแƒคแƒ แƒแƒกแƒขแƒ แƒฃแƒฅแƒขแƒฃแƒ แƒแƒก แƒ“แƒ แƒ“แƒแƒ•แƒฌแƒ”แƒ แƒ”แƒ— แƒแƒ•แƒขแƒแƒกแƒ™แƒแƒšแƒ”แƒ แƒ˜ MCS API-แƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒ—. แƒ“แƒ แƒ แƒแƒ“แƒ’แƒแƒœ แƒฉแƒ•แƒ”แƒœ แƒ•แƒแƒกแƒฌแƒแƒ•แƒšแƒ˜แƒ— แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ”แƒ‘แƒ—แƒแƒœ แƒ›แƒฃแƒจแƒแƒแƒ‘แƒแƒก, แƒ’แƒแƒ“แƒแƒ•แƒฌแƒงแƒ•แƒ˜แƒขแƒ”แƒ— แƒ’แƒ•แƒ”แƒฉแƒ•แƒ”แƒœแƒ”แƒ‘แƒ˜แƒœแƒ, แƒ—แƒฃ แƒ แƒแƒ’แƒแƒ  แƒจแƒ”แƒ’แƒ˜แƒซแƒšแƒ˜แƒแƒ— แƒ“แƒแƒฌแƒ”แƒ แƒแƒ— แƒ›แƒกแƒ’แƒแƒ•แƒกแƒ˜ แƒแƒ•แƒขแƒแƒกแƒ™แƒแƒšแƒ”แƒ แƒ˜ แƒ—แƒฅแƒ•แƒ”แƒœแƒ˜ แƒ›แƒ˜แƒ–แƒœแƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก แƒ“แƒ แƒ’แƒแƒ›แƒแƒ˜แƒงแƒ”แƒœแƒแƒ— แƒ˜แƒ’แƒ˜ แƒ—แƒฅแƒ•แƒ”แƒœแƒก แƒฆแƒ แƒฃแƒ‘แƒ”แƒšแƒ—แƒแƒœ

แƒฌแƒ˜แƒœแƒแƒžแƒ˜แƒ แƒแƒ‘แƒ”แƒ‘แƒ˜

แƒžแƒ˜แƒ แƒ•แƒ”แƒš แƒ แƒ˜แƒ’แƒจแƒ˜, แƒ—แƒฅแƒ•แƒ”แƒœ แƒฃแƒœแƒ“แƒ แƒ’แƒฅแƒแƒœแƒ“แƒ”แƒ— Hadoop แƒ™แƒšแƒแƒกแƒขแƒ”แƒ แƒ˜. แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒแƒ“, แƒฉแƒ•แƒ”แƒœ แƒ•แƒ˜แƒงแƒ”แƒœแƒ”แƒ‘แƒ— HDP แƒ’แƒแƒœแƒแƒฌแƒ˜แƒšแƒ”แƒ‘แƒแƒก.

แƒ˜แƒ›แƒ˜แƒกแƒแƒ—แƒ•แƒ˜แƒก, แƒ แƒแƒ› แƒ—แƒฅแƒ•แƒ”แƒœแƒ˜ แƒ™แƒ•แƒแƒœแƒซแƒ”แƒ‘แƒ˜ แƒกแƒฌแƒ แƒแƒคแƒแƒ“ แƒ“แƒแƒ”แƒ›แƒแƒขแƒแƒก แƒ“แƒ แƒฌแƒแƒ˜แƒจแƒแƒšแƒแƒก, แƒ—แƒฅแƒ•แƒ”แƒœ แƒฃแƒœแƒ“แƒ แƒ’แƒฅแƒแƒœแƒ“แƒ”แƒ— แƒ แƒแƒšแƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒ แƒ™แƒ•แƒ”แƒฃแƒšแƒ˜ แƒ’แƒแƒœแƒแƒฌแƒ˜แƒšแƒ”แƒ‘แƒ แƒ™แƒ•แƒแƒœแƒซแƒ”แƒ‘แƒก แƒจแƒแƒ แƒ˜แƒก.

  1. แƒกแƒแƒ›แƒแƒ’แƒ˜แƒกแƒขแƒ แƒ แƒ™แƒ•แƒแƒœแƒซแƒ˜. แƒ˜แƒกแƒ”, แƒแƒ แƒแƒคแƒ แƒ˜แƒก แƒ’แƒแƒœแƒกแƒแƒ™แƒฃแƒ—แƒ แƒ”แƒ‘แƒฃแƒšแƒ˜ แƒแƒฎแƒกแƒœแƒ แƒแƒ  แƒแƒ แƒ˜แƒก แƒกแƒแƒญแƒ˜แƒ แƒ: แƒ™แƒšแƒแƒกแƒขแƒ”แƒ แƒ˜แƒก แƒ›แƒ—แƒแƒ•แƒแƒ แƒ˜ แƒ™แƒ•แƒแƒœแƒซแƒ˜, แƒ แƒแƒ›แƒ”แƒšแƒ–แƒ”แƒ“แƒแƒช แƒ’แƒแƒจแƒ•แƒ”แƒ‘แƒฃแƒšแƒ˜แƒ, แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒแƒ“, Spark แƒ“แƒ แƒแƒ˜แƒ•แƒ”แƒ แƒ˜, แƒ—แƒฃ แƒ˜แƒงแƒ”แƒœแƒ”แƒ‘แƒ— แƒ˜แƒœแƒขแƒ”แƒ แƒแƒฅแƒขแƒ˜แƒฃแƒš แƒ แƒ”แƒŸแƒ˜แƒ›แƒก.
  2. แƒ—แƒแƒ แƒ˜แƒฆแƒ˜แƒก แƒ™แƒ•แƒแƒœแƒซแƒ˜. แƒ”แƒก แƒแƒ แƒ˜แƒก แƒ™แƒ•แƒแƒœแƒซแƒ˜, แƒ แƒแƒ›แƒ”แƒšแƒ–แƒ”แƒช แƒ˜แƒœแƒแƒฎแƒแƒ•แƒ— แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ”แƒ‘แƒก HDFS-แƒ–แƒ” แƒ“แƒ แƒกแƒแƒ“แƒแƒช แƒฎแƒ“แƒ”แƒ‘แƒ แƒ’แƒแƒ›แƒแƒ—แƒ•แƒšแƒ”แƒ‘แƒ˜.
  3. แƒ’แƒแƒ›แƒแƒ—แƒ•แƒšแƒ˜แƒ—แƒ˜ แƒ™แƒ•แƒแƒœแƒซแƒ˜. แƒ”แƒก แƒแƒ แƒ˜แƒก แƒ™แƒ•แƒแƒœแƒซแƒ˜, แƒกแƒแƒ“แƒแƒช แƒ—แƒฅแƒ•แƒ”แƒœ แƒแƒ  แƒ˜แƒœแƒแƒฎแƒแƒ•แƒ— แƒแƒ แƒแƒคแƒ”แƒ แƒก HDFS-แƒ–แƒ”, แƒ›แƒแƒ’แƒ แƒแƒ› แƒกแƒแƒ“แƒแƒช แƒฎแƒ“แƒ”แƒ‘แƒ แƒ’แƒแƒ›แƒแƒ—แƒ•แƒšแƒ”แƒ‘แƒ˜.

แƒ›แƒœแƒ˜แƒจแƒ•แƒœแƒ”แƒšแƒแƒ•แƒแƒœแƒ˜ แƒฌแƒ”แƒ แƒขแƒ˜แƒšแƒ˜. แƒแƒ•แƒขแƒแƒกแƒ™แƒแƒšแƒ˜แƒ แƒ”แƒ‘แƒ แƒ›แƒแƒฎแƒ“แƒ”แƒ‘แƒ แƒ›แƒ”แƒกแƒแƒ›แƒ” แƒขแƒ˜แƒžแƒ˜แƒก แƒ™แƒ•แƒแƒœแƒซแƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒ›แƒ. แƒ—แƒฃ แƒ“แƒแƒ˜แƒฌแƒงแƒ”แƒ‘แƒ— แƒ›แƒ”แƒแƒ แƒ” แƒขแƒ˜แƒžแƒ˜แƒก แƒ™แƒ•แƒแƒœแƒซแƒ”แƒ‘แƒ˜แƒก แƒแƒฆแƒ”แƒ‘แƒแƒก แƒ“แƒ แƒ“แƒแƒ›แƒแƒขแƒ”แƒ‘แƒแƒก, แƒ แƒ”แƒแƒ’แƒ˜แƒ แƒ”แƒ‘แƒ˜แƒก แƒกแƒ˜แƒฉแƒฅแƒแƒ แƒ” แƒซแƒแƒšแƒ˜แƒแƒœ แƒ“แƒแƒ‘แƒแƒšแƒ˜ แƒ˜แƒฅแƒœแƒ”แƒ‘แƒ - แƒ“แƒ”แƒ™แƒแƒ›แƒ˜แƒกแƒแƒชแƒ˜แƒแƒก แƒ“แƒ แƒฎแƒ”แƒšแƒแƒฎแƒšแƒ แƒฉแƒแƒ แƒ—แƒ•แƒ˜แƒกแƒแƒก แƒกแƒแƒแƒ—แƒ”แƒ‘แƒ˜ แƒ“แƒแƒกแƒญแƒ˜แƒ แƒ“แƒ”แƒ‘แƒ แƒ—แƒฅแƒ•แƒ”แƒœแƒก แƒ™แƒšแƒแƒกแƒขแƒ”แƒ แƒ–แƒ”. แƒ”แƒก, แƒ แƒ แƒ—แƒฅแƒ›แƒ แƒฃแƒœแƒ“แƒ, แƒแƒ  แƒแƒ แƒ˜แƒก แƒ˜แƒก, แƒ แƒแƒกแƒแƒช แƒ”แƒšแƒแƒ“แƒ”แƒ‘แƒ˜แƒ— แƒแƒ•แƒขแƒแƒ›แƒแƒขแƒฃแƒ แƒ˜ แƒกแƒ™แƒแƒšแƒ˜แƒ แƒ”แƒ‘แƒ˜แƒกแƒ’แƒแƒœ. แƒแƒœแƒฃ แƒžแƒ˜แƒ แƒ•แƒ”แƒšแƒ˜ แƒ“แƒ แƒ›แƒ”แƒแƒ แƒ” แƒขแƒ˜แƒžแƒ˜แƒก แƒ™แƒ•แƒแƒœแƒซแƒ”แƒ‘แƒก แƒแƒ  แƒ•แƒ”แƒฎแƒ”แƒ‘แƒ˜แƒ—. แƒ˜แƒกแƒ˜แƒœแƒ˜ แƒฌแƒแƒ แƒ›แƒแƒแƒ“แƒ’แƒ”แƒœแƒ”แƒœ แƒ›แƒ˜แƒœแƒ˜แƒ›แƒแƒšแƒฃแƒ  แƒกแƒ˜แƒชแƒแƒชแƒฎแƒšแƒ˜แƒกแƒฃแƒœแƒแƒ แƒ˜แƒแƒœ แƒ™แƒšแƒแƒกแƒขแƒ”แƒ แƒก, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒ˜แƒแƒ แƒกแƒ”แƒ‘แƒ”แƒ‘แƒก แƒžแƒ แƒแƒ’แƒ แƒแƒ›แƒ˜แƒก แƒ’แƒแƒœแƒ›แƒแƒ•แƒšแƒแƒ‘แƒแƒจแƒ˜.

แƒแƒกแƒ” แƒ แƒแƒ›, แƒฉแƒ•แƒ”แƒœแƒ˜ แƒแƒ•แƒขแƒแƒกแƒ™แƒแƒšแƒ”แƒ แƒ˜ แƒ“แƒแƒฌแƒ”แƒ แƒ˜แƒšแƒ˜แƒ Python 3-แƒจแƒ˜, แƒ˜แƒงแƒ”แƒœแƒ”แƒ‘แƒก Ambari API-แƒก แƒ™แƒšแƒแƒกแƒขแƒ”แƒ แƒฃแƒšแƒ˜ แƒกแƒ”แƒ แƒ•แƒ˜แƒกแƒ”แƒ‘แƒ˜แƒก แƒกแƒแƒ›แƒแƒ แƒ—แƒแƒ•แƒแƒ“, แƒ˜แƒงแƒ”แƒœแƒ”แƒ‘แƒก API Mail.ru Cloud Solutions-แƒ“แƒแƒœ (MCS) แƒ›แƒแƒœแƒฅแƒแƒœแƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒจแƒ•แƒ”แƒ‘แƒ˜แƒกแƒ แƒ“แƒ แƒ’แƒแƒฉแƒ”แƒ แƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก.

แƒ’แƒแƒ“แƒแƒฌแƒงแƒ•แƒ”แƒขแƒ˜แƒก แƒแƒ แƒฅแƒ˜แƒขแƒ”แƒฅแƒขแƒฃแƒ แƒ

  1. แƒ›แƒแƒ“แƒฃแƒšแƒ˜ autoscaler.py. แƒ˜แƒ’แƒ˜ แƒจแƒ”แƒ˜แƒชแƒแƒ•แƒก แƒกแƒแƒ› แƒ™แƒšแƒแƒกแƒก: 1) แƒแƒ›แƒ‘แƒแƒ แƒ—แƒแƒœ แƒ›แƒฃแƒจแƒแƒแƒ‘แƒ˜แƒก แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒ”แƒ‘แƒ˜, 2) MCS-แƒ—แƒแƒœ แƒ›แƒฃแƒจแƒแƒแƒ‘แƒ˜แƒก แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒ”แƒ‘แƒ˜, 3) แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒ”แƒ‘แƒ˜, แƒ แƒแƒ›แƒšแƒ”แƒ‘แƒ˜แƒช แƒฃแƒจแƒฃแƒแƒšแƒแƒ“ แƒฃแƒ™แƒแƒ•แƒจแƒ˜แƒ แƒ“แƒ”แƒ‘แƒ แƒแƒ•แƒขแƒแƒกแƒ™แƒแƒšแƒ”แƒ แƒ˜แƒก แƒšแƒแƒ’แƒ˜แƒ™แƒแƒก.
  2. แƒกแƒ™แƒ แƒ˜แƒžแƒขแƒ˜ observer.py. แƒแƒ แƒกแƒ”แƒ‘แƒ˜แƒ—แƒแƒ“ แƒ˜แƒก แƒจแƒ”แƒ“แƒ’แƒ”แƒ‘แƒ แƒกแƒฎแƒ•แƒแƒ“แƒแƒกแƒฎแƒ•แƒ แƒฌแƒ”แƒกแƒ”แƒ‘แƒ˜แƒกแƒ’แƒแƒœ: แƒ แƒแƒ“แƒ˜แƒก แƒ“แƒ แƒ แƒ แƒ›แƒแƒ›แƒ”แƒœแƒขแƒ”แƒ‘แƒจแƒ˜ แƒ’แƒแƒ›แƒแƒซแƒแƒฎแƒ”แƒ‘แƒ แƒแƒ•แƒขแƒแƒกแƒ™แƒแƒšแƒ”แƒ แƒ˜แƒก แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒ”แƒ‘แƒ˜.
  3. แƒ™แƒแƒœแƒคแƒ˜แƒ’แƒฃแƒ แƒแƒชแƒ˜แƒ˜แƒก แƒคแƒแƒ˜แƒšแƒ˜ 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:

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 แƒฉแƒ•แƒ”แƒœ แƒ’แƒแƒ“แƒแƒ•แƒชแƒ”แƒ›แƒ— แƒžแƒ แƒแƒ”แƒฅแƒขแƒ˜แƒก ID-แƒก แƒฆแƒ แƒฃแƒ‘แƒ”แƒšแƒจแƒ˜ แƒ“แƒ แƒ›แƒแƒ›แƒฎแƒ›แƒแƒ แƒ”แƒ‘แƒšแƒ˜แƒก ID-แƒก, แƒแƒกแƒ”แƒ•แƒ” แƒ›แƒ˜แƒก แƒžแƒแƒ แƒแƒšแƒก. แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒแƒจแƒ˜ vm_turn_on แƒฉแƒ•แƒ”แƒœ แƒ’แƒ•แƒ˜แƒœแƒ“แƒ แƒฉแƒแƒ•แƒ แƒ—แƒแƒ— แƒ”แƒ แƒ—-แƒ”แƒ แƒ—แƒ˜ แƒ›แƒแƒœแƒฅแƒแƒœแƒ. แƒšแƒแƒ’แƒ˜แƒ™แƒ แƒแƒฅ แƒชแƒแƒขแƒ แƒฃแƒคแƒ แƒ แƒ แƒ—แƒฃแƒšแƒ˜แƒ. แƒ™แƒแƒ“แƒ˜แƒก แƒ“แƒแƒกแƒแƒฌแƒงแƒ˜แƒกแƒจแƒ˜ แƒกแƒแƒ› แƒกแƒฎแƒ•แƒ แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒแƒก แƒ”แƒซแƒแƒฎแƒ˜แƒแƒœ: 1) แƒฃแƒœแƒ“แƒ แƒ›แƒ˜แƒ•แƒ˜แƒฆแƒแƒ— แƒŸแƒ”แƒขแƒแƒœแƒ˜, 2) แƒฐแƒแƒกแƒขแƒ˜แƒก แƒกแƒแƒฎแƒ”แƒšแƒ˜ แƒ’แƒแƒ“แƒแƒ•แƒ˜แƒงแƒ•แƒแƒœแƒแƒ— แƒแƒžแƒแƒ แƒแƒขแƒ˜แƒก แƒกแƒแƒฎแƒ”แƒšแƒแƒ“ 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

แƒแƒ•แƒขแƒแƒกแƒ™แƒแƒšแƒ”แƒ แƒ˜แƒก แƒ™แƒšแƒแƒกแƒ˜

แƒ”แƒก แƒ™แƒšแƒแƒกแƒ˜ แƒจแƒ”แƒ˜แƒชแƒแƒ•แƒก แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒ”แƒ‘แƒก, แƒ แƒแƒ›แƒšแƒ”แƒ‘แƒ˜แƒช แƒ“แƒแƒ™แƒแƒ•แƒจแƒ˜แƒ แƒ”แƒ‘แƒฃแƒšแƒ˜แƒ แƒ—แƒแƒ•แƒแƒ“ แƒแƒžแƒ”แƒ แƒแƒชแƒ˜แƒฃแƒš แƒšแƒแƒ’แƒ˜แƒ™แƒแƒกแƒ—แƒแƒœ.

แƒแƒกแƒ” แƒ’แƒแƒ›แƒแƒ˜แƒงแƒฃแƒ แƒ”แƒ‘แƒ แƒแƒ› แƒ™แƒšแƒแƒกแƒ˜แƒก แƒ™แƒแƒ“แƒ˜แƒก แƒœแƒแƒฌแƒ˜แƒšแƒ˜:

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. แƒกแƒ™แƒ แƒ˜แƒžแƒขแƒ˜แƒก แƒ“แƒแƒ›แƒ™แƒ•แƒ˜แƒ แƒ•แƒ”แƒ‘แƒ”แƒšแƒ˜.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, แƒ แƒแƒ“แƒ”แƒกแƒแƒช แƒฉแƒ•แƒ”แƒœ แƒแƒ  แƒ•แƒแƒ›แƒแƒขแƒ”แƒ‘แƒ— แƒแƒœ แƒแƒ  แƒ•แƒฎแƒกแƒœแƒ˜แƒ— แƒแƒ แƒแƒคแƒ”แƒ แƒก แƒ™แƒšแƒแƒกแƒขแƒ”แƒ แƒ˜แƒ“แƒแƒœ, แƒแƒ แƒแƒ›แƒ”แƒ“ แƒฃแƒ‘แƒ แƒแƒšแƒแƒ“ แƒ•แƒแƒ™แƒ•แƒ˜แƒ แƒ“แƒ”แƒ‘แƒ˜แƒ— แƒ“แƒแƒขแƒ•แƒ˜แƒ แƒ—แƒ•แƒแƒก. แƒ—แƒฃ แƒ˜แƒก แƒ“แƒแƒกแƒขแƒแƒ‘แƒ˜แƒšแƒฃแƒ แƒ“แƒ แƒ“แƒ แƒแƒžแƒขแƒ˜แƒ›แƒแƒšแƒฃแƒ แƒ˜ แƒ“แƒแƒขแƒ•แƒ˜แƒ แƒ—แƒ•แƒ˜แƒก แƒ›แƒœแƒ˜แƒจแƒ•แƒœแƒ”แƒšแƒแƒ‘แƒ”แƒ‘แƒ˜แƒก แƒ“แƒ”แƒ แƒ”แƒคแƒแƒœแƒจแƒ˜แƒ, แƒ›แƒแƒจแƒ˜แƒœ แƒฉแƒ•แƒ”แƒœ แƒฃแƒ‘แƒ แƒแƒšแƒแƒ“ แƒ•แƒแƒ’แƒ แƒซแƒ”แƒšแƒ”แƒ‘แƒ— แƒ›แƒแƒœแƒ˜แƒขแƒแƒ แƒ˜แƒœแƒ’แƒก. แƒ—แƒฃ แƒ”แƒ แƒ—แƒ˜ แƒ™แƒ•แƒแƒœแƒซแƒ˜ แƒแƒ  แƒ˜แƒงแƒ แƒกแƒแƒ™แƒ›แƒแƒ แƒ˜แƒกแƒ˜, แƒ›แƒแƒจแƒ˜แƒœ แƒ•แƒแƒ›แƒแƒขแƒ”แƒ‘แƒ— แƒ›แƒ”แƒแƒ แƒ”แƒก.

แƒ˜แƒ› แƒจแƒ”แƒ›แƒ—แƒฎแƒ•แƒ”แƒ•แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก, แƒ แƒแƒชแƒ แƒฌแƒ˜แƒœ แƒ’แƒ•แƒแƒฅแƒ•แƒก แƒ’แƒแƒ™แƒ•แƒ”แƒ—แƒ˜แƒšแƒ˜, แƒฃแƒ™แƒ•แƒ” แƒ–แƒฃแƒกแƒขแƒแƒ“ แƒ•แƒ˜แƒชแƒ˜แƒ—, แƒ แƒแƒ› แƒ”แƒ แƒ—แƒ˜ แƒ™แƒ•แƒแƒœแƒซแƒ˜ แƒแƒ  แƒ˜แƒฅแƒœแƒ”แƒ‘แƒ แƒกแƒแƒ™แƒ›แƒแƒ แƒ˜แƒกแƒ˜, แƒแƒ›แƒ˜แƒขแƒแƒ› แƒกแƒแƒกแƒฌแƒ แƒแƒคแƒแƒ“ แƒ•แƒ˜แƒฌแƒงแƒ”แƒ‘แƒ— แƒงแƒ•แƒ”แƒšแƒ แƒ—แƒแƒ•แƒ˜แƒกแƒฃแƒคแƒแƒš แƒ™แƒ•แƒแƒœแƒซแƒก แƒ“แƒ แƒ•แƒแƒ’แƒ แƒซแƒ”แƒšแƒ”แƒ‘แƒ— แƒ›แƒแƒ— แƒแƒฅแƒขแƒ˜แƒฃแƒ แƒแƒ‘แƒแƒก แƒ’แƒแƒ™แƒ•แƒ”แƒ—แƒ˜แƒšแƒ˜แƒก แƒ‘แƒแƒšแƒแƒ›แƒ“แƒ”. แƒ”แƒก แƒฎแƒ“แƒ”แƒ‘แƒ แƒแƒฅแƒขแƒ˜แƒ•แƒแƒ‘แƒ˜แƒก แƒ“แƒ แƒแƒ˜แƒก แƒแƒœแƒแƒ‘แƒ”แƒญแƒ“แƒ”แƒ‘แƒ˜แƒก แƒกแƒ˜แƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒ—.

แƒ“แƒแƒกแƒ™แƒ•แƒœแƒ

Autoscaler แƒแƒ แƒ˜แƒก แƒ™แƒแƒ แƒ’แƒ˜ แƒ“แƒ แƒ›แƒแƒกแƒแƒฎแƒ”แƒ แƒฎแƒ”แƒ‘แƒ”แƒšแƒ˜ แƒ’แƒแƒ“แƒแƒฌแƒงแƒ•แƒ”แƒขแƒ แƒ˜แƒ› แƒจแƒ”แƒ›แƒ—แƒฎแƒ•แƒ”แƒ•แƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก, แƒ แƒแƒ“แƒ”แƒกแƒแƒช แƒ—แƒฅแƒ•แƒ”แƒœ แƒ’แƒแƒœแƒ˜แƒชแƒ“แƒ˜แƒ— แƒแƒ แƒแƒ—แƒแƒœแƒแƒ‘แƒแƒ แƒ˜ แƒ™แƒแƒกแƒ”แƒขแƒฃแƒ แƒ˜ แƒ“แƒแƒขแƒ•แƒ˜แƒ แƒ—แƒ•แƒแƒก. แƒ—แƒฅแƒ•แƒ”แƒœ แƒ”แƒ แƒ—แƒ“แƒ แƒแƒฃแƒšแƒแƒ“ แƒ›แƒ˜แƒแƒฆแƒฌแƒ”แƒ•แƒ— แƒกแƒแƒกแƒฃแƒ แƒ•แƒ”แƒš แƒ™แƒแƒกแƒ”แƒขแƒฃแƒ  แƒ™แƒแƒœแƒคแƒ˜แƒ’แƒฃแƒ แƒแƒชแƒ˜แƒแƒก แƒžแƒ˜แƒ™แƒฃแƒ แƒ˜ แƒ“แƒแƒขแƒ•แƒ˜แƒ แƒ—แƒ•แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก แƒ“แƒ แƒแƒ›แƒแƒ•แƒ“แƒ แƒแƒฃแƒšแƒแƒ“ แƒแƒ  แƒ˜แƒœแƒแƒฎแƒแƒ•แƒ— แƒแƒ› แƒ™แƒšแƒแƒกแƒขแƒ”แƒ แƒก แƒ“แƒแƒขแƒ•แƒ˜แƒ แƒ—แƒ•แƒ˜แƒก แƒ“แƒ แƒแƒก, แƒ“แƒแƒ–แƒแƒ’แƒแƒ•แƒ— แƒคแƒฃแƒšแƒก. แƒ’แƒแƒ แƒ“แƒ แƒแƒ›แƒ˜แƒกแƒ, แƒ”แƒก แƒงแƒ•แƒ”แƒšแƒแƒคแƒ”แƒ แƒ˜ แƒแƒ•แƒขแƒแƒ›แƒแƒขแƒฃแƒ แƒแƒ“ แƒฎแƒ“แƒ”แƒ‘แƒ แƒ—แƒฅแƒ•แƒ”แƒœแƒ˜ แƒ›แƒแƒœแƒแƒฌแƒ˜แƒšแƒ”แƒแƒ‘แƒ˜แƒก แƒ’แƒแƒ แƒ”แƒจแƒ”. แƒ—แƒแƒ•แƒแƒ“ แƒแƒ•แƒขแƒแƒกแƒ™แƒแƒšแƒ”แƒ แƒ˜ แƒกแƒฎแƒ•แƒ แƒแƒ แƒแƒคแƒ”แƒ แƒ˜แƒ, แƒ—แƒฃ แƒแƒ แƒ แƒ™แƒšแƒแƒกแƒขแƒ”แƒ  แƒ›แƒ”แƒœแƒ”แƒฏแƒ”แƒ แƒ˜แƒก API-แƒกแƒ แƒ“แƒ แƒฆแƒ แƒฃแƒ‘แƒšแƒแƒ•แƒแƒœแƒ˜ แƒžแƒ แƒแƒ•แƒแƒ˜แƒ“แƒ”แƒ แƒ˜แƒก API-แƒก แƒ›แƒ˜แƒ›แƒแƒ แƒ— แƒ›แƒแƒ—แƒฎแƒแƒ•แƒœแƒ”แƒ‘แƒ˜แƒก แƒœแƒแƒ™แƒ แƒ”แƒ‘แƒ˜, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒ“แƒแƒฌแƒ”แƒ แƒ˜แƒšแƒ˜แƒ แƒ’แƒแƒ แƒ™แƒ•แƒ”แƒฃแƒšแƒ˜ แƒšแƒแƒ’แƒ˜แƒ™แƒ˜แƒก แƒ›แƒ˜แƒฎแƒ”แƒ“แƒ•แƒ˜แƒ—. แƒ แƒแƒช แƒแƒฃแƒชแƒ˜แƒšแƒ”แƒ‘แƒšแƒแƒ“ แƒฃแƒœแƒ“แƒ แƒ’แƒแƒฎแƒกแƒแƒ•แƒ“แƒ”แƒ—, แƒแƒ แƒ˜แƒก แƒ™แƒ•แƒแƒœแƒซแƒ”แƒ‘แƒ˜แƒก แƒ“แƒแƒงแƒแƒคแƒ 3 แƒขแƒ˜แƒžแƒแƒ“, แƒ แƒแƒ’แƒแƒ แƒช แƒแƒ“แƒ แƒ” แƒ“แƒแƒ•แƒฌแƒ”แƒ แƒ”แƒ—. แƒ“แƒ แƒ‘แƒ”แƒ“แƒœแƒ˜แƒ”แƒ แƒ˜ แƒ˜แƒฅแƒœแƒ”แƒ‘แƒ˜.

แƒฌแƒงแƒแƒ แƒ: www.habr.com

แƒแƒฎแƒแƒšแƒ˜ แƒ™แƒแƒ›แƒ”แƒœแƒขแƒแƒ แƒ˜แƒก แƒ“แƒแƒ›แƒแƒขแƒ”แƒ‘แƒ