āĻāĻ•āĻŸāĻŋ āĻ•ā§āĻ˛āĻžāĻ¸ā§āĻŸāĻžāĻ°ā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻ•ā§€āĻ­āĻžāĻŦā§‡ āĻ†āĻĒāĻ¨āĻžāĻ° āĻ¨āĻŋāĻœā§‡āĻ° āĻ…āĻŸā§‹āĻ¸ā§āĻ•ā§‡āĻ˛āĻžāĻ° āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°āĻŦā§‡āĻ¨

āĻšā§āĻ¯āĻžāĻ˛ā§‹! āĻ†āĻŽāĻ°āĻž āĻŽāĻžāĻ¨ā§āĻˇāĻ•ā§‡ āĻŦāĻĄāĻŧ āĻĄā§‡āĻŸāĻž āĻ¨āĻŋāĻ¯āĻŧā§‡ āĻ•āĻžāĻœ āĻ•āĻ°āĻžāĻ° āĻĒā§āĻ°āĻļāĻŋāĻ•ā§āĻˇāĻŖ āĻĻāĻŋāĻ‡āĨ¤ āĻ¨āĻŋāĻœāĻ¸ā§āĻŦ āĻ•ā§āĻ˛āĻžāĻ¸ā§āĻŸāĻžāĻ° āĻ›āĻžāĻĄāĻŧāĻž āĻŦāĻĄāĻŧ āĻĄā§‡āĻŸāĻžāĻ¤ā§‡ āĻāĻ•āĻŸāĻŋ āĻļāĻŋāĻ•ā§āĻˇāĻžāĻŽā§‚āĻ˛āĻ• āĻĒā§āĻ°ā§‹āĻ—ā§āĻ°āĻžāĻŽ āĻ•āĻ˛ā§āĻĒāĻ¨āĻž āĻ•āĻ°āĻž āĻ…āĻ¸āĻŽā§āĻ­āĻŦ, āĻ¯āĻžāĻ° āĻ‰āĻĒāĻ° āĻ¸āĻŽāĻ¸ā§āĻ¤ āĻ…āĻ‚āĻļāĻ—ā§āĻ°āĻšāĻŖāĻ•āĻžāĻ°ā§€ āĻāĻ•āĻ¸āĻžāĻĨā§‡ āĻ•āĻžāĻœ āĻ•āĻ°ā§‡āĨ¤ āĻāĻ‡ āĻ•āĻžāĻ°āĻŖā§‡, āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻĒā§āĻ°ā§‹āĻ—ā§āĻ°āĻžāĻŽā§‡ āĻ¸āĻ°ā§āĻŦāĻĻāĻž āĻāĻŸāĻŋ āĻĨāĻžāĻ•ā§‡ 🙂 āĻ†āĻŽāĻ°āĻž āĻāĻŸāĻŋāĻ° āĻ•āĻ¨āĻĢāĻŋāĻ—āĻžāĻ°ā§‡āĻļāĻ¨, āĻŸāĻŋāĻ‰āĻ¨āĻŋāĻ‚ āĻāĻŦāĻ‚ āĻĒā§āĻ°āĻļāĻžāĻ¸āĻ¨ā§‡ āĻ¨āĻŋāĻ¯ā§āĻ•ā§āĻ¤ āĻĨāĻžāĻ•āĻŋ āĻāĻŦāĻ‚ āĻ›ā§‡āĻ˛ā§‡āĻ°āĻž āĻ¸āĻ°āĻžāĻ¸āĻ°āĻŋ āĻ¸ā§‡āĻ–āĻžāĻ¨ā§‡ MapReduce āĻšāĻžāĻ•āĻ°āĻŋ āĻšāĻžāĻ˛ā§ āĻ•āĻ°ā§‡ āĻāĻŦāĻ‚ āĻ¸ā§āĻĒāĻžāĻ°ā§āĻ• āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡āĨ¤

āĻāĻ‡ āĻĒā§‹āĻ¸ā§āĻŸā§‡ āĻ†āĻŽāĻ°āĻž āĻ†āĻĒāĻ¨āĻžāĻ•ā§‡ āĻŦāĻ˛āĻŦ āĻ•āĻŋāĻ­āĻžāĻŦā§‡ āĻ†āĻŽāĻ°āĻž āĻ•ā§āĻ˛āĻžāĻ‰āĻĄ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡ āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻ¨āĻŋāĻœāĻ¸ā§āĻŦ āĻ…āĻŸā§‹āĻ¸ā§āĻ•ā§‡āĻ˛āĻžāĻ° āĻ˛āĻŋāĻ–ā§‡ āĻ…āĻ¸āĻŽ āĻ•ā§āĻ˛āĻžāĻ¸ā§āĻŸāĻžāĻ° āĻ˛ā§‹āĻĄāĻŋāĻ‚āĻ¯āĻŧā§‡āĻ° āĻ¸āĻŽāĻ¸ā§āĻ¯āĻž āĻ¸āĻŽāĻžāĻ§āĻžāĻ¨ āĻ•āĻ°ā§‡āĻ›āĻŋāĨ¤ Mail.ru āĻ•ā§āĻ˛āĻžāĻ‰āĻĄ āĻ¸āĻ˛āĻŋāĻ‰āĻļāĻ¨.

āĻ¸āĻŽāĻ¸ā§āĻ¯āĻž

āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻ•ā§āĻ˛āĻžāĻ¸ā§āĻŸāĻžāĻ° āĻāĻ•āĻŸāĻŋ āĻ¸āĻžāĻ§āĻžāĻ°āĻŖ āĻŽā§‹āĻĄā§‡ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻž āĻšāĻ¯āĻŧ āĻ¨āĻž. āĻ¨āĻŋāĻˇā§āĻĒāĻ¤ā§āĻ¤āĻŋ āĻ…āĻ¤ā§āĻ¯āĻ¨ā§āĻ¤ āĻ…āĻ¸āĻŽ. āĻ‰āĻĻāĻžāĻšāĻ°āĻŖāĻ¸ā§āĻŦāĻ°ā§‚āĻĒ, āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°āĻŋāĻ• āĻ•ā§āĻ˛āĻžāĻ¸ āĻ†āĻ›ā§‡, āĻ¯āĻ–āĻ¨ 30 āĻœāĻ¨ āĻāĻŦāĻ‚ āĻāĻ•āĻœāĻ¨ āĻļāĻŋāĻ•ā§āĻˇāĻ• āĻ•ā§āĻ˛āĻžāĻ¸ā§āĻŸāĻžāĻ°ā§‡ āĻ¯āĻžāĻ¨ āĻāĻŦāĻ‚ āĻāĻŸāĻŋ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻž āĻļā§āĻ°ā§ āĻ•āĻ°ā§‡āĻ¨āĨ¤ āĻ…āĻĨāĻŦāĻž āĻ†āĻŦāĻžāĻ°, āĻ¸āĻŽāĻ¯āĻŧāĻ¸ā§€āĻŽāĻžāĻ° āĻ†āĻ—ā§‡ āĻāĻŽāĻ¨ āĻ•āĻŋāĻ›ā§ āĻĻāĻŋāĻ¨ āĻ†āĻ›ā§‡ āĻ¯āĻ–āĻ¨ āĻ˛ā§‹āĻĄ āĻ…āĻ¨ā§‡āĻ• āĻŦā§‡āĻĄāĻŧā§‡ āĻ¯āĻžāĻ¯āĻŧāĨ¤ āĻŦāĻžāĻ•āĻŋ āĻ¸āĻŽāĻ¯āĻŧ āĻ•ā§āĻ˛āĻžāĻ¸ā§āĻŸāĻžāĻ°āĻŸāĻŋ āĻ†āĻ¨ā§āĻĄāĻžāĻ°āĻ˛ā§‹āĻĄ āĻŽā§‹āĻĄā§‡ āĻ•āĻžāĻœ āĻ•āĻ°ā§‡āĨ¤

āĻ¸āĻŽāĻžāĻ§āĻžāĻ¨ #1 āĻšāĻ˛ āĻāĻŽāĻ¨ āĻāĻ•āĻŸāĻŋ āĻ•ā§āĻ˛āĻžāĻ¸ā§āĻŸāĻžāĻ° āĻ°āĻžāĻ–āĻž āĻ¯āĻž āĻĒāĻŋāĻ• āĻ˛ā§‹āĻĄ āĻ¸āĻšā§āĻ¯ āĻ•āĻ°āĻŦā§‡, āĻ•āĻŋāĻ¨ā§āĻ¤ā§ āĻŦāĻžāĻ•āĻŋ āĻ¸āĻŽāĻ¯āĻŧ āĻ¨āĻŋāĻˇā§āĻ•ā§āĻ°āĻŋāĻ¯āĻŧ āĻĨāĻžāĻ•āĻŦā§‡āĨ¤

āĻ¸āĻŽāĻžāĻ§āĻžāĻ¨ # 2 āĻšāĻ˛ āĻāĻ•āĻŸāĻŋ āĻ›ā§‹āĻŸ āĻ•ā§āĻ˛āĻžāĻ¸ā§āĻŸāĻžāĻ° āĻ°āĻžāĻ–āĻž, āĻ¯ā§‡āĻ–āĻžāĻ¨ā§‡ āĻ†āĻĒāĻ¨āĻŋ āĻ•ā§āĻ˛āĻžāĻ¸ā§‡āĻ° āĻ†āĻ—ā§‡ āĻāĻŦāĻ‚ āĻĒāĻŋāĻ• āĻ˛ā§‹āĻĄā§‡āĻ° āĻ¸āĻŽāĻ¯āĻŧ āĻŽā§āĻ¯āĻžāĻ¨ā§āĻ¯āĻŧāĻžāĻ˛āĻŋ āĻ¨ā§‹āĻĄ āĻ¯ā§‹āĻ— āĻ•āĻ°ā§‡āĻ¨āĨ¤

āĻ¸āĻŽāĻžāĻ§āĻžāĻ¨ #3 āĻšāĻ˛ āĻāĻ•āĻŸāĻŋ āĻ›ā§‹āĻŸ āĻ•ā§āĻ˛āĻžāĻ¸ā§āĻŸāĻžāĻ° āĻ°āĻžāĻ–āĻž āĻāĻŦāĻ‚ āĻāĻ•āĻŸāĻŋ āĻ…āĻŸā§‹āĻ¸ā§āĻ•ā§‡āĻ˛āĻžāĻ° āĻ˛āĻŋāĻ–āĻ¤ā§‡ āĻšāĻŦā§‡ āĻ¯āĻž āĻ•ā§āĻ˛āĻžāĻ¸ā§āĻŸāĻžāĻ°ā§‡āĻ° āĻŦāĻ°ā§āĻ¤āĻŽāĻžāĻ¨ āĻ˛ā§‹āĻĄ āĻ¨āĻŋāĻ°ā§€āĻ•ā§āĻˇāĻŖ āĻ•āĻ°āĻŦā§‡ āĻāĻŦāĻ‚ āĻŦāĻŋāĻ­āĻŋāĻ¨ā§āĻ¨ API āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡ āĻ•ā§āĻ˛āĻžāĻ¸ā§āĻŸāĻžāĻ° āĻĨā§‡āĻ•ā§‡ āĻ¨ā§‹āĻĄāĻ—ā§āĻ˛āĻŋ āĻ¯ā§‹āĻ— āĻ“ āĻ…āĻĒāĻ¸āĻžāĻ°āĻŖ āĻ•āĻ°āĻŦā§‡āĨ¤

āĻāĻ‡ āĻĒā§‹āĻ¸ā§āĻŸā§‡ āĻ†āĻŽāĻ°āĻž āĻ¸āĻŽāĻžāĻ§āĻžāĻ¨ #3 āĻ¸āĻŽā§āĻĒāĻ°ā§āĻ•ā§‡ āĻ•āĻĨāĻž āĻŦāĻ˛āĻŦāĨ¤ āĻāĻ‡ āĻ…āĻŸā§‹āĻ¸ā§āĻ•ā§‡āĻ˛āĻžāĻ° āĻ…āĻ­ā§āĻ¯āĻ¨ā§āĻ¤āĻ°ā§€āĻŖ āĻŦāĻŋāĻˇāĻ¯āĻŧāĻ—ā§āĻ˛āĻŋāĻ° āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤ā§‡ āĻŦāĻžāĻšā§āĻ¯āĻŋāĻ• āĻ•āĻžāĻ°āĻŖāĻ—ā§āĻ˛āĻŋāĻ° āĻ‰āĻĒāĻ° āĻ…āĻ¤ā§āĻ¯āĻ¨ā§āĻ¤ āĻ¨āĻŋāĻ°ā§āĻ­āĻ°āĻļā§€āĻ˛ āĻāĻŦāĻ‚ āĻĒā§āĻ°āĻĻāĻžāĻ¨āĻ•āĻžāĻ°ā§€āĻ°āĻž āĻĒā§āĻ°āĻžāĻ¯āĻŧāĻļāĻ‡ āĻāĻŸāĻŋ āĻĒā§āĻ°āĻĻāĻžāĻ¨ āĻ•āĻ°ā§‡ āĻ¨āĻžāĨ¤ āĻ†āĻŽāĻ°āĻž Mail.ru āĻ•ā§āĻ˛āĻžāĻ‰āĻĄ āĻ¸āĻ˛āĻŋāĻ‰āĻļāĻ¨ āĻ•ā§āĻ˛āĻžāĻ‰āĻĄ āĻ…āĻŦāĻ•āĻžāĻ āĻžāĻŽā§‹ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻŋ āĻāĻŦāĻ‚ MCS API āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡ āĻāĻ•āĻŸāĻŋ āĻ…āĻŸā§‹āĻ¸ā§āĻ•ā§‡āĻ˛āĻžāĻ° āĻ˛āĻŋāĻ–ā§‡āĻ›āĻŋāĨ¤ āĻāĻŦāĻ‚ āĻ¯ā§‡āĻšā§‡āĻ¤ā§ āĻ†āĻŽāĻ°āĻž āĻĄā§‡āĻŸāĻžāĻ° āĻ¸āĻžāĻĨā§‡ āĻ•ā§€āĻ­āĻžāĻŦā§‡ āĻ•āĻžāĻœ āĻ•āĻ°āĻ¤ā§‡ āĻšāĻ¯āĻŧ āĻ¤āĻž āĻļāĻŋāĻ–āĻŋāĻ¯āĻŧā§‡āĻ›āĻŋ, āĻ¤āĻžāĻ‡ āĻ†āĻŽāĻ°āĻž āĻĻā§‡āĻ–āĻžāĻ¨ā§‹āĻ° āĻ¸āĻŋāĻĻā§āĻ§āĻžāĻ¨ā§āĻ¤ āĻ¨āĻŋāĻ¯āĻŧā§‡āĻ›āĻŋ āĻ¯ā§‡ āĻ†āĻĒāĻ¨āĻŋ āĻ•ā§€āĻ­āĻžāĻŦā§‡ āĻ†āĻĒāĻ¨āĻžāĻ° āĻ¨āĻŋāĻœā§‡āĻ° āĻ‰āĻĻā§āĻĻā§‡āĻļā§āĻ¯ā§‡ āĻāĻ•āĻŸāĻŋ āĻ…āĻ¨ā§āĻ°ā§‚āĻĒ āĻ…āĻŸā§‹āĻ¸ā§āĻ•ā§‡āĻ˛āĻžāĻ° āĻ˛āĻŋāĻ–āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĻ¨ āĻāĻŦāĻ‚ āĻāĻŸāĻŋ āĻ†āĻĒāĻ¨āĻžāĻ° āĻ•ā§āĻ˛āĻžāĻ‰āĻĄā§‡āĻ° āĻ¸āĻžāĻĨā§‡ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĻ¨āĨ¤

āĻĒā§‚āĻ°ā§āĻŦāĻļāĻ°ā§āĻ¤

āĻĒā§āĻ°āĻĨāĻŽāĻ¤, āĻ†āĻĒāĻ¨āĻžāĻ° āĻāĻ•āĻŸāĻŋ Hadoop āĻ•ā§āĻ˛āĻžāĻ¸ā§āĻŸāĻžāĻ° āĻĨāĻžāĻ•āĻ¤ā§‡ āĻšāĻŦā§‡āĨ¤ āĻ‰āĻĻāĻžāĻšāĻ°āĻŖāĻ¸ā§āĻŦāĻ°ā§‚āĻĒ, āĻ†āĻŽāĻ°āĻž HDP āĻŦāĻŋāĻ¤āĻ°āĻŖ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻŋāĨ¤

āĻ†āĻĒāĻ¨āĻžāĻ° āĻ¨ā§‹āĻĄāĻ—ā§āĻ˛āĻŋ āĻĻā§āĻ°ā§āĻ¤ āĻ¯ā§‹āĻ— āĻāĻŦāĻ‚ āĻ¸āĻ°āĻžāĻ¨ā§‹āĻ° āĻœāĻ¨ā§āĻ¯, āĻ†āĻĒāĻ¨āĻžāĻ° āĻ…āĻŦāĻļā§āĻ¯āĻ‡ āĻ¨ā§‹āĻĄāĻ—ā§āĻ˛āĻŋāĻ° āĻŽāĻ§ā§āĻ¯ā§‡ āĻ­ā§‚āĻŽāĻŋāĻ•āĻžāĻ—ā§āĻ˛āĻŋāĻ° āĻāĻ•āĻŸāĻŋ āĻ¨āĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āĻŸ āĻŦāĻŋāĻ¤āĻ°āĻŖ āĻĨāĻžāĻ•āĻ¤ā§‡ āĻšāĻŦā§‡āĨ¤

  1. āĻŽāĻžāĻ¸ā§āĻŸāĻžāĻ° āĻ¨ā§‹āĻĄāĨ¤ āĻ āĻŋāĻ• āĻ†āĻ›ā§‡, āĻŦāĻŋāĻļā§‡āĻˇ āĻ•āĻ°ā§‡ āĻ•āĻŋāĻ›ā§ āĻŦā§āĻ¯āĻžāĻ–ā§āĻ¯āĻž āĻ•āĻ°āĻžāĻ° āĻĻāĻ°āĻ•āĻžāĻ° āĻ¨ā§‡āĻ‡: āĻ•ā§āĻ˛āĻžāĻ¸ā§āĻŸāĻžāĻ°ā§‡āĻ° āĻĒā§āĻ°āĻ§āĻžāĻ¨ āĻ¨ā§‹āĻĄ, āĻ¯āĻžāĻ° āĻ‰āĻĒāĻ°, āĻ‰āĻĻāĻžāĻšāĻ°āĻŖāĻ¸ā§āĻŦāĻ°ā§‚āĻĒ, āĻ¸ā§āĻĒāĻžāĻ°ā§āĻ• āĻĄā§āĻ°āĻžāĻ‡āĻ­āĻžāĻ° āĻšāĻžāĻ˛ā§ āĻšāĻ¯āĻŧ, āĻ¯āĻĻāĻŋ āĻ†āĻĒāĻ¨āĻŋ āĻ‡āĻ¨ā§āĻŸāĻžāĻ°ā§‡āĻ•ā§āĻŸāĻŋāĻ­ āĻŽā§‹āĻĄ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡āĻ¨āĨ¤
  2. āĻ¤āĻžāĻ°āĻŋāĻ– āĻ¨ā§‹āĻĄ. āĻāĻŸāĻŋ āĻ¸ā§‡āĻ‡ āĻ¨ā§‹āĻĄ āĻ¯ā§‡āĻ–āĻžāĻ¨ā§‡ āĻ†āĻĒāĻ¨āĻŋ HDFS-āĻ āĻĄā§‡āĻŸāĻž āĻ¸āĻžā§āĻšāĻ¯āĻŧ āĻ•āĻ°ā§‡āĻ¨ āĻāĻŦāĻ‚ āĻ¯ā§‡āĻ–āĻžāĻ¨ā§‡ āĻ—āĻŖāĻ¨āĻž āĻ•āĻ°āĻž āĻšāĻ¯āĻŧāĨ¤
  3. āĻ•āĻŽā§āĻĒāĻŋāĻ‰āĻŸāĻŋāĻ‚ āĻ¨ā§‹āĻĄāĨ¤ āĻāĻŸāĻŋ āĻāĻŽāĻ¨ āĻāĻ•āĻŸāĻŋ āĻ¨ā§‹āĻĄ āĻ¯ā§‡āĻ–āĻžāĻ¨ā§‡ āĻ†āĻĒāĻ¨āĻŋ HDFS-āĻ āĻ•āĻŋāĻ›ā§ āĻ¸āĻžā§āĻšāĻ¯āĻŧ āĻ•āĻ°ā§‡āĻ¨ āĻ¨āĻž, āĻ•āĻŋāĻ¨ā§āĻ¤ā§ āĻ¯ā§‡āĻ–āĻžāĻ¨ā§‡ āĻ—āĻŖāĻ¨āĻž āĻšāĻ¯āĻŧāĨ¤

āĻ—ā§āĻ°ā§āĻ¤ā§āĻŦāĻĒā§‚āĻ°ā§āĻŖ āĻĒāĻ¯āĻŧā§‡āĻ¨ā§āĻŸ. āĻ¤ā§ƒāĻ¤ā§€āĻ¯āĻŧ āĻ§āĻ°āĻ¨ā§‡āĻ° āĻ¨ā§‹āĻĄā§‡āĻ° āĻ•āĻžāĻ°āĻŖā§‡ āĻ…āĻŸā§‹āĻ¸ā§āĻ•ā§‡āĻ˛āĻŋāĻ‚ āĻ˜āĻŸāĻŦā§‡āĨ¤ āĻ†āĻĒāĻ¨āĻŋ āĻ¯āĻĻāĻŋ āĻĻā§āĻŦāĻŋāĻ¤ā§€āĻ¯āĻŧ āĻĒā§āĻ°āĻ•āĻžāĻ°ā§‡āĻ° āĻ¨ā§‹āĻĄāĻ—ā§āĻ˛āĻŋ āĻ¨ā§‡āĻ“āĻ¯āĻŧāĻž āĻāĻŦāĻ‚ āĻ¯ā§‹āĻ— āĻ•āĻ°āĻž āĻļā§āĻ°ā§ āĻ•āĻ°ā§‡āĻ¨, āĻĒā§āĻ°āĻ¤āĻŋāĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻžāĻ° āĻ—āĻ¤āĻŋ āĻ–ā§āĻŦ āĻ•āĻŽ āĻšāĻŦā§‡ - āĻĄāĻŋāĻ•āĻŽāĻŋāĻļāĻ¨ āĻāĻŦāĻ‚ āĻ°āĻŋāĻ•āĻŽāĻŋāĻŸ āĻ•āĻ°āĻ¤ā§‡ āĻ†āĻĒāĻ¨āĻžāĻ° āĻ•ā§āĻ˛āĻžāĻ¸ā§āĻŸāĻžāĻ°ā§‡ āĻ˜āĻ¨ā§āĻŸāĻž āĻ˛āĻžāĻ—āĻŦā§‡ā§ˇ āĻāĻŸāĻŋ, āĻ…āĻŦāĻļā§āĻ¯āĻ‡, āĻ†āĻĒāĻ¨āĻŋ āĻ…āĻŸā§‹āĻ¸ā§āĻ•ā§‡āĻ˛āĻŋāĻ‚ āĻĨā§‡āĻ•ā§‡ āĻ¯āĻž āĻ†āĻļāĻž āĻ•āĻ°ā§‡āĻ¨ āĻ¤āĻž āĻ¨āĻ¯āĻŧāĨ¤ āĻ¯ā§‡, āĻ†āĻŽāĻ°āĻž āĻĒā§āĻ°āĻĨāĻŽ āĻāĻŦāĻ‚ āĻĻā§āĻŦāĻŋāĻ¤ā§€āĻ¯āĻŧ āĻ§āĻ°āĻ¨ā§‡āĻ° āĻ¨ā§‹āĻĄ āĻ¸ā§āĻĒāĻ°ā§āĻļ āĻ¨āĻž. āĻ¤āĻžāĻ°āĻž āĻāĻ•āĻŸāĻŋ āĻ¨ā§āĻ¯ā§‚āĻ¨āĻ¤āĻŽ āĻ•āĻžāĻ°ā§āĻ¯āĻ•āĻ° āĻ•ā§āĻ˛āĻžāĻ¸ā§āĻŸāĻžāĻ° āĻĒā§āĻ°āĻ¤āĻŋāĻ¨āĻŋāĻ§āĻŋāĻ¤ā§āĻŦ āĻ•āĻ°āĻŦā§‡ āĻ¯āĻž āĻĒā§āĻ°ā§‹āĻ—ā§āĻ°āĻžāĻŽā§‡āĻ° āĻ¸āĻŽāĻ¯āĻŧāĻ•āĻžāĻ˛ āĻœā§āĻĄāĻŧā§‡ āĻŦāĻŋāĻĻā§āĻ¯āĻŽāĻžāĻ¨ āĻĨāĻžāĻ•āĻŦā§‡āĨ¤

āĻ¸ā§āĻ¤āĻ°āĻžāĻ‚, āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻ…āĻŸā§‹āĻ¸ā§āĻ•ā§‡āĻ˛āĻžāĻ° āĻĒāĻžāĻ‡āĻĨāĻ¨ 3 āĻ āĻ˛ā§‡āĻ–āĻž āĻ†āĻ›ā§‡, āĻ•ā§āĻ˛āĻžāĻ¸ā§āĻŸāĻžāĻ° āĻĒāĻ°āĻŋāĻˇā§‡āĻŦāĻžāĻ—ā§āĻ˛āĻŋ āĻĒāĻ°āĻŋāĻšāĻžāĻ˛āĻ¨āĻž āĻ•āĻ°āĻ¤ā§‡ Ambari API āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡, āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡ Mail.ru āĻ•ā§āĻ˛āĻžāĻ‰āĻĄ āĻ¸āĻ˛āĻŋāĻ‰āĻļāĻ¨ āĻĨā§‡āĻ•ā§‡ API āĻŽā§‡āĻļāĻŋāĻ¨ āĻļā§āĻ°ā§ āĻāĻŦāĻ‚ āĻŦāĻ¨ā§āĻ§ āĻ•āĻ°āĻžāĻ° āĻœāĻ¨ā§āĻ¯ (MCS)āĨ¤

āĻ¸āĻŽāĻžāĻ§āĻžāĻ¨ āĻ†āĻ°ā§āĻ•āĻŋāĻŸā§‡āĻ•āĻšāĻžāĻ°

  1. āĻŽāĻĄāĻŋāĻ‰āĻ˛ autoscaler.py. āĻāĻŸāĻŋāĻ¤ā§‡ āĻ¤āĻŋāĻ¨āĻŸāĻŋ āĻļā§āĻ°ā§‡āĻŖā§€ āĻ°āĻ¯āĻŧā§‡āĻ›ā§‡: 1) Ambari āĻāĻ° āĻ¸āĻžāĻĨā§‡ āĻ•āĻžāĻœ āĻ•āĻ°āĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻĢāĻžāĻ‚āĻļāĻ¨, 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 āĻāĻ–āĻžāĻ¨ā§‡ Ambari āĻāĻ° āĻœāĻ¨ā§āĻ¯ āĻ†āĻĒāĻ¨āĻžāĻ° āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°āĻ•āĻžāĻ°ā§€āĻ° āĻ¨āĻžāĻŽ āĻāĻŦāĻ‚ āĻĒāĻžāĻ¸āĻ“āĻ¯āĻŧāĻžāĻ°ā§āĻĄ: auth = ('login', 'password').

āĻĢāĻžāĻ‚āĻļāĻ¨āĻŸāĻŋ āĻ¨āĻŋāĻœā§‡āĻ‡ REST API-āĻāĻ° āĻŽāĻžāĻ§ā§āĻ¯āĻŽā§‡ Ambari-āĻ¤ā§‡ āĻ•āĻ¯āĻŧā§‡āĻ•āĻŸāĻŋ āĻ•āĻ˛ āĻ›āĻžāĻĄāĻŧāĻž āĻ†āĻ° āĻ•āĻŋāĻ›ā§āĻ‡ āĻ¨āĻ¯āĻŧāĨ¤ āĻ¯ā§ŒāĻ•ā§āĻ¤āĻŋāĻ• āĻĻā§ƒāĻˇā§āĻŸāĻŋāĻ•ā§‹āĻŖ āĻĨā§‡āĻ•ā§‡, āĻ†āĻŽāĻ°āĻž āĻĒā§āĻ°āĻĨāĻŽā§‡ āĻāĻ•āĻŸāĻŋ āĻ¨ā§‹āĻĄā§‡ āĻšāĻ˛āĻŽāĻžāĻ¨ āĻĒāĻ°āĻŋāĻˇā§‡āĻŦāĻžāĻ—ā§āĻ˛āĻŋāĻ° āĻāĻ•āĻŸāĻŋ āĻ¤āĻžāĻ˛āĻŋāĻ•āĻž āĻĒāĻžāĻ‡ āĻāĻŦāĻ‚ āĻ¤āĻžāĻ°āĻĒāĻ° āĻāĻ•āĻŸāĻŋ āĻĒā§āĻ°āĻĻāĻ¤ā§āĻ¤ āĻ•ā§āĻ˛āĻžāĻ¸ā§āĻŸāĻžāĻ°ā§‡, āĻāĻ•āĻŸāĻŋ āĻĒā§āĻ°āĻĻāĻ¤ā§āĻ¤ āĻ¨ā§‹āĻĄā§‡, āĻ¤āĻžāĻ˛āĻŋāĻ•āĻž āĻĨā§‡āĻ•ā§‡ āĻ°āĻžāĻœā§āĻ¯ā§‡ āĻĒāĻ°āĻŋāĻˇā§‡āĻŦāĻžāĻ—ā§āĻ˛āĻŋ āĻ¸ā§āĻĨāĻžāĻ¨āĻžāĻ¨ā§āĻ¤āĻ° āĻ•āĻ°āĻ¤ā§‡ āĻŦāĻ˛āĻŋā§ˇ 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) āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻšā§‹āĻ¸ā§āĻŸāĻ¨āĻžāĻŽāĻŸāĻŋāĻ•ā§‡ āĻāĻŽāĻ¸āĻŋāĻāĻ¸-āĻ āĻŽā§‡āĻļāĻŋāĻ¨ā§‡āĻ° āĻ¨āĻžāĻŽā§‡ āĻ°ā§‚āĻĒāĻžāĻ¨ā§āĻ¤āĻ° āĻ•āĻ°āĻ¤ā§‡ āĻšāĻŦā§‡, 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, āĻ¨ā§‹āĻĄā§‡āĻ° āĻāĻ•āĻŸāĻŋ āĻ¤āĻžāĻ˛āĻŋāĻ•āĻž āĻ¯āĻž āĻ¸ā§āĻ•ā§‡āĻ˛āĻŋāĻ‚ āĻ•āĻ°āĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻ…āĻ¨ā§āĻŽā§‹āĻĻāĻŋāĻ¤, āĻ¸ā§‡āĻ‡āĻ¸āĻžāĻĨā§‡ āĻ¨ā§‹āĻĄ āĻ•āĻ¨āĻĢāĻŋāĻ—āĻžāĻ°ā§‡āĻļāĻ¨ āĻĒāĻ°āĻžāĻŽāĻŋāĻ¤āĻŋ: YARN-āĻ āĻ¨ā§‹āĻĄā§‡ āĻŦāĻ°āĻžāĻĻā§āĻĻ āĻŽā§‡āĻŽāĻ°āĻŋ āĻāĻŦāĻ‚ cpuāĨ¤ āĻāĻ›āĻžāĻĄāĻŧāĻžāĻ“ 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, āĻ¯āĻ–āĻ¨ āĻ†āĻŽāĻ°āĻž āĻ•ā§āĻ˛āĻžāĻ¸ā§āĻŸāĻžāĻ° āĻĨā§‡āĻ•ā§‡ āĻ•āĻŋāĻ›ā§ āĻ¯ā§‹āĻ— āĻŦāĻž āĻ…āĻĒāĻ¸āĻžāĻ°āĻŖ āĻ•āĻ°āĻŋ āĻ¨āĻž, āĻ¤āĻŦā§‡ āĻ•ā§‡āĻŦāĻ˛ āĻ˛ā§‹āĻĄ āĻ¨āĻŋāĻ°ā§€āĻ•ā§āĻˇāĻŖ āĻ•āĻ°āĻŋāĨ¤ āĻ¯āĻĻāĻŋ āĻāĻŸāĻŋ āĻ¸ā§āĻĨāĻŋāĻ¤āĻŋāĻļā§€āĻ˛ āĻšāĻ¯āĻŧā§‡ āĻĨāĻžāĻ•ā§‡ āĻāĻŦāĻ‚ āĻ¸āĻ°ā§āĻŦā§‹āĻ¤ā§āĻ¤āĻŽ āĻ˛ā§‹āĻĄ āĻŽāĻžāĻ¨āĻ—ā§āĻ˛āĻŋāĻ° āĻ•āĻ°āĻŋāĻĄā§‹āĻ°ā§‡āĻ° āĻŽāĻ§ā§āĻ¯ā§‡ āĻĨāĻžāĻ•ā§‡, āĻ¤āĻžāĻšāĻ˛ā§‡ āĻ†āĻŽāĻ°āĻž āĻ•ā§‡āĻŦāĻ˛ āĻĒāĻ°ā§āĻ¯āĻŦā§‡āĻ•ā§āĻˇāĻŖ āĻšāĻžāĻ˛āĻŋāĻ¯āĻŧā§‡ āĻ¯āĻžāĻ‡āĨ¤ āĻ¯āĻĻāĻŋ āĻāĻ•āĻŸāĻŋ āĻ¨ā§‹āĻĄ āĻ¯āĻĨā§‡āĻˇā§āĻŸ āĻ¨āĻž āĻšāĻ¯āĻŧ, āĻ¤āĻžāĻšāĻ˛ā§‡ āĻ†āĻŽāĻ°āĻž āĻ†āĻ°ā§‡āĻ•āĻŸāĻŋ āĻ¯ā§‹āĻ— āĻ•āĻ°āĻŋāĨ¤

āĻ¯ā§‡ āĻ•ā§āĻˇā§‡āĻ¤ā§āĻ°ā§‡ āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻ¸āĻžāĻŽāĻ¨ā§‡ āĻāĻ•āĻŸāĻŋ āĻĒāĻžāĻ  āĻ†āĻ›ā§‡, āĻ†āĻŽāĻ°āĻž āĻ‡āĻ¤āĻŋāĻŽāĻ§ā§āĻ¯ā§‡āĻ‡ āĻ¨āĻŋāĻļā§āĻšāĻŋāĻ¤āĻ­āĻžāĻŦā§‡ āĻœāĻžāĻ¨āĻŋ āĻ¯ā§‡ āĻāĻ•āĻŸāĻŋ āĻ¨ā§‹āĻĄ āĻ¯āĻĨā§‡āĻˇā§āĻŸ āĻšāĻŦā§‡ āĻ¨āĻž, āĻ¤āĻžāĻ‡ āĻ†āĻŽāĻ°āĻž āĻ…āĻŦāĻŋāĻ˛āĻŽā§āĻŦā§‡ āĻ¸āĻŽāĻ¸ā§āĻ¤ āĻŦāĻŋāĻ¨āĻžāĻŽā§‚āĻ˛ā§āĻ¯ā§‡āĻ° āĻ¨ā§‹āĻĄ āĻļā§āĻ°ā§ āĻ•āĻ°āĻŋ āĻāĻŦāĻ‚ āĻĒāĻžāĻ  āĻļā§‡āĻˇ āĻ¨āĻž āĻšāĻ“āĻ¯āĻŧāĻž āĻĒāĻ°ā§āĻ¯āĻ¨ā§āĻ¤ āĻ¤āĻžāĻĻā§‡āĻ° āĻ¸āĻ•ā§āĻ°āĻŋāĻ¯āĻŧ āĻ°āĻžāĻ–āĻŋāĨ¤ āĻāĻŸāĻŋ āĻ•āĻžāĻ°ā§āĻ¯āĻ•āĻ˛āĻžāĻĒā§‡āĻ° āĻŸāĻžāĻ‡āĻŽāĻ¸ā§āĻŸā§āĻ¯āĻžāĻŽā§āĻĒā§‡āĻ° āĻāĻ•āĻŸāĻŋ āĻ¤āĻžāĻ˛āĻŋāĻ•āĻž āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡ āĻ˜āĻŸā§‡āĨ¤

āĻ‰āĻĒāĻ¸āĻ‚āĻšāĻžāĻ°

āĻ¯āĻ–āĻ¨ āĻ†āĻĒāĻ¨āĻŋ āĻ…āĻ¸āĻŽ āĻ•ā§āĻ˛āĻžāĻ¸ā§āĻŸāĻžāĻ° āĻ˛ā§‹āĻĄāĻŋāĻ‚ āĻ…āĻ¨ā§āĻ­āĻŦ āĻ•āĻ°ā§‡āĻ¨ āĻ¤āĻ–āĻ¨ āĻ…āĻŸā§‹āĻ¸ā§āĻ•ā§āĻ¯āĻžāĻ˛āĻžāĻ° āĻ¸ā§‡āĻ‡ āĻ•ā§āĻˇā§‡āĻ¤ā§āĻ°ā§‡āĻ—ā§āĻ˛āĻŋāĻ° āĻœāĻ¨ā§āĻ¯ āĻāĻ•āĻŸāĻŋ āĻ­āĻžāĻ˛ āĻāĻŦāĻ‚ āĻ¸ā§āĻŦāĻŋāĻ§āĻžāĻœāĻ¨āĻ• āĻ¸āĻŽāĻžāĻ§āĻžāĻ¨ā§ˇ āĻ†āĻĒāĻ¨āĻŋ āĻāĻ•āĻ‡ āĻ¸āĻžāĻĨā§‡ āĻĒāĻŋāĻ• āĻ˛ā§‹āĻĄā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻĒāĻ›āĻ¨ā§āĻĻāĻ¸āĻ‡ āĻ•ā§āĻ˛āĻžāĻ¸ā§āĻŸāĻžāĻ° āĻ•āĻ¨āĻĢāĻŋāĻ—āĻžāĻ°ā§‡āĻļāĻ¨ āĻ…āĻ°ā§āĻœāĻ¨ āĻ•āĻ°ā§‡āĻ¨ āĻāĻŦāĻ‚ āĻāĻ•āĻ‡ āĻ¸āĻžāĻĨā§‡ āĻ†āĻ¨ā§āĻĄāĻžāĻ°āĻ˛ā§‹āĻĄā§‡āĻ° āĻ¸āĻŽāĻ¯āĻŧ āĻāĻ‡ āĻ•ā§āĻ˛āĻžāĻ¸ā§āĻŸāĻžāĻ°āĻŸāĻŋ āĻ°āĻžāĻ–āĻŦā§‡āĻ¨ āĻ¨āĻž, āĻ…āĻ°ā§āĻĨ āĻ¸āĻžāĻļā§āĻ°āĻ¯āĻŧ āĻ•āĻ°ā§āĻ¨āĨ¤ āĻ­āĻžāĻ˛, āĻĒā§āĻ˛āĻžāĻ¸ āĻāĻ‡ āĻ¸āĻŦ āĻ†āĻĒāĻ¨āĻžāĻ° āĻ…āĻ‚āĻļāĻ—ā§āĻ°āĻšāĻŖ āĻ›āĻžāĻĄāĻŧāĻž āĻ¸ā§āĻŦāĻ¯āĻŧāĻ‚āĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻ­āĻžāĻŦā§‡ āĻ˜āĻŸāĻŦā§‡. āĻ…āĻŸā§‹āĻ¸ā§āĻ•ā§‡āĻ˛āĻžāĻ° āĻ¨āĻŋāĻœā§‡āĻ‡ āĻ•ā§āĻ˛āĻžāĻ¸ā§āĻŸāĻžāĻ° āĻŽā§āĻ¯āĻžāĻ¨ā§‡āĻœāĻžāĻ° āĻāĻĒāĻŋāĻ†āĻ‡ āĻāĻŦāĻ‚ āĻ•ā§āĻ˛āĻžāĻ‰āĻĄ āĻĒā§āĻ°āĻĻāĻžāĻ¨āĻ•āĻžāĻ°ā§€ āĻāĻĒāĻŋāĻ†āĻ‡āĻ•ā§‡ āĻāĻ•āĻŸāĻŋ āĻ¨āĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āĻŸ āĻ¯ā§āĻ•ā§āĻ¤āĻŋ āĻ…āĻ¨ā§āĻ¸āĻžāĻ°ā§‡ āĻ˛ā§‡āĻ–āĻž āĻ…āĻ¨ā§āĻ°ā§‹āĻ§ā§‡āĻ° āĻāĻ•āĻŸāĻŋ āĻ¸ā§‡āĻŸ āĻ›āĻžāĻĄāĻŧāĻž āĻ†āĻ° āĻ•āĻŋāĻ›ā§āĻ‡ āĻ¨āĻ¯āĻŧāĨ¤ āĻ†āĻĒāĻ¨āĻžāĻ° āĻ¯āĻž āĻ…āĻŦāĻļā§āĻ¯āĻ‡ āĻŽāĻ¨ā§‡ āĻ°āĻžāĻ–āĻž āĻĻāĻ°āĻ•āĻžāĻ° āĻ¤āĻž āĻšāĻ˛ āĻ¨ā§‹āĻĄā§‡āĻ° 3 āĻĒā§āĻ°āĻ•āĻžāĻ°ā§‡ āĻŦāĻŋāĻ­āĻžāĻœāĻ¨, āĻ¯ā§‡āĻŽāĻ¨āĻŸāĻŋ āĻ†āĻŽāĻ°āĻž āĻ†āĻ—ā§‡ āĻ˛āĻŋāĻ–ā§‡āĻ›āĻŋāĨ¤ āĻāĻŦāĻ‚ āĻ†āĻĒāĻ¨āĻŋ āĻ–ā§āĻļāĻŋ āĻšāĻŦā§‡āĻ¨.

āĻ‰āĻ¤ā§āĻ¸: www.habr.com

āĻāĻ•āĻŸāĻŋ āĻŽāĻ¨ā§āĻ¤āĻŦā§āĻ¯ āĻœā§āĻĄāĻŧā§āĻ¨