рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдкрд░ рдЕрдкрд╛рдЪреЗ рд╕реНрдкрд╛рд░реНрдХ рдЪрд▓ рд░рд╣рд╛ рд╣реИ

рдкреНрд░рд┐рдп рдкрд╛рдардХреЛрдВ, рд╢реБрдн рджреЛрдкрд╣рд░ред рдЖрдЬ рд╣рдо рдЕрдкрд╛рдЪреЗ рд╕реНрдкрд╛рд░реНрдХ рдФрд░ рдЗрд╕рдХреА рд╡рд┐рдХрд╛рд╕ рд╕рдВрднрд╛рд╡рдирд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝реА рдмрд╛рдд рдХрд░реЗрдВрдЧреЗред

рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдкрд░ рдЕрдкрд╛рдЪреЗ рд╕реНрдкрд╛рд░реНрдХ рдЪрд▓ рд░рд╣рд╛ рд╣реИ

рдмрд┐рдЧ рдбреЗрдЯрд╛ рдХреА рдЖрдзреБрдирд┐рдХ рджреБрдирд┐рдпрд╛ рдореЗрдВ, рдЕрдкрд╛рдЪреЗ рд╕реНрдкрд╛рд░реНрдХ рдмреИрдЪ рдбреЗрдЯрд╛ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдорд╛рдирдХ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕реНрдЯреНрд░реАрдорд┐рдВрдЧ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рднреА рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рдорд╛рдЗрдХреНрд░реЛ рдмреИрдЪ рдЕрд╡рдзрд╛рд░рдгрд╛, рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдФрд░ рдЫреЛрдЯреЗ рднрд╛рдЧреЛрдВ рдореЗрдВ рдбреЗрдЯрд╛ рд╢рд┐рдкрд┐рдВрдЧ (рд╕реНрдкрд╛рд░реНрдХ рд╕реНрдЯреНрд░рдХреНрдЪрд░реНрдб рд╕реНрдЯреНрд░реАрдорд┐рдВрдЧ) рдореЗрдВ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред рдФрд░ рдкрд░рдВрдкрд░рд╛рдЧрдд рд░реВрдк рд╕реЗ рдпрд╣ рд╕рдВрд╕рд╛рдзрди рдкреНрд░рдмрдВрдзрдХ рдХреЗ рд░реВрдк рдореЗрдВ YARN (рдпрд╛ рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЕрдкрд╛рдЪреЗ рдореЗрд╕реЛрд╕) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рд╕рдордЧреНрд░ Hadoop рд╕реНрдЯреИрдХ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд░рд╣рд╛ рд╣реИред 2020 рддрдХ, рдЕрдкрдиреЗ рдкрд╛рд░рдВрдкрд░рд┐рдХ рд░реВрдк рдореЗрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕рднреНрдп Hadoop рд╡рд┐рддрд░рдг рдХреА рдХрдореА рдХреЗ рдХрд╛рд░рдг рдЕрдзрд┐рдХрд╛рдВрд╢ рдХрдВрдкрдирд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рд╡рд╛рд▓реЛрдВ рдХреЗ рдШреЗрд░реЗ рдореЗрдВ рд╣реИ - HDP рдФрд░ CDH рдХрд╛ рд╡рд┐рдХрд╛рд╕ рд░реБрдХ рдЧрдпрд╛ рд╣реИ, CDH рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╡рд┐рдХрд╕рд┐рдд рдирд╣реАрдВ рд╣реИ рдФрд░ рдЗрд╕рдХреА рд▓рд╛рдЧрдд рдЕрдзрд┐рдХ рд╣реИ, рдФрд░ рд╢реЗрд╖ Hadoop рдЖрдкреВрд░реНрддрд┐рдХрд░реНрддрд╛рдУрдВ рдХреЗ рдкрд╛рд╕ рд╣реИ рдпрд╛ рддреЛ рдЕрд╕реНрддрд┐рддреНрд╡ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЧрдпрд╛ рдпрд╛ рдЙрд╕рдХрд╛ рднрд╡рд┐рд╖реНрдп рдЕрдВрдзрдХрд╛рд░рдордп рд╣реЛ рдЧрдпрд╛ред рдЗрд╕рд▓рд┐рдП, рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдкрд╛рдЪреЗ рд╕реНрдкрд╛рд░реНрдХ рдХрд╛ рд▓реЙрдиреНрдЪ рд╕рдореБрджрд╛рдп рдФрд░ рдмрдбрд╝реА рдХрдВрдкрдирд┐рдпреЛрдВ рдХреЗ рдмреАрдЪ рд░реБрдЪрд┐ рдмрдврд╝рд╛ рд░рд╣рд╛ рд╣реИ - рдирд┐рдЬреА рдФрд░ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдХреНрд▓рд╛рдЙрдб рдореЗрдВ рдХрдВрдЯреЗрдирд░ рдСрд░реНрдХреЗрд╕реНрдЯреНрд░реЗрд╢рди рдФрд░ рд╕рдВрд╕рд╛рдзрди рдкреНрд░рдмрдВрдзрди рдореЗрдВ рдПрдХ рдорд╛рдирдХ рдмрдирдХрд░, рдпрд╣ YARN рдкрд░ рд╕реНрдкрд╛рд░реНрдХ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдЕрд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╕рдВрд╕рд╛рдзрди рд╢реЗрдбреНрдпреВрд▓рд┐рдВрдЧ рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рд╕рднреА рдЖрдХрд╛рд░реЛрдВ рдФрд░ рдзрд╛рд░рд┐рдпреЛрдВ рдХреА рдХрдВрдкрдирд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдХрдИ рд╡рд╛рдгрд┐рдЬреНрдпрд┐рдХ рдФрд░ рдЦреБрд▓реЗ рд╡рд┐рддрд░рдг рдХреЗ рд╕рд╛рде рдПрдХ рд▓рдЧрд╛рддрд╛рд░ рд╡рд┐рдХрд╕рд┐рдд рд╣реЛрдиреЗ рд╡рд╛рд▓рд╛ рдордВрдЪред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд▓реЛрдХрдкреНрд░рд┐рдпрддрд╛ рдХреЗ рдорджреНрджреЗрдирдЬрд░, рдЕрдзрд┐рдХрд╛рдВрд╢ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдХреБрдЫ рдЗрдВрд╕реНрдЯреЙрд▓реЗрд╢рди рд╣рд╛рд╕рд┐рд▓ рдХрд░рдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рд░рд╣реЗ рд╣реИрдВ рдФрд░ рдЗрд╕рдХреЗ рдЙрдкрдпреЛрдЧ рдореЗрдВ рдЕрдкрдиреА рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдмрдврд╝рд╛ рджреА рд╣реИ, рдЬреЛ рдЗрд╕ рдХрджрдо рдХреЛ рд╕рд░рд▓ рдмрдирд╛рддрд╛ рд╣реИред

рд╕рдВрд╕реНрдХрд░рдг 2.3.0 рд╕реЗ рд╢реБрд░реВ рдХрд░рдХреЗ, рдЕрдкрд╛рдЪреЗ рд╕реНрдкрд╛рд░реНрдХ рдиреЗ рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдХреНрд▓рд╕реНрдЯрд░ рдореЗрдВ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рд╕рдорд░реНрдерди рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдФрд░ рдЖрдЬ, рд╣рдо рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреА рд╡рд░реНрддрдорд╛рди рдкрд░рд┐рдкрдХреНрд╡рддрд╛, рдЗрд╕рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рд╡рд┐рднрд┐рдиреНрди рд╡рд┐рдХрд▓реНрдкреЛрдВ рдФрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рджреМрд░рд╛рди рдЖрдиреЗ рд╡рд╛рд▓реЗ рдиреБрдХрд╕рд╛рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реЗрдВрдЧреЗред

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЖрдЗрдП рдЕрдкрд╛рдЪреЗ рд╕реНрдкрд╛рд░реНрдХ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рдХрд╛рд░реНрдпреЛрдВ рдФрд░ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рджреЗрдЦреЗрдВ рдФрд░ рдЙрди рд╡рд┐рд╢рд┐рд╖реНрдЯ рдорд╛рдорд▓реЛрдВ рдкрд░ рдкреНрд░рдХрд╛рд╢ рдбрд╛рд▓реЗрдВ рдЬрд┐рдирдореЗрдВ рдЖрдкрдХреЛ рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдХреНрд▓рд╕реНрдЯрд░ рдкрд░ рдПрдХ рдХрд╛рд░реНрдп рдЪрд▓рд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдЗрд╕ рдкреЛрд╕реНрдЯ рдХреЛ рддреИрдпрд╛рд░ рдХрд░рдиреЗ рдореЗрдВ, рдУрдкрдирд╢рд┐рдлреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╡рд┐рддрд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХреА рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдЙрдкрдпреЛрдЧрд┐рддрд╛ (рдУрд╕реА) рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдХрдорд╛рдВрдб рджрд┐рдП рдЬрд╛рдПрдВрдЧреЗред рдЕрдиреНрдп Kubernetes рд╡рд┐рддрд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП, рдорд╛рдирдХ Kubernetes рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдЙрдкрдпреЛрдЧрд┐рддрд╛ (kubectl) рдпрд╛ рдЙрдирдХреЗ рдПрдирд╛рд▓реЙрдЧреНрд╕ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, oc adm рдиреАрддрд┐ рдХреЗ рд▓рд┐рдП) рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдкрд╣рд▓рд╛ рдЙрдкрдпреЛрдЧ рдорд╛рдорд▓рд╛ - рд╕реНрдкрд╛рд░реНрдХ-рд╕рдмрдорд┐рдЯ

рдХрд╛рд░реНрдпреЛрдВ рдФрд░ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд╡рд┐рдХрд╛рд╕ рдХреЗ рджреМрд░рд╛рди, рдбреЗрд╡рд▓рдкрд░ рдХреЛ рдбреЗрдЯрд╛ рдкрд░рд┐рд╡рд░реНрддрди рдХреЛ рдбреАрдмрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рд░реВрдк рд╕реЗ, рдЗрди рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╕реНрдЯрдмреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдВрдд рдкреНрд░рдгрд╛рд▓рд┐рдпреЛрдВ рдХреЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ (рдпрджреНрдпрдкрд┐ рдкрд░реАрдХреНрд╖рдг) рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреА рднрд╛рдЧреАрджрд╛рд░реА рдХреЗ рд╕рд╛рде рд╡рд┐рдХрд╛рд╕ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдЗрд╕ рд╡рд░реНрдЧ рдореЗрдВ рддреЗрдЬ рдФрд░ рдмреЗрд╣рддрд░ рд╕рд╛рдмрд┐рдд рд╣реБрдЖ рд╣реИред рдРрд╕реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдЬрдм рд╣рдо рдПрдВрдб рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдкрд░ рдбрд┐рдмрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рджреЛ рдкрд░рд┐рджреГрд╢реНрдп рд╕рдВрднрд╡ рд╣реЛрддреЗ рд╣реИрдВ:

  • рдбреЗрд╡рд▓рдкрд░ рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рд╕реНрдЯреИрдВрдбрдЕрд▓реЛрди рдореЛрдб рдореЗрдВ рд╕реНрдкрд╛рд░реНрдХ рдХрд╛рд░реНрдп рдЪрд▓рд╛рддрд╛ рд╣реИ;

    рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдкрд░ рдЕрдкрд╛рдЪреЗ рд╕реНрдкрд╛рд░реНрдХ рдЪрд▓ рд░рд╣рд╛ рд╣реИ

  • рдПрдХ рдбреЗрд╡рд▓рдкрд░ рдкрд░реАрдХреНрд╖рдг рд▓реВрдк рдореЗрдВ рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдХреНрд▓рд╕реНрдЯрд░ рдкрд░ рд╕реНрдкрд╛рд░реНрдХ рдХрд╛рд░реНрдп рдЪрд▓рд╛рддрд╛ рд╣реИред

    рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдкрд░ рдЕрдкрд╛рдЪреЗ рд╕реНрдкрд╛рд░реНрдХ рдЪрд▓ рд░рд╣рд╛ рд╣реИ

рдкрд╣рд▓реЗ рд╡рд┐рдХрд▓реНрдк рдореЗрдВ рдЕрд╕реНрддрд┐рддреНрд╡ рдХрд╛ рдЕрдзрд┐рдХрд╛рд░ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рдХрдИ рдиреБрдХрд╕рд╛рди рднреА рд╣реИрдВ:

  • рдкреНрд░рддреНрдпреЗрдХ рдбреЗрд╡рд▓рдкрд░ рдХреЛ рдХрд╛рд░реНрдпрд╕реНрдерд▓ рд╕реЗ рдЙрд╕рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдЕрдВрддрд┐рдо рдкреНрд░рдгрд╛рд▓рд┐рдпреЛрдВ рдХреЗ рд╕рднреА рдЙрджрд╛рд╣рд░рдгреЛрдВ рддрдХ рдкрд╣реБрдВрдЪ рдкреНрд░рджрд╛рди рдХреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдП;
  • рд╡рд┐рдХрд╕рд┐рдд рдХрд┐рдП рдЬрд╛ рд░рд╣реЗ рдХрд╛рд░реНрдп рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпрд╢реАрд▓ рдорд╢реАрди рдкрд░ рдкрд░реНрдпрд╛рдкреНрдд рдорд╛рддреНрд░рд╛ рдореЗрдВ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред

рджреВрд╕рд░реЗ рд╡рд┐рдХрд▓реНрдк рдореЗрдВ рдпреЗ рдиреБрдХрд╕рд╛рди рдирд╣реАрдВ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдХреНрд▓рд╕реНрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЖрдкрдХреЛ рдЪрд▓ рд░рд╣реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╕рдВрд╕рд╛рдзрди рдкреВрд▓ рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдиреЗ рдФрд░ рдЕрдВрддрд┐рдо рд╕рд┐рд╕реНрдЯрдо рдЙрджрд╛рд╣рд░рдгреЛрдВ рддрдХ рдЖрд╡рд╢реНрдпрдХ рдкрд╣реБрдВрдЪ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рд░реЛрд▓ рдореЙрдбрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд▓рдЪреАрд▓реЗ рдврдВрдЧ рд╕реЗ рдЙрд╕ рддрдХ рдкрд╣реБрдВрдЪ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рд╡рд┐рдХрд╛рд╕ рджрд▓ рдХреЗ рд╕рднреА рд╕рджрд╕реНрдпред рдЖрдЗрдП рдЗрд╕реЗ рдкрд╣рд▓реЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдЬрд╛рдЧрд░ рдХрд░реЗрдВ - рдПрдХ рдкрд░реАрдХреНрд╖рдг рд╕рд░реНрдХрд┐рдЯ рдореЗрдВ рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдХреНрд▓рд╕реНрдЯрд░ рдкрд░ рдПрдХ рд╕реНрдерд╛рдиреАрдп рдбреЗрд╡рд▓рдкрд░ рдорд╢реАрди рд╕реЗ рд╕реНрдкрд╛рд░реНрдХ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд▓реЙрдиреНрдЪ рдХрд░рдирд╛ред

рдЖрдЗрдП рд╕реНрдерд╛рдиреАрдп рд╕реНрддрд░ рдкрд░ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдкрд╛рд░реНрдХ рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдмрд╛рдд рдХрд░реЗрдВред рд╕реНрдкрд╛рд░реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдЗрд╕реЗ рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛:

mkdir /opt/spark
cd /opt/spark
wget http://mirror.linux-ia64.org/apache/spark/spark-2.4.5/spark-2.4.5.tgz
tar zxvf spark-2.4.5.tgz
rm -f spark-2.4.5.tgz

рд╣рдо рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдкреИрдХреЗрдЬ рдПрдХрддреНрд░ рдХрд░рддреЗ рд╣реИрдВ:

cd spark-2.4.5/
./build/mvn -Pkubernetes -DskipTests clean package

рдПрдХ рдкреВрд░реНрдг рдирд┐рд░реНрдорд╛рдг рдореЗрдВ рдмрд╣реБрдд рд╕рдордп рд▓рдЧрддрд╛ рд╣реИ, рдФрд░ рдбреЙрдХрд░ рдЫрд╡рд┐рдпрд╛рдВ рдмрдирд╛рдиреЗ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдХреНрд▓рд╕реНрдЯрд░ рдкрд░ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреЗрд╡рд▓ "рдЕрд╕реЗрдВрдмрд▓реА /" рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рд╕реЗ рдЬрд╛рд░ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдк рдХреЗрд╡рд▓ рдЗрд╕ рдЙрдкрдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

./build/mvn -f ./assembly/pom.xml -Pkubernetes -DskipTests clean package

рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдкрд░ рд╕реНрдкрд╛рд░реНрдХ рдЬреЙрдм рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЖрдзрд╛рд░ рдЫрд╡рд┐ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдбреЙрдХрд░ рдЫрд╡рд┐ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрд╣рд╛рдВ 2 рд╕рдВрднрд╛рд╡рд┐рдд рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╣реИрдВ:

  • рдЙрддреНрдкрдиреНрди рдбреЙрдХрд░ рдЫрд╡рд┐ рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рд╕реНрдкрд╛рд░реНрдХ рдХрд╛рд░реНрдп рдХреЛрдб рд╢рд╛рдорд┐рд▓ рд╣реИ;
  • рдмрдирд╛рдИ рдЧрдИ рдЫрд╡рд┐ рдореЗрдВ рдХреЗрд╡рд▓ рд╕реНрдкрд╛рд░реНрдХ рдФрд░ рдЖрд╡рд╢реНрдпрдХ рдирд┐рд░реНрднрд░рддрд╛рдПрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ, рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдХреЛрдб рдХреЛ рджреВрд░рд╕реНрде рд░реВрдк рд╕реЗ рд╣реЛрд╕реНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдЪрдбреАрдПрдлрдПрд╕ рдореЗрдВ)ред

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЖрдЗрдП рдПрдХ рдбреЙрдХрд░ рдЫрд╡рд┐ рдмрдирд╛рдПрдВ рдЬрд┐рд╕рдореЗрдВ рд╕реНрдкрд╛рд░реНрдХ рдХрд╛рд░реНрдп рдХрд╛ рдПрдХ рдкрд░реАрдХреНрд╖рдг рдЙрджрд╛рд╣рд░рдг рд╣реЛред рдбреЙрдХрд░ рдЫрд╡рд┐рдпрд╛рдВ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╕реНрдкрд╛рд░реНрдХ рдХреЗ рдкрд╛рд╕ "рдбреЙрдХрд░-рдЗрдореЗрдЬ-рдЯреВрд▓" рдирд╛рдордХ рдПрдХ рдЙрдкрдпреЛрдЧрд┐рддрд╛ рд╣реИред рдЖрдЗрдП рдЗрд╕ рдкрд░ рд╕рд╣рд╛рдпрддрд╛ рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░реЗрдВ:

./bin/docker-image-tool.sh --help

рдЗрд╕рдХреА рдорджрдж рд╕реЗ рдЖрдк рдбреЙрдХрд░ рдЗрдореЗрдЬ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рд░рд┐рдореЛрдЯ рд░рдЬрд┐рд╕реНрдЯреНрд░рд┐рдпреЛрдВ рдкрд░ рдЕрдкрд▓реЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдЗрд╕рдХреЗ рдХрдИ рдиреБрдХрд╕рд╛рди рд╣реИрдВ:

  • рдмрд┐рдирд╛ рдХрд┐рд╕реА рдЕрд╕рдлрд▓рддрд╛ рдХреЗ рдПрдХ рд╕рд╛рде 3 рдбреЙрдХрд░ рдЫрд╡рд┐рдпрд╛рдВ рдмрдирд╛рддрд╛ рд╣реИ - рд╕реНрдкрд╛рд░реНрдХ, рдкрд╛рдЗрд╕реНрдкрд╛рд░реНрдХ рдФрд░ рдЖрд░ рдХреЗ рд▓рд┐рдП;
  • рдЖрдкрдХреЛ рдЫрд╡рд┐ рдирд╛рдо рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддрд╛.

рдЗрд╕рд▓рд┐рдП, рд╣рдо рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдЗрд╕ рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХреЗ рдПрдХ рд╕рдВрд╢реЛрдзрд┐рдд рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ:

vi bin/docker-image-tool-upd.sh

#!/usr/bin/env bash

function error {
  echo "$@" 1>&2
  exit 1
}

if [ -z "${SPARK_HOME}" ]; then
  SPARK_HOME="$(cd "`dirname "$0"`"/..; pwd)"
fi
. "${SPARK_HOME}/bin/load-spark-env.sh"

function image_ref {
  local image="$1"
  local add_repo="${2:-1}"
  if [ $add_repo = 1 ] && [ -n "$REPO" ]; then
    image="$REPO/$image"
  fi
  if [ -n "$TAG" ]; then
    image="$image:$TAG"
  fi
  echo "$image"
}

function build {
  local BUILD_ARGS
  local IMG_PATH

  if [ ! -f "$SPARK_HOME/RELEASE" ]; then
    IMG_PATH=$BASEDOCKERFILE
    BUILD_ARGS=(
      ${BUILD_PARAMS}
      --build-arg
      img_path=$IMG_PATH
      --build-arg
      datagram_jars=datagram/runtimelibs
      --build-arg
      spark_jars=assembly/target/scala-$SPARK_SCALA_VERSION/jars
    )
  else
    IMG_PATH="kubernetes/dockerfiles"
    BUILD_ARGS=(${BUILD_PARAMS})
  fi

  if [ -z "$IMG_PATH" ]; then
    error "Cannot find docker image. This script must be run from a runnable distribution of Apache Spark."
  fi

  if [ -z "$IMAGE_REF" ]; then
    error "Cannot find docker image reference. Please add -i arg."
  fi

  local BINDING_BUILD_ARGS=(
    ${BUILD_PARAMS}
    --build-arg
    base_img=$(image_ref $IMAGE_REF)
  )
  local BASEDOCKERFILE=${BASEDOCKERFILE:-"$IMG_PATH/spark/docker/Dockerfile"}

  docker build $NOCACHEARG "${BUILD_ARGS[@]}" 
    -t $(image_ref $IMAGE_REF) 
    -f "$BASEDOCKERFILE" .
}

function push {
  docker push "$(image_ref $IMAGE_REF)"
}

function usage {
  cat <<EOF
Usage: $0 [options] [command]
Builds or pushes the built-in Spark Docker image.

Commands:
  build       Build image. Requires a repository address to be provided if the image will be
              pushed to a different registry.
  push        Push a pre-built image to a registry. Requires a repository address to be provided.

Options:
  -f file               Dockerfile to build for JVM based Jobs. By default builds the Dockerfile shipped with Spark.
  -p file               Dockerfile to build for PySpark Jobs. Builds Python dependencies and ships with Spark.
  -R file               Dockerfile to build for SparkR Jobs. Builds R dependencies and ships with Spark.
  -r repo               Repository address.
  -i name               Image name to apply to the built image, or to identify the image to be pushed.  
  -t tag                Tag to apply to the built image, or to identify the image to be pushed.
  -m                    Use minikube's Docker daemon.
  -n                    Build docker image with --no-cache
  -b arg      Build arg to build or push the image. For multiple build args, this option needs to
              be used separately for each build arg.

Using minikube when building images will do so directly into minikube's Docker daemon.
There is no need to push the images into minikube in that case, they'll be automatically
available when running applications inside the minikube cluster.

Check the following documentation for more information on using the minikube Docker daemon:

  https://kubernetes.io/docs/getting-started-guides/minikube/#reusing-the-docker-daemon

Examples:
  - Build image in minikube with tag "testing"
    $0 -m -t testing build

  - Build and push image with tag "v2.3.0" to docker.io/myrepo
    $0 -r docker.io/myrepo -t v2.3.0 build
    $0 -r docker.io/myrepo -t v2.3.0 push
EOF
}

if [[ "$@" = *--help ]] || [[ "$@" = *-h ]]; then
  usage
  exit 0
fi

REPO=
TAG=
BASEDOCKERFILE=
NOCACHEARG=
BUILD_PARAMS=
IMAGE_REF=
while getopts f:mr:t:nb:i: option
do
 case "${option}"
 in
 f) BASEDOCKERFILE=${OPTARG};;
 r) REPO=${OPTARG};;
 t) TAG=${OPTARG};;
 n) NOCACHEARG="--no-cache";;
 i) IMAGE_REF=${OPTARG};;
 b) BUILD_PARAMS=${BUILD_PARAMS}" --build-arg "${OPTARG};;
 esac
done

case "${@: -1}" in
  build)
    build
    ;;
  push)
    if [ -z "$REPO" ]; then
      usage
      exit 1
    fi
    push
    ;;
  *)
    usage
    exit 1
    ;;
esac

рдЗрд╕рдХреА рдорджрдж рд╕реЗ, рд╣рдо рдПрдХ рдмреБрдирд┐рдпрд╛рджреА рд╕реНрдкрд╛рд░реНрдХ рдЫрд╡рд┐ рдХреЛ рдЗрдХрдЯреНрдард╛ рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рд╕реНрдкрд╛рд░реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрд╛рдИ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкрд░реАрдХреНрд╖рдг рдХрд╛рд░реНрдп рд╣реЛрддрд╛ рд╣реИ (рдпрд╣рд╛рдВ {docker-registry-url} рдЖрдкрдХреА рдбреЙрдХрд░ рдЫрд╡рд┐ рд░рдЬрд┐рд╕реНрдЯреНрд░реА рдХрд╛ URL рд╣реИ, {repo} рд░рдЬрд┐рд╕реНрдЯреНрд░реА рдХреЗ рдЕрдВрджрд░ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХрд╛ рдирд╛рдо рд╣реИ, рдЬреЛ рдУрдкрдирд╢рд┐рдлреНрдЯ рдореЗрдВ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ, {рдЫрд╡рд┐-рдирд╛рдо} - рдЫрд╡рд┐ рдХрд╛ рдирд╛рдо (рдпрджрд┐ рдЫрд╡рд┐рдпреЛрдВ рдХреЗ рддреАрди-рд╕реНрддрд░реАрдп рдкреГрдердХреНрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЬреИрд╕реЗ рдХрд┐ рд░реЗрдб рд╣реИрдЯ рдУрдкрдирд╢рд┐рдлреНрдЯ рдЫрд╡рд┐рдпреЛрдВ рдХреА рдПрдХреАрдХреГрдд рд░рдЬрд┐рд╕реНрдЯреНрд░реА рдореЗрдВ), {рдЯреИрдЧ} - рдЗрд╕рдХрд╛ рдЯреИрдЧ рдЫрд╡рд┐ рдХрд╛ рд╕рдВрд╕реНрдХрд░рдг):

./bin/docker-image-tool-upd.sh -f resource-managers/kubernetes/docker/src/main/dockerfiles/spark/Dockerfile -r {docker-registry-url}/{repo} -i {image-name} -t {tag} build

рдХрдВрд╕реЛрд▓ рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдУрдХреЗрдбреА рдХреНрд▓рд╕реНрдЯрд░ рдореЗрдВ рд▓реЙрдЧ рдЗрди рдХрд░реЗрдВ (рдпрд╣рд╛рдВ {рдУрдХреЗрдбреА-рдПрдкреАрдЖрдИ-рдпреВрдЖрд░рдПрд▓} рдУрдХреЗрдбреА рдХреНрд▓рд╕реНрдЯрд░ рдПрдкреАрдЖрдИ рдпреВрдЖрд░рдПрд▓ рд╣реИ):

oc login {OKD-API-URL}

рдЖрдЗрдП рдбреЙрдХрд░ рд░рдЬрд┐рд╕реНрдЯреНрд░реА рдореЗрдВ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдХреЗ рд▓рд┐рдП рд╡рд░реНрддрдорд╛рди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХрд╛ рдЯреЛрдХрди рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ:

oc whoami -t

рдУрдХреЗрдбреА рдХреНрд▓рд╕реНрдЯрд░ рдХреА рдЖрдВрддрд░рд┐рдХ рдбреЙрдХрд░ рд░рдЬрд┐рд╕реНрдЯреНрд░реА рдореЗрдВ рд▓реЙрдЧ рдЗрди рдХрд░реЗрдВ (рд╣рдо рдкрд╛рд╕рд╡рд░реНрдб рдХреЗ рд░реВрдк рдореЗрдВ рдкрд┐рдЫрд▓реЗ рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рд╛рдкреНрдд рдЯреЛрдХрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ):

docker login {docker-registry-url}

рдЖрдЗрдП рдПрдХрддреНрд░рд┐рдд рдбреЙрдХрд░ рдЫрд╡рд┐ рдХреЛ рдбреЙрдХрд░ рд░рдЬрд┐рд╕реНрдЯреНрд░реА рдУрдХреЗрдбреА рдкрд░ рдЕрдкрд▓реЛрдб рдХрд░реЗрдВ:

./bin/docker-image-tool-upd.sh -r {docker-registry-url}/{repo} -i {image-name} -t {tag} push

рдЖрдЗрдП рдЬрд╛рдВрдЪреЗрдВ рдХрд┐ рдПрдХрддреНрд░рд┐рдд рдЫрд╡рд┐ рдУрдХреЗрдбреА рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реИ рдпрд╛ рдирд╣реАрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╕рдВрдмрдВрдзрд┐рдд рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреА рдЫрд╡рд┐рдпреЛрдВ рдХреА рд╕реВрдЪреА рдХреЗ рд╕рд╛рде рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдпреВрдЖрд░рдПрд▓ рдЦреЛрд▓реЗрдВ (рдпрд╣рд╛рдВ {рдкреНрд░реЛрдЬреЗрдХреНрдЯ} рдУрдкрдирд╢рд┐рдлреНрдЯ рдХреНрд▓рд╕реНрдЯрд░ рдХреЗ рдЕрдВрджрд░ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХрд╛ рдирд╛рдо рд╣реИ, {рдУрдХреЗрдбреА-рд╡реЗрдмрдпреВрдЖрдИ-рдпреВрдЖрд░рдПрд▓} рдУрдкрдирд╢рд┐рдлреНрдЯ рд╡реЗрдм рдХрдВрд╕реЛрд▓ рдХрд╛ рдпреВрдЖрд░рдПрд▓ рд╣реИ ) - https://{OKD-WEBUI-URL}/рдХрдВрд╕реЛрд▓ /рдкреНрд░реЛрдЬреЗрдХреНрдЯ/{рдкреНрд░реЛрдЬреЗрдХреНрдЯ}/рдмреНрд░рд╛рдЙрдЬ/рдЗрдореЗрдЬреЗрдЬ/{рдЗрдореЗрдЬ-рдирд╛рдо}ред

рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдкреЙрдбреНрд╕ рдХреЛ рд░реВрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд▓рд╛рдиреЗ рдХреЗ рд╡рд┐рд╢реЗрд╖рд╛рдзрд┐рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рд╕реЗрд╡рд╛ рдЦрд╛рддрд╛ рдмрдирд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП (рд╣рдо рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░ рдмрд╛рдж рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХрд░реЗрдВрдЧреЗ):

oc create sa spark -n {project}
oc adm policy add-scc-to-user anyuid -z spark -n {project}

рдЖрдЗрдП рд╕реНрдкрд╛рд░реНрдХ рдХрд╛рд░реНрдп рдХреЛ рдУрдХреЗрдбреА рдХреНрд▓рд╕реНрдЯрд░ рдореЗрдВ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдкрд╛рд░реНрдХ-рд╕рдмрдорд┐рдЯ рдХрдорд╛рдВрдб рдЪрд▓рд╛рдПрдВ, рдЬреЛ рдмрдирд╛рдП рдЧрдП рд╕реЗрд╡рд╛ рдЦрд╛рддреЗ рдФрд░ рдбреЙрдХрд░ рдЫрд╡рд┐ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддрд╛ рд╣реИ:

 /opt/spark/bin/spark-submit --name spark-test --class org.apache.spark.examples.SparkPi --conf spark.executor.instances=3 --conf spark.kubernetes.authenticate.driver.serviceAccountName=spark --conf spark.kubernetes.namespace={project} --conf spark.submit.deployMode=cluster --conf spark.kubernetes.container.image={docker-registry-url}/{repo}/{image-name}:{tag} --conf spark.master=k8s://https://{OKD-API-URL}  local:///opt/spark/examples/target/scala-2.11/jars/spark-examples_2.11-2.4.5.jar

╨Ч╨┤╨╡╤Б╤М:

тАФрдирд╛рдо тАФ рдЙрд╕ рдХрд╛рд░реНрдп рдХрд╛ рдирд╛рдо рдЬреЛ рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдкреЙрдбреНрд╕ рдХреЗ рдирд╛рдо рдХреЗ рдирд┐рд░реНрдорд╛рдг рдореЗрдВ рднрд╛рдЧ рд▓реЗрдЧрд╛;

-рд╡рд░реНрдЧ - рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдлрд╝рд╛рдЗрд▓ рдХрд╛ рд╡рд░реНрдЧ, рдЬрд┐рд╕реЗ рдХрд╛рд░реНрдп рд╢реБрд░реВ рд╣реЛрдиреЗ рдкрд░ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ;

тАФconf тАФ рд╕реНрдкрд╛рд░реНрдХ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдкреИрд░рд╛рдореАрдЯрд░;

spark.executor.instances - рд▓реЙрдиреНрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдкрд╛рд░реНрдХ рдирд┐рд╖реНрдкрд╛рджрдХреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛;

spark.kubernetes.authenticate.driver.serviceAccountName - рдкреЙрдбреНрд╕ рд▓реЙрдиреНрдЪ рдХрд░рддреЗ рд╕рдордп рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рд╕реЗрд╡рд╛ рдЦрд╛рддреЗ рдХрд╛ рдирд╛рдо (рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдПрдкреАрдЖрдИ рдХреЗ рд╕рд╛рде рдЗрдВрдЯрд░реИрдХреНрдЯ рдХрд░рддреЗ рд╕рдордп рд╕реБрд░рдХреНрд╖рд╛ рд╕рдВрджрд░реНрдн рдФрд░ рдХреНрд╖рдорддрд╛рдУрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП);

spark.kubernetes.namespace тАФ Kubernetes рдиреЗрдорд╕реНрдкреЗрд╕ рдЬрд┐рд╕рдореЗрдВ рдбреНрд░рд╛рдЗрд╡рд░ рдФрд░ рдПрдХреНрдЬрд╝реАрдХреНрдпреВрдЯрд░ рдкреЙрдб рд▓реЙрдиреНрдЪ рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗ;

spark.submit.deployMode - рд╕реНрдкрд╛рд░реНрдХ рд▓реЙрдиреНрдЪ рдХрд░рдиреЗ рдХреА рд╡рд┐рдзрд┐ (рдорд╛рдирдХ рд╕реНрдкрд╛рд░реНрдХ-рд╕рдмрдорд┐рдЯ рдХреЗ рд▓рд┐рдП "рдХреНрд▓рд╕реНрдЯрд░" рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╕реНрдкрд╛рд░реНрдХ рдСрдкрд░реЗрдЯрд░ рдФрд░ рд╕реНрдкрд╛рд░реНрдХ "рдХреНрд▓рд╛рдЗрдВрдЯ" рдХреЗ рдмрд╛рдж рдХреЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП);

spark.kubernetes.container.image - рдкреЙрдбреНрд╕ рд▓реЙрдиреНрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбреЙрдХрд░ рдЫрд╡рд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ;

рд╕реНрдкрд╛рд░реНрдХ.рдорд╛рд╕реНрдЯрд░ - рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдПрдкреАрдЖрдИ рдпреВрдЖрд░рдПрд▓ (рдмрд╛рд╣рд░реА рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╣реИ рдЗрд╕рд▓рд┐рдП рдкрд╣реБрдВрдЪ рд╕реНрдерд╛рдиреАрдп рдорд╢реАрди рд╕реЗ рд╣реЛрддреА рд╣реИ);

local:// рдбреЙрдХрд░ рдЫрд╡рд┐ рдХреЗ рдЕрдВрджрд░ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рд╕реНрдкрд╛рд░реНрдХ рдХрд╛ рдкрде рд╣реИред

рд╣рдо рд╕рдВрдмрдВрдзрд┐рдд рдУрдХреЗрдбреА рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдкрд░ рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рдмрдирд╛рдП рдЧрдП рдкреЙрдбреНрд╕ рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░рддреЗ рд╣реИрдВ - https://{OKD-WEBUI-URL}/console/project/{project}/browse/podsред

рд╡рд┐рдХрд╛рд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рдЕрдиреНрдп рд╡рд┐рдХрд▓реНрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рд╕реНрдкрд╛рд░реНрдХ рдХреА рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдЖрдзрд╛рд░ рдЫрд╡рд┐ рдмрдирд╛рдИ рдЬрд╛рддреА рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕рднреА рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд╕реНрдиреИрдкрд╢реЙрдЯ рдХреЛ рдмрд╛рд╣рд░реА рднрдВрдбрд╛рд░рдг (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, Hadoop) рдореЗрдВ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдХреЙрд▓ рдХрд░рддреЗ рд╕рдордп рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рд╕реНрдкрд╛рд░реНрдХ-рдПрдХ рд▓рд┐рдВрдХ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдмрдорд┐рдЯ рдХрд░реЗрдВред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЖрдк рдбреЙрдХрд░ рдЫрд╡рд┐рдпреЛрдВ рдХреЛ рдкреБрдирд░реНрдирд┐рд░реНрдорд╛рдг рдХрд┐рдП рдмрд┐рдирд╛ рд╕реНрдкрд╛рд░реНрдХ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╡рд┐рднрд┐рдиреНрди рд╕рдВрд╕реНрдХрд░рдг рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЫрд╡рд┐рдпреЛрдВ рдХреЛ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП WebHDFS рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╣рдо рдПрдХ рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдиреБрд░реЛрдз рднреЗрдЬрддреЗ рд╣реИрдВ (рдпрд╣рд╛рдВ {host} WebHDFS рд╕реЗрд╡рд╛ рдХрд╛ рд╣реЛрд╕реНрдЯ рд╣реИ, {port} WebHDFS рд╕реЗрд╡рд╛ рдХрд╛ рдкреЛрд░реНрдЯ рд╣реИ, {path-to-file-on-hdfs} рдлрд╝рд╛рдЗрд▓ рдХрд╛ рд╡рд╛рдВрдЫрд┐рдд рдкрде рд╣реИ рдПрдЪрдбреАрдПрдлрдПрд╕ рдкрд░):

curl -i -X PUT "http://{host}:{port}/webhdfs/v1/{path-to-file-on-hdfs}?op=CREATE

рдЖрдкрдХреЛ рдЗрд╕ рддрд░рд╣ рдХреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкреНрд░рд╛рдкреНрдд рд╣реЛрдЧреА (рдпрд╣рд╛рдВ {рд╕реНрдерд╛рди} рд╡рд╣ рдпреВрдЖрд░рдПрд▓ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдлрд╝рд╛рдЗрд▓ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП):

HTTP/1.1 307 TEMPORARY_REDIRECT
Location: {location}
Content-Length: 0

рд╕реНрдкрд╛рд░реНрдХ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдлрд╝рд╛рдЗрд▓ рдХреЛ HDFS рдореЗрдВ рд▓реЛрдб рдХрд░реЗрдВ (рдпрд╣рд╛рдВ {path-to-local-file} рд╡рд░реНрддрдорд╛рди рд╣реЛрд╕реНрдЯ рдкрд░ рд╕реНрдкрд╛рд░реНрдХ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдкрде рд╣реИ):

curl -i -X PUT -T {path-to-local-file} "{location}"

рдЗрд╕рдХреЗ рдмрд╛рдж, рд╣рдо рдПрдЪрдбреАрдПрдлрдПрд╕ рдкрд░ рдЕрдкрд▓реЛрдб рдХреА рдЧрдИ рд╕реНрдкрд╛рд░реНрдХ рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реНрдкрд╛рд░реНрдХ-рд╕рдмрдорд┐рдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдпрд╣рд╛рдВ {рдХреНрд▓рд╛рд╕-рдирд╛рдо} рдЙрд╕ рдХреНрд▓рд╛рд╕ рдХрд╛ рдирд╛рдо рд╣реИ рдЬрд┐рд╕реЗ рдХрд╛рд░реНрдп рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓реЙрдиреНрдЪ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ):

/opt/spark/bin/spark-submit --name spark-test --class {class-name} --conf spark.executor.instances=3 --conf spark.kubernetes.authenticate.driver.serviceAccountName=spark --conf spark.kubernetes.namespace={project} --conf spark.submit.deployMode=cluster --conf spark.kubernetes.container.image={docker-registry-url}/{repo}/{image-name}:{tag} --conf spark.master=k8s://https://{OKD-API-URL}  hdfs://{host}:{port}/{path-to-file-on-hdfs}

рдпрд╣ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдПрдЪрдбреАрдПрдлрдПрд╕ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдФрд░ рдХрд╛рд░реНрдп рдХреЛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдбреЙрдХрд░рдлрд╛рдЗрд▓ рдФрд░ рдПрдВрдЯреНрд░реАрдкреЙрдЗрдВрдЯ.рд╢ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ - рдЖрд╢реНрд░рд┐рдд рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЛ /opt/spark/jars рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рдХреЙрдкреА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбреЙрдХрд░рдлрд╛рдЗрд▓ рдореЗрдВ рдПрдХ рдирд┐рд░реНрджреЗрд╢ рдЬреЛрдбрд╝реЗрдВ рдФрд░ рдПрдВрдЯреНрд░реАрдкреЙрдЗрдВрдЯ рдореЗрдВ SPARK_CLASSPATH рдореЗрдВ HDFS рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рд╢рд╛рдорд┐рд▓ рдХрд░реЗрдВред

рджреВрд╕рд░рд╛ рдЙрдкрдпреЛрдЧ рдорд╛рдорд▓рд╛ - рдЕрдкрд╛рдЪреЗ рд▓рд┐рд╡реА

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЬрдм рдХреЛрдИ рдХрд╛рд░реНрдп рд╡рд┐рдХрд╕рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдкрд░рд┐рдгрд╛рдо рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рддреЛ рдЗрд╕реЗ рд╕реАрдЖрдИ/рд╕реАрдбреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЙрдиреНрдЪ рдХрд░рдиреЗ рдФрд░ рдЗрд╕рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреА рд╕реНрдерд┐рддрд┐ рдкрд░ рдирдЬрд╝рд░ рд░рдЦрдиреЗ рдХрд╛ рд╕рд╡рд╛рд▓ рдЙрдарддрд╛ рд╣реИред рдмреЗрд╢рдХ, рдЖрдк рдЗрд╕реЗ рд╕реНрдерд╛рдиреАрдп рд╕реНрдкрд╛рд░реНрдХ-рд╕рдмрдорд┐рдЯ рдХреЙрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рд╕реАрдЖрдИ/рд╕реАрдбреА рдмреБрдирд┐рдпрд╛рджреА рдврд╛рдВрдЪреЗ рдХреЛ рдЬрдЯрд┐рд▓ рдмрдирд╛рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдореЗрдВ рд╕реАрдЖрдИ рд╕рд░реНрд╡рд░ рдПрдЬреЗрдВрдЯреЛрдВ/рд░рдирд░ рдкрд░ рд╕реНрдкрд╛рд░реНрдХ рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдФрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдФрд░ рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдПрдкреАрдЖрдИ рддрдХ рдкрд╣реБрдВрдЪ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП, рд▓рдХреНрд╖реНрдп рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдиреЗ рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдХреНрд▓рд╕реНрдЯрд░ рдХреЗ рдЕрдВрджрд░ рд╣реЛрд╕реНрдЯ рдХрд┐рдП рдЧрдП рд╕реНрдкрд╛рд░реНрдХ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП REST API рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдкрд╛рдЪреЗ рд▓рд┐рд╡реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪреБрдирд╛ рд╣реИред рдЗрд╕рдХреА рдорджрдж рд╕реЗ, рдЖрдк рдирд┐рдпрдорд┐рдд рдХрд░реНрд▓ рдЕрдиреБрд░реЛрдзреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдХреНрд▓рд╕реНрдЯрд░ рдкрд░ рд╕реНрдкрд╛рд░реНрдХ рдХрд╛рд░реНрдп рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕реЗ рдХрд┐рд╕реА рднреА рд╕реАрдЖрдИ рд╕рдорд╛рдзрд╛рди рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЖрд╕рд╛рдиреА рд╕реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдХреНрд▓рд╕реНрдЯрд░ рдХреЗ рдЕрдВрджрд░ рдЗрд╕рдХрд╛ рдкреНрд▓реЗрд╕рдореЗрдВрдЯ рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдПрдкреАрдЖрдИ рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХрд░рддреЗ рд╕рдордп рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдХреА рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рддрд╛ рд╣реИред

рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдкрд░ рдЕрдкрд╛рдЪреЗ рд╕реНрдкрд╛рд░реНрдХ рдЪрд▓ рд░рд╣рд╛ рд╣реИ

рдЖрдЗрдП рдЗрд╕реЗ рджреВрд╕рд░реЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдЬрд╛рдЧрд░ рдХрд░реЗрдВ - рдПрдХ рдкрд░реАрдХреНрд╖рдг рд▓реВрдк рдореЗрдВ рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдХреНрд▓рд╕реНрдЯрд░ рдкрд░ рд╕реАрдЖрдИ/рд╕реАрдбреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реНрдкрд╛рд░реНрдХ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдЪрд▓рд╛рдирд╛ред

Apache Livy рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝рд╛ - рдпрд╣ рдПрдХ HTTP рд╕рд░реНрд╡рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдПрдХ рд╡реЗрдм рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдФрд░ рдПрдХ RESTful API рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рдЖрд╡рд╢реНрдпрдХ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдкрд╛рд░рд┐рдд рдХрд░рдХреЗ рд╕реНрдкрд╛рд░реНрдХ-рд╕рдмрдорд┐рдЯ рдХреЛ рджреВрд░рд╕реНрде рд░реВрдк рд╕реЗ рд▓реЙрдиреНрдЪ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдкрд░рдВрдкрд░рд╛рдЧрдд рд░реВрдк рд╕реЗ рдЗрд╕реЗ рдПрдЪрдбреАрдкреА рд╡рд┐рддрд░рдг рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ рднреЗрдЬрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдЙрдкрдпреБрдХреНрдд рдореЗрдирд┐рдлреЗрд╕реНрдЯ рдФрд░ рдбреЙрдХрд░ рдЫрд╡рд┐рдпреЛрдВ рдХреЗ рдПрдХ рд╕реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдУрдХреЗрдбреА рдпрд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдЗрдВрд╕реНрдЯреЙрд▓реЗрд╢рди рдкрд░ рднреА рддреИрдирд╛рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ рдпрд╣ - github.com/ttauveron/k8s-big-data-experiments/tree/master/livy-spark-2.3. рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рд╕рдорд╛рди рдбреЙрдХрд░ рдЫрд╡рд┐ рдмрдирд╛рдИ рдЧрдИ рдереА, рдЬрд┐рд╕рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдбреЙрдХрд░рдлрд╛рдЗрд▓ рд╕реЗ рд╕реНрдкрд╛рд░реНрдХ рд╕рдВрд╕реНрдХрд░рдг 2.4.5 рд╢рд╛рдорд┐рд▓ рдерд╛:

FROM java:8-alpine

ENV SPARK_HOME=/opt/spark
ENV LIVY_HOME=/opt/livy
ENV HADOOP_CONF_DIR=/etc/hadoop/conf
ENV SPARK_USER=spark

WORKDIR /opt

RUN apk add --update openssl wget bash && 
    wget -P /opt https://downloads.apache.org/spark/spark-2.4.5/spark-2.4.5-bin-hadoop2.7.tgz && 
    tar xvzf spark-2.4.5-bin-hadoop2.7.tgz && 
    rm spark-2.4.5-bin-hadoop2.7.tgz && 
    ln -s /opt/spark-2.4.5-bin-hadoop2.7 /opt/spark

RUN wget http://mirror.its.dal.ca/apache/incubator/livy/0.7.0-incubating/apache-livy-0.7.0-incubating-bin.zip && 
    unzip apache-livy-0.7.0-incubating-bin.zip && 
    rm apache-livy-0.7.0-incubating-bin.zip && 
    ln -s /opt/apache-livy-0.7.0-incubating-bin /opt/livy && 
    mkdir /var/log/livy && 
    ln -s /var/log/livy /opt/livy/logs && 
    cp /opt/livy/conf/log4j.properties.template /opt/livy/conf/log4j.properties

ADD livy.conf /opt/livy/conf
ADD spark-defaults.conf /opt/spark/conf/spark-defaults.conf
ADD entrypoint.sh /entrypoint.sh

ENV PATH="/opt/livy/bin:${PATH}"

EXPOSE 8998

ENTRYPOINT ["/entrypoint.sh"]
CMD ["livy-server"]

рдЙрддреНрдкрдиреНрди рдЫрд╡рд┐ рдХреЛ рдЖрдкрдХреЗ рдореМрдЬреВрджрд╛ рдбреЙрдХрд░ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА, рдЬреИрд╕реЗ рдЖрдВрддрд░рд┐рдХ рдУрдХреЗрдбреА рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА, рдореЗрдВ рдмрдирд╛рдпрд╛ рдФрд░ рдЕрдкрд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕реЗ рддреИрдирд╛рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдореЗрдирд┐рдлреЗрд╕реНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ ({рд░рдЬрд┐рд╕реНрдЯреНрд░реА-рдпреВрдЖрд░рдПрд▓} - рдбреЙрдХрд░ рдЫрд╡рд┐ рд░рдЬрд┐рд╕реНрдЯреНрд░реА рдХрд╛ рдпреВрдЖрд░рдПрд▓, {рдЫрд╡рд┐-рдирд╛рдо} - рдбреЙрдХрд░ рдЫрд╡рд┐ рдХрд╛ рдирд╛рдо, {рдЯреИрдЧ} - рдбреЙрдХрд░ рдЫрд╡рд┐ рдЯреИрдЧ, {рд▓рд┐рд╡реА-рдпреВрдЖрд░рдПрд▓} - рд╡рд╛рдВрдЫрд┐рдд рдпреВрдЖрд░рдПрд▓ рдЬрд╣рд╛рдВ рд╕рд░реНрд╡рд░ рд▓рд┐рд╡реА рддрдХ рдкрд╣реБрдВрдЪ рдпреЛрдЧреНрдп рд╣реЛрдЧрд╛; рдпрджрд┐ рд░реЗрдб рд╣реИрдЯ рдУрдкрдирд╢рд┐рдлреНрдЯ рдХреЛ рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рд╡рд┐рддрд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ "рд░реВрдЯ" рдореЗрдирд┐рдлреЗрд╕реНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЕрдиреНрдпрдерд╛ рдиреЛрдбрдкреЛрд░реНрдЯ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рдВрдмрдВрдзрд┐рдд рдЗрдирдЧреНрд░реЗрд╕ рдпрд╛ рд╕рд░реНрд╡рд┐рд╕ рдореЗрдирд┐рдлреЗрд╕реНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ):

---
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    component: livy
  name: livy
spec:
  progressDeadlineSeconds: 600
  replicas: 1
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      component: livy
  strategy:
    rollingUpdate:
      maxSurge: 25%
      maxUnavailable: 25%
    type: RollingUpdate
  template:
    metadata:
      creationTimestamp: null
      labels:
        component: livy
    spec:
      containers:
        - command:
            - livy-server
          env:
            - name: K8S_API_HOST
              value: localhost
            - name: SPARK_KUBERNETES_IMAGE
              value: 'gnut3ll4/spark:v1.0.14'
          image: '{registry-url}/{image-name}:{tag}'
          imagePullPolicy: Always
          name: livy
          ports:
            - containerPort: 8998
              name: livy-rest
              protocol: TCP
          resources: {}
          terminationMessagePath: /dev/termination-log
          terminationMessagePolicy: File
          volumeMounts:
            - mountPath: /var/log/livy
              name: livy-log
            - mountPath: /opt/.livy-sessions/
              name: livy-sessions
            - mountPath: /opt/livy/conf/livy.conf
              name: livy-config
              subPath: livy.conf
            - mountPath: /opt/spark/conf/spark-defaults.conf
              name: spark-config
              subPath: spark-defaults.conf
        - command:
            - /usr/local/bin/kubectl
            - proxy
            - '--port'
            - '8443'
          image: 'gnut3ll4/kubectl-sidecar:latest'
          imagePullPolicy: Always
          name: kubectl
          ports:
            - containerPort: 8443
              name: k8s-api
              protocol: TCP
          resources: {}
          terminationMessagePath: /dev/termination-log
          terminationMessagePolicy: File
      dnsPolicy: ClusterFirst
      restartPolicy: Always
      schedulerName: default-scheduler
      securityContext: {}
      serviceAccount: spark
      serviceAccountName: spark
      terminationGracePeriodSeconds: 30
      volumes:
        - emptyDir: {}
          name: livy-log
        - emptyDir: {}
          name: livy-sessions
        - configMap:
            defaultMode: 420
            items:
              - key: livy.conf
                path: livy.conf
            name: livy-config
          name: livy-config
        - configMap:
            defaultMode: 420
            items:
              - key: spark-defaults.conf
                path: spark-defaults.conf
            name: livy-config
          name: spark-config
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: livy-config
data:
  livy.conf: |-
    livy.spark.deploy-mode=cluster
    livy.file.local-dir-whitelist=/opt/.livy-sessions/
    livy.spark.master=k8s://http://localhost:8443
    livy.server.session.state-retain.sec = 8h
  spark-defaults.conf: 'spark.kubernetes.container.image        "gnut3ll4/spark:v1.0.14"'
---
apiVersion: v1
kind: Service
metadata:
  labels:
    app: livy
  name: livy
spec:
  ports:
    - name: livy-rest
      port: 8998
      protocol: TCP
      targetPort: 8998
  selector:
    component: livy
  sessionAffinity: None
  type: ClusterIP
---
apiVersion: route.openshift.io/v1
kind: Route
metadata:
  labels:
    app: livy
  name: livy
spec:
  host: {livy-url}
  port:
    targetPort: livy-rest
  to:
    kind: Service
    name: livy
    weight: 100
  wildcardPolicy: None

рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдФрд░ рдкреЙрдб рдХреЛ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рд▓реЙрдиреНрдЪ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд▓рд┐рд╡реА рдЧреНрд░рд╛рдлрд┐рдХрд▓ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдЗрд╕ рд▓рд┐рдВрдХ рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реИ: http://{livy-url}/uiред рд▓рд┐рд╡реА рдХреЗ рд╕рд╛рде, рд╣рдо рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкреЛрд╕реНрдЯрдореИрди рд╕реЗ REST рдЕрдиреБрд░реЛрдз рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдкрдиреЗ рд╕реНрдкрд╛рд░реНрдХ рдХрд╛рд░реНрдп рдХреЛ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рд╕рд╛рде рд╕рдВрдЧреНрд░рд╣ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдиреАрдЪреЗ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ (рд▓реЙрдиреНрдЪ рдХрд┐рдП рдЧрдП рдХрд╛рд░реНрдп рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдЪрд░ рдХреЗ рд╕рд╛рде рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рддрд░реНрдХ "рдЖрд░реНрдЧреНрд╕" рд╕рд░рдгреА рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ):

{
    "info": {
        "_postman_id": "be135198-d2ff-47b6-a33e-0d27b9dba4c8",
        "name": "Spark Livy",
        "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
    },
    "item": [
        {
            "name": "1 Submit job with jar",
            "request": {
                "method": "POST",
                "header": [
                    {
                        "key": "Content-Type",
                        "value": "application/json"
                    }
                ],
                "body": {
                    "mode": "raw",
                    "raw": "{nt"file": "local:///opt/spark/examples/target/scala-2.11/jars/spark-examples_2.11-2.4.5.jar", nt"className": "org.apache.spark.examples.SparkPi",nt"numExecutors":1,nt"name": "spark-test-1",nt"conf": {ntt"spark.jars.ivy": "/tmp/.ivy",ntt"spark.kubernetes.authenticate.driver.serviceAccountName": "spark",ntt"spark.kubernetes.namespace": "{project}",ntt"spark.kubernetes.container.image": "{docker-registry-url}/{repo}/{image-name}:{tag}"nt}n}"
                },
                "url": {
                    "raw": "http://{livy-url}/batches",
                    "protocol": "http",
                    "host": [
                        "{livy-url}"
                    ],
                    "path": [
                        "batches"
                    ]
                }
            },
            "response": []
        },
        {
            "name": "2 Submit job without jar",
            "request": {
                "method": "POST",
                "header": [
                    {
                        "key": "Content-Type",
                        "value": "application/json"
                    }
                ],
                "body": {
                    "mode": "raw",
                    "raw": "{nt"file": "hdfs://{host}:{port}/{path-to-file-on-hdfs}", nt"className": "{class-name}",nt"numExecutors":1,nt"name": "spark-test-2",nt"proxyUser": "0",nt"conf": {ntt"spark.jars.ivy": "/tmp/.ivy",ntt"spark.kubernetes.authenticate.driver.serviceAccountName": "spark",ntt"spark.kubernetes.namespace": "{project}",ntt"spark.kubernetes.container.image": "{docker-registry-url}/{repo}/{image-name}:{tag}"nt},nt"args": [ntt"HADOOP_CONF_DIR=/opt/spark/hadoop-conf",ntt"MASTER=k8s://https://kubernetes.default.svc:8443"nt]n}"
                },
                "url": {
                    "raw": "http://{livy-url}/batches",
                    "protocol": "http",
                    "host": [
                        "{livy-url}"
                    ],
                    "path": [
                        "batches"
                    ]
                }
            },
            "response": []
        }
    ],
    "event": [
        {
            "listen": "prerequest",
            "script": {
                "id": "41bea1d0-278c-40c9-ad42-bf2e6268897d",
                "type": "text/javascript",
                "exec": [
                    ""
                ]
            }
        },
        {
            "listen": "test",
            "script": {
                "id": "3cdd7736-a885-4a2d-9668-bd75798f4560",
                "type": "text/javascript",
                "exec": [
                    ""
                ]
            }
        }
    ],
    "protocolProfileBehavior": {}
}

рдЖрдЗрдП рд╕рдВрдЧреНрд░рд╣ рд╕реЗ рдкрд╣рд▓рд╛ рдЕрдиреБрд░реЛрдз рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдВ, рдУрдХреЗрдбреА рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкрд░ рдЬрд╛рдПрдВ рдФрд░ рдЬрд╛рдВрдЪреЗрдВ рдХрд┐ рдХрд╛рд░реНрдп рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ - https://{OKD-WEBUI-URL}/console/project/{project}/browse/podsред рдЙрд╕реА рд╕рдордп, рд▓рд┐рд╡реА рдЗрдВрдЯрд░рдлрд╝реЗрд╕ (http://{livy-url}/ui) рдореЗрдВ рдПрдХ рд╕рддреНрд░ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛, рдЬрд┐рд╕рдХреЗ рднреАрддрд░, рд▓рд┐рд╡реА рдПрдкреАрдЖрдИ рдпрд╛ рдЧреНрд░рд╛рдлрд┐рдХрд▓ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдЖрдк рдХрд╛рд░реНрдп рдХреА рдкреНрд░рдЧрддрд┐ рдХреЛ рдЯреНрд░реИрдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╕рддреНрд░ рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рд▓реЙрдЧ.

рдЕрдм рдЖрдЗрдП рджрд┐рдЦрд╛рддреЗ рд╣реИрдВ рдХрд┐ рд▓рд┐рд╡реА рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреА рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдЗрдП рд▓рд┐рд╡реА рд╕рд░реНрд╡рд░ рдХреЗ рд╕рд╛рде рдкреЙрдб рдХреЗ рдЕрдВрджрд░ рд▓рд┐рд╡реА рдХрдВрдЯреЗрдирд░ рдХреЗ рд▓реЙрдЧ рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВ - https://{OKD-WEBUI-URL}/console/project/{project}/browse/pods/{livy-pod-name }?рдЯреИрдм=рд▓реЙрдЧ. рдЙрдирд╕реЗ рд╣рдо рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ "рд▓рд┐рд╡реА" рдирд╛рдордХ рдХрдВрдЯреЗрдирд░ рдореЗрдВ рд▓рд┐рд╡реА рд░реЗрд╕реНрдЯ рдПрдкреАрдЖрдИ рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╕рдордп, рдПрдХ рд╕реНрдкрд╛рд░реНрдХ-рд╕рдмрдорд┐рдЯ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрддрд╛ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рд╣рдордиреЗ рдКрдкрд░ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдерд╛ (рдпрд╣рд╛рдВ {рд▓рд┐рд╡реА-рдкреЙрдб-рдирд╛рдо} рдирд┐рд░реНрдорд┐рдд рдкреЙрдб рдХрд╛ рдирд╛рдо рд╣реИ) рд▓рд┐рд╡реА рд╕рд░реНрд╡рд░ рдХреЗ рд╕рд╛рде)ред рд╕рдВрдЧреНрд░рд╣ рдПрдХ рджреВрд╕рд░реА рдХреНрд╡реЗрд░реА рднреА рдкреЗрд╢ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рдЙрди рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдЬреЛ рд▓рд┐рд╡реА рд╕рд░реНрд╡рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реНрдкрд╛рд░реНрдХ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдХреЛ рджреВрд░рд╕реНрде рд░реВрдк рд╕реЗ рд╣реЛрд╕реНрдЯ рдХрд░рддреЗ рд╣реИрдВред

рддреАрд╕рд░рд╛ рдЙрдкрдпреЛрдЧ рдорд╛рдорд▓рд╛ - рд╕реНрдкрд╛рд░реНрдХ рдСрдкрд░реЗрдЯрд░

рдЕрдм рдЬрдмрдХрд┐ рдХрд╛рд░реНрдп рдХрд╛ рдкрд░реАрдХреНрд╖рдг рд╣реЛ рдЪреБрдХрд╛ рд╣реИ рддреЛ рдЗрд╕реЗ рдирд┐рдпрдорд┐рдд рд░реВрдк рд╕реЗ рдЪрд▓рд╛рдиреЗ рдХрд╛ рдкреНрд░рд╢реНрди рдЙрдарддрд╛ рд╣реИред рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдХреНрд▓рд╕реНрдЯрд░ рдореЗрдВ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдирд┐рдпрдорд┐рдд рд░реВрдк рд╕реЗ рдЪрд▓рд╛рдиреЗ рдХрд╛ рдореВрд▓ рддрд░реАрдХрд╛ рдХреНрд░реЛрдирдЬреЙрдм рдЗрдХрд╛рдИ рд╣реИ рдФрд░ рдЖрдк рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдлрд┐рд▓рд╣рд╛рд▓ рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдореЗрдВ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЛ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдСрдкрд░реЗрдЯрд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдмрд╣реБрдд рд▓реЛрдХрдкреНрд░рд┐рдп рд╣реИ рдФрд░ рд╕реНрдкрд╛рд░реНрдХ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрд╛рдлреА рдкрд░рд┐рдкрдХреНрд╡ рдСрдкрд░реЗрдЯрд░ рд╣реИ, рдЬреЛ рднреА рд╣реИ рдПрдВрдЯрд░рдкреНрд░рд╛рдЗрдЬрд╝-рд╕реНрддрд░реАрдп рд╕рдорд╛рдзрд╛рдиреЛрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд▓рд╛рдЗрдЯрдмреЗрдВрдб рдлрд╛рд╕реНрдЯрдбрд╛рдЯрд╛ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо)ред рд╣рдо рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддреЗ рд╣реИрдВ - рд╕реНрдкрд╛рд░реНрдХ рдХреЗ рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рд░ рд╕рдВрд╕реНрдХрд░рдг (2.4.5) рдореЗрдВ рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдореЗрдВ рд╕реНрдкрд╛рд░реНрдХ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реАрдорд┐рдд рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╡рд┐рдХрд▓реНрдк рд╣реИрдВ, рдЬрдмрдХрд┐ рдЕрдЧрд▓рд╛ рдкреНрд░рдореБрдЦ рд╕рдВрд╕реНрдХрд░рдг (3.0.0) рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдХреЗ рд▓рд┐рдП рдкреВрд░реНрдг рд╕рдорд░реНрдерди рдХреА рдШреЛрд╖рдгрд╛ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреА рд░рд┐рд▓реАрдЬ рдХреА рддрд╛рд░реАрдЦ рдЕрдЬреНрдЮрд╛рдд рдмрдиреА рд╣реБрдИ рд╣реИ . рд╕реНрдкрд╛рд░реНрдХ рдСрдкрд░реЗрдЯрд░ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╡рд┐рдХрд▓реНрдк рдЬреЛрдбрд╝рдХрд░ рдЗрд╕ рдХрдореА рдХреА рднрд░рдкрд╛рдИ рдХрд░рддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕реНрдкрд╛рд░реНрдХ рдкреЙрдбреНрд╕ рдореЗрдВ Hadoop рдПрдХреНрд╕реЗрд╕ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗ рд╕рд╛рде рдХреЙрдиреНрдлрд╝рд┐рдЧрдореИрдк рдорд╛рдЙрдВрдЯ рдХрд░рдирд╛) рдФрд░ рдирд┐рдпрдорд┐рдд рд░реВрдк рд╕реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд╛рд░реНрдп рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ред

рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдкрд░ рдЕрдкрд╛рдЪреЗ рд╕реНрдкрд╛рд░реНрдХ рдЪрд▓ рд░рд╣рд╛ рд╣реИ
рдЖрдЗрдП рдЗрд╕реЗ рддреАрд╕рд░реЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдЬрд╛рдЧрд░ рдХрд░реЗрдВ - рдЙрддреНрдкрд╛рджрди рд▓реВрдк рдореЗрдВ рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдХреНрд▓рд╕реНрдЯрд░ рдкрд░ рд╕реНрдкрд╛рд░реНрдХ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдирд┐рдпрдорд┐рдд рд░реВрдк рд╕реЗ рдЪрд▓рд╛рдирд╛ред

рд╕реНрдкрд╛рд░реНрдХ рдСрдкрд░реЗрдЯрд░ рдЦреБрд▓рд╛ рд╕реНрд░реЛрдд рд╣реИ рдФрд░ Google рдХреНрд▓рд╛рдЙрдб рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдХреЗ рднреАрддрд░ рд╡рд┐рдХрд╕рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ - github.com/GoogleCloudPlatform/spark-on-k8s-operator. рдЗрд╕рдХреА рд╕реНрдерд╛рдкрдирд╛ 3 рддрд░реАрдХреЛрдВ рд╕реЗ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИ:

  1. рд▓рд╛рдЗрдЯрдмреЗрдВрдб рдлрд╛рд╕реНрдЯрдбрд╛рдЯрд╛ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо/рдХреНрд▓рд╛рдЙрдбрдлрд╝реНрд▓реЛ рдЗрдВрд╕реНрдЯреЙрд▓реЗрд╢рди рдХреЗ рднрд╛рдЧ рдХреЗ рд░реВрдк рдореЗрдВ;
  2. рд╣реЗрд▓реНрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛:
    helm repo add incubator http://storage.googleapis.com/kubernetes-charts-incubator
    helm install incubator/sparkoperator --namespace spark-operator
    	

  3. рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА (https://github.com/GoogleCloudPlatform/spark-on-k8s-operator/tree/master/manifest) рд╕реЗ рдореИрдирд┐рдлрд╝реЗрд╕реНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ред рдпрд╣ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрд░ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ - рдХреНрд▓рд╛рдЙрдбрдлреНрд▓реЛ рдореЗрдВ рдПрдкреАрдЖрдИ рд╕рдВрд╕реНрдХрд░рдг v1beta1 рд╡рд╛рд▓рд╛ рдПрдХ рдСрдкрд░реЗрдЯрд░ рд╢рд╛рдорд┐рд▓ рд╣реИред рдпрджрд┐ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреА рд╕реНрдерд╛рдкрдирд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╕реНрдкрд╛рд░реНрдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдирд┐рдлреЗрд╕реНрдЯ рд╡рд┐рд╡рд░рдг рдЙрдкрдпреБрдХреНрдд рдПрдкреАрдЖрдИ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╕рд╛рде Git рдореЗрдВ рдЙрджрд╛рд╣рд░рдг рдЯреИрдЧ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, "v1beta1-0.9.0-2.4.0"ред рдСрдкрд░реЗрдЯрд░ рдХрд╛ рд╕рдВрд╕реНрдХрд░рдг "рд╕рдВрд╕реНрдХрд░рдг" рд╢рдмреНрджрдХреЛрд╢ рдореЗрдВ рдСрдкрд░реЗрдЯрд░ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╕реАрдЖрд░рдбреА рдХреЗ рд╡рд┐рд╡рд░рдг рдореЗрдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
    oc get crd sparkapplications.sparkoperator.k8s.io -o yaml
    	

рдпрджрд┐ рдСрдкрд░реЗрдЯрд░ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рд╣реИ, рддреЛ рд╕реНрдкрд╛рд░реНрдХ рдСрдкрд░реЗрдЯрд░ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдХреНрд░рд┐рдп рдкреЙрдб рд╕рдВрдмрдВрдзрд┐рдд рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреНрд▓рд╛рдЙрдбрдлреНрд▓реЛ рдЗрдВрд╕реНрдЯреЙрд▓реЗрд╢рди рдХреЗ рд▓рд┐рдП рдХреНрд▓рд╛рдЙрдбрдлреНрд▓реЛ рд╕реНрдкреЗрд╕ рдореЗрдВ рдХреНрд▓рд╛рдЙрдбрдлреНрд▓реЛ-рдПрдлрдбреАрдкреА-рд╕реНрдкрд╛рд░реНрдХрдСрдкрд░реЗрдЯрд░) рдФрд░ "рд╕реНрдкрд╛рд░реНрдХрдПрдкреНрд▓рд┐рдХреЗрд╢рди" рдирд╛рдордХ рд╕рдВрдмрдВрдзрд┐рдд рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рд╕рдВрд╕рд╛рдзрди рдкреНрд░рдХрд╛рд░ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛ред . рдЖрдк рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрдорд╛рдВрдб рдХреЗ рд╕рд╛рде рдЙрдкрд▓рдмреНрдз рд╕реНрдкрд╛рд░реНрдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ:

oc get sparkapplications -n {project}

рд╕реНрдкрд╛рд░реНрдХ рдСрдкрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд╛рд░реНрдп рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ 3 рдЪреАрдЬреЗрдВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:

  • рдПрдХ рдбреЙрдХрд░ рдЫрд╡рд┐ рдмрдирд╛рдПрдВ рдЬрд┐рд╕рдореЗрдВ рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рд▓рд╛рдЗрдмреНрд░реЗрд░реА, рд╕рд╛рде рд╣реА рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдФрд░ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдлрд╝рд╛рдЗрд▓реЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛрдВред рд▓рдХреНрд╖реНрдп рдЪрд┐рддреНрд░ рдореЗрдВ, рдпрд╣ рд╕реАрдЖрдИ/рд╕реАрдбреА рдЪрд░рдг рдореЗрдВ рдмрдирд╛рдИ рдЧрдИ рдПрдХ рдЫрд╡рд┐ рд╣реИ рдФрд░ рдкрд░реАрдХреНрд╖рдг рдХреНрд▓рд╕реНрдЯрд░ рдкрд░ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ;
  • рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдХреНрд▓рд╕реНрдЯрд░ рд╕реЗ рдкрд╣реБрдВрдЪ рдпреЛрдЧреНрдп рд░рдЬрд┐рд╕реНрдЯреНрд░реА рдореЗрдВ рдПрдХ рдбреЙрдХрд░ рдЫрд╡рд┐ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░реЗрдВ;
  • "рд╕реНрдкрд╛рд░реНрдХрдПрдкреНрд▓рд┐рдХреЗрд╢рди" рдкреНрд░рдХрд╛рд░ рдФрд░ рд▓реЙрдиреНрдЪ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдХрд╛рд░реНрдп рдХреЗ рд╡рд┐рд╡рд░рдг рдХреЗ рд╕рд╛рде рдПрдХ рдореИрдирд┐рдлрд╝реЗрд╕реНрдЯ рддреИрдпрд╛рд░ рдХрд░реЗрдВред рдЙрджрд╛рд╣рд░рдг рдореИрдирд┐рдлрд╝реЗрд╕реНрдЯ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рднрдВрдбрд╛рд░ рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реИрдВ (рдЙрджрд╛. github.com/GoogleCloudPlatform/spark-on-k8s-operator/blob/v1beta1-0.9.0-2.4.0/examples/spark-pi.yaml). рдШреЛрд╖рдгрд╛рдкрддреНрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд┐рдВрджреБ рд╣реИрдВ:
    1. "apiVersion" рд╢рдмреНрджрдХреЛрд╖ рдореЗрдВ рдСрдкрд░реЗрдЯрд░ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рдЕрдиреБрд░реВрдк API рд╕рдВрд╕реНрдХрд░рдг рдЕрд╡рд╢реНрдп рджрд░реНрд╢рд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП;
    2. "рдореЗрдЯрд╛рдбреЗрдЯрд╛.рдиреЗрдорд╕реНрдкреЗрд╕" рд╢рдмреНрджрдХреЛрд╢ рдореЗрдВ рдЙрд╕ рдиреЗрдорд╕реНрдкреЗрд╕ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдЬрд┐рд╕рдореЗрдВ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛;
    3. "spec.image" рд╢рдмреНрджрдХреЛрд╢ рдореЗрдВ рдПрдХ рд╕реБрд▓рдн рд░рдЬрд┐рд╕реНрдЯреНрд░реА рдореЗрдВ рдмрдирд╛рдИ рдЧрдИ рдбреЙрдХрд░ рдЫрд╡рд┐ рдХрд╛ рдкрддрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП;
    4. "spec.mainClass" рд╢рдмреНрджрдХреЛрд╢ рдореЗрдВ рд╕реНрдкрд╛рд░реНрдХ рдЯрд╛рд╕реНрдХ рдХреНрд▓рд╛рд╕ рд╢рд╛рдорд┐рд▓ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрд┐рд╕реЗ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╢реБрд░реВ рд╣реЛрдиреЗ рдкрд░ рдЪрд▓рд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ;
    5. "spec.mainApplicationFile" рд╢рдмреНрджрдХреЛрд╢ рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдЬрд╛рд░ рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдкрде рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП;
    6. "spec.sparkVersion" рд╢рдмреНрджрдХреЛрд╖ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛ рд░рд╣реЗ рд╕реНрдкрд╛рд░реНрдХ рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рд╕рдВрдХреЗрдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП;
    7. "spec.driver.serviceAccount" рд╢рдмреНрджрдХреЛрд╢ рдХреЛ рд╕рдВрдмрдВрдзрд┐рдд рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдиреЗрдорд╕реНрдкреЗрд╕ рдХреЗ рднреАрддрд░ рд╕реЗрд╡рд╛ рдЦрд╛рддрд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛;
    8. "spec.executor" рд╢рдмреНрджрдХреЛрд╖ рдореЗрдВ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдЖрд╡рдВрдЯрд┐рдд рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХрд╛ рд╕рдВрдХреЗрдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП;
    9. "spec.volumeMounts" рд╢рдмреНрджрдХреЛрд╢ рдХреЛ рд╕реНрдерд╛рдиреАрдп рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреА рд╣реЛрдЧреА рдЬрд┐рд╕рдореЗрдВ рд╕реНрдерд╛рдиреАрдп рд╕реНрдкрд╛рд░реНрдХ рдХрд╛рд░реНрдп рдлрд╝рд╛рдЗрд▓реЗрдВ рдмрдирд╛рдИ рдЬрд╛рдПрдВрдЧреАред

рдореЗрдирд┐рдлреЗрд╕реНрдЯ рдЬрдирд░реЗрдЯ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг (рдпрд╣рд╛рдВ {рд╕реНрдкрд╛рд░реНрдХ-рд╕рд░реНрд╡рд┐рд╕-рдЕрдХрд╛рдЙрдВрдЯ} рд╕реНрдкрд╛рд░реНрдХ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдХреНрд▓рд╕реНрдЯрд░ рдХреЗ рдЕрдВрджрд░ рдПрдХ рд╕реЗрд╡рд╛ рдЦрд╛рддрд╛ рд╣реИ):

apiVersion: "sparkoperator.k8s.io/v1beta1"
kind: SparkApplication
metadata:
  name: spark-pi
  namespace: {project}
spec:
  type: Scala
  mode: cluster
  image: "gcr.io/spark-operator/spark:v2.4.0"
  imagePullPolicy: Always
  mainClass: org.apache.spark.examples.SparkPi
  mainApplicationFile: "local:///opt/spark/examples/jars/spark-examples_2.11-2.4.0.jar"
  sparkVersion: "2.4.0"
  restartPolicy:
    type: Never
  volumes:
    - name: "test-volume"
      hostPath:
        path: "/tmp"
        type: Directory
  driver:
    cores: 0.1
    coreLimit: "200m"
    memory: "512m"
    labels:
      version: 2.4.0
    serviceAccount: {spark-service-account}
    volumeMounts:
      - name: "test-volume"
        mountPath: "/tmp"
  executor:
    cores: 1
    instances: 1
    memory: "512m"
    labels:
      version: 2.4.0
    volumeMounts:
      - name: "test-volume"
        mountPath: "/tmp"

рдпрд╣ рдореЗрдирд┐рдлреЗрд╕реНрдЯ рдПрдХ рд╕реЗрд╡рд╛ рдЦрд╛рддрд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП, рдореЗрдирд┐рдлреЗрд╕реНрдЯ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдЖрдкрдХреЛ рдЖрд╡рд╢реНрдпрдХ рднреВрдорд┐рдХрд╛ рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдмрдирд╛рдиреА рд╣реЛрдЧреА рдЬреЛ рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдПрдкреАрдЖрдИ (рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ) рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдкрд╛рд░реНрдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдкрд╣реБрдВрдЪ рдЕрдзрд┐рдХрд╛рд░ рдкреНрд░рджрд╛рди рдХрд░рддреА рд╣реИред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдкреЙрдбреНрд╕ рдмрдирд╛рдиреЗ рдХреЗ рдЕрдзрд┐рдХрд╛рд░реЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЖрдЗрдП рдЖрд╡рд╢реНрдпрдХ рднреВрдорд┐рдХрд╛ рдмрдВрдзрди рдмрдирд╛рдПрдБ:

oc adm policy add-role-to-user edit system:serviceaccount:{project}:{spark-service-account} -n {project}

рдпрд╣ рднреА рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рдЗрд╕ рдореИрдирд┐рдлрд╝реЗрд╕реНрдЯ рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдореЗрдВ рдПрдХ "hadoopConfigMap" рдкреИрд░рд╛рдореАрдЯрд░ рд╢рд╛рдорд┐рд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ рдЖрдкрдХреЛ рдбреЙрдХрд░ рдЫрд╡рд┐ рдореЗрдВ рд╕рдВрдмрдВрдзрд┐рдд рдлрд╝рд╛рдЗрд▓ рдХреЛ рдкрд╣рд▓реЗ рд░рдЦреЗ рдмрд┐рдирд╛ Hadoop рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗ рд╕рд╛рде рдПрдХ рдХреЙрдиреНрдлрд╝рд┐рдЧрдореИрдк рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдпрд╣ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдирд┐рдпрдорд┐рдд рд░реВрдк рд╕реЗ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рднреА рдЙрдкрдпреБрдХреНрдд рд╣реИ - "рд╢реЗрдбреНрдпреВрд▓" рдкреИрд░рд╛рдореАрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдХрд┐рд╕реА рджрд┐рдП рдЧрдП рдХрд╛рд░реНрдп рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╢реЗрдбреНрдпреВрд▓ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдЙрд╕рдХреЗ рдмрд╛рдж, рд╣рдо рдЕрдкрдиреЗ рдореЗрдирд┐рдлреЗрд╕реНрдЯ рдХреЛ spark-pi.yaml рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╕рд╣реЗрдЬрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдЕрдкрдиреЗ Kubernetes рдХреНрд▓рд╕реНрдЯрд░ рдкрд░ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ:

oc apply -f spark-pi.yaml

рдпрд╣ "рд╕реНрдкрд╛рд░реНрдХрдПрдкреНрд▓рд┐рдХреЗрд╢рдиреНрд╕" рдкреНрд░рдХрд╛рд░ рдХрд╛ рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдПрдЧрд╛:

oc get sparkapplications -n {project}
> NAME       AGE
> spark-pi   22h

рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдПрдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд╕рд╛рде рдПрдХ рдкреЙрдб рдмрдирд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЬрд┐рд╕рдХреА рд╕реНрдерд┐рддрд┐ рдмрдирд╛рдП рдЧрдП "рд╕реНрдкрд╛рд░реНрдХрдПрдкреНрд▓рд┐рдХреЗрд╢рдиреНрд╕" рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХреА рдЬрд╛рдПрдЧреАред рдЖрдк рдЗрд╕реЗ рдирд┐рдореНрди рдЖрджреЗрд╢ рд╕реЗ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ:

oc get sparkapplications spark-pi -o yaml -n {project}

рдХрд╛рд░реНрдп рдкреВрд░рд╛ рд╣реЛрдиреЗ рдкрд░, POD "рдкреВрд░реНрдг" рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдЪрд▓рд╛ рдЬрд╛рдПрдЧрд╛, рдЬреЛ "рд╕реНрдкрд╛рд░реНрдХрдПрдкреНрд▓рд┐рдХреЗрд╢рди" рдореЗрдВ рднреА рдЕрдкрдбреЗрдЯ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓реЙрдЧ рдХреЛ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдпрд╛ рдирд┐рдореНрди рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдпрд╣рд╛рдВ {sparkapplications-pod-name} рдЪрд▓ рд░рд╣реЗ рдХрд╛рд░реНрдп рдХреЗ рдкреЙрдб рдХрд╛ рдирд╛рдо рд╣реИ):

oc logs {sparkapplications-pod-name} -n {project}

рд╕реНрдкрд╛рд░реНрдХ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╡рд┐рд╢реЗрд╖ рд╕реНрдкрд╛рд░реНрдХрдХреНрдЯрд▓ рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рднреА рдкреНрд░рдмрдВрдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреЛ рдЙрд╕рдХреЗ рд╕реНрд░реЛрдд рдХреЛрдб рдХреЗ рд╕рд╛рде рдХреНрд▓реЛрди рдХрд░реЗрдВ, рдЧреЛ рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░реЗрдВ рдФрд░ рдЗрд╕ рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░реЗрдВ:

git clone https://github.com/GoogleCloudPlatform/spark-on-k8s-operator.git
cd spark-on-k8s-operator/
wget https://dl.google.com/go/go1.13.3.linux-amd64.tar.gz
tar -xzf go1.13.3.linux-amd64.tar.gz
sudo mv go /usr/local
mkdir $HOME/Projects
export GOROOT=/usr/local/go
export GOPATH=$HOME/Projects
export PATH=$GOPATH/bin:$GOROOT/bin:$PATH
go -version
cd sparkctl
go build -o sparkctl
sudo mv sparkctl /usr/local/bin

рдЖрдЗрдП рдЪрд▓ рд░рд╣реЗ рд╕реНрдкрд╛рд░реНрдХ рдХрд╛рд░реНрдпреЛрдВ рдХреА рд╕реВрдЪреА рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдВ:

sparkctl list -n {project}

рдЖрдЗрдП рд╕реНрдкрд╛рд░реНрдХ рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╡рд░рдг рдмрдирд╛рдПрдВ:

vi spark-app.yaml

apiVersion: "sparkoperator.k8s.io/v1beta1"
kind: SparkApplication
metadata:
  name: spark-pi
  namespace: {project}
spec:
  type: Scala
  mode: cluster
  image: "gcr.io/spark-operator/spark:v2.4.0"
  imagePullPolicy: Always
  mainClass: org.apache.spark.examples.SparkPi
  mainApplicationFile: "local:///opt/spark/examples/jars/spark-examples_2.11-2.4.0.jar"
  sparkVersion: "2.4.0"
  restartPolicy:
    type: Never
  volumes:
    - name: "test-volume"
      hostPath:
        path: "/tmp"
        type: Directory
  driver:
    cores: 1
    coreLimit: "1000m"
    memory: "512m"
    labels:
      version: 2.4.0
    serviceAccount: spark
    volumeMounts:
      - name: "test-volume"
        mountPath: "/tmp"
  executor:
    cores: 1
    instances: 1
    memory: "512m"
    labels:
      version: 2.4.0
    volumeMounts:
      - name: "test-volume"
        mountPath: "/tmp"

рдЖрдЗрдП sparkctl рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡рд░реНрдгрд┐рдд рдХрд╛рд░реНрдп рдЪрд▓рд╛рдПрдБ:

sparkctl create spark-app.yaml -n {project}

рдЖрдЗрдП рдЪрд▓ рд░рд╣реЗ рд╕реНрдкрд╛рд░реНрдХ рдХрд╛рд░реНрдпреЛрдВ рдХреА рд╕реВрдЪреА рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдВ:

sparkctl list -n {project}

рдЖрдЗрдП рд▓реЙрдиреНрдЪ рдХрд┐рдП рдЧрдП рд╕реНрдкрд╛рд░реНрдХ рдХрд╛рд░реНрдп рдХреА рдШрдЯрдирд╛рдУрдВ рдХреА рд╕реВрдЪреА рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВ:

sparkctl event spark-pi -n {project} -f

рдЖрдЗрдП рдЪрд▓ рд░рд╣реЗ рд╕реНрдкрд╛рд░реНрдХ рдХрд╛рд░реНрдп рдХреА рд╕реНрдерд┐рддрд┐ рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдВ:

sparkctl status spark-pi -n {project}

рдЕрдВрдд рдореЗрдВ, рдореИрдВ рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдореЗрдВ рд╕реНрдкрд╛рд░реНрдХ рдХреЗ рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рд░ рд╕рдВрд╕реНрдХрд░рдг (2.4.5) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдЦреЛрдЬреЗ рдЧрдП рдиреБрдХрд╕рд╛рдиреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛:

  1. рдкрд╣рд▓рд╛ рдФрд░, рд╢рд╛рдпрдж, рдореБрдЦреНрдп рдиреБрдХрд╕рд╛рди рдбреЗрдЯрд╛ рд╕реНрдерд╛рдиреАрдпрддрд╛ рдХреА рдХрдореА рд╣реИред YARN рдХреА рд╕рднреА рдХрдорд┐рдпреЛрдВ рдХреЗ рдмрд╛рд╡рдЬреВрдж, рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдлрд╛рдпрджреЗ рднреА рдереЗ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреЛрдб рдХреЛ рдбреЗрдЯрд╛ рддрдХ рдкрд╣реБрдВрдЪрд╛рдиреЗ рдХрд╛ рд╕рд┐рджреНрдзрд╛рдВрдд (рдбреЗрдЯрд╛ рд╕реЗ рдХреЛрдб рдХреЗ рдмрдЬрд╛рдп)ред рдЗрд╕рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рд╕реНрдкрд╛рд░реНрдХ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдЙрди рдиреЛрдбреНрд╕ рдкрд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдЬрд╣рд╛рдВ рдЧрдгрдирд╛ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдбреЗрдЯрд╛ рд╕реНрдерд┐рдд рдерд╛, рдФрд░ рдиреЗрдЯрд╡рд░реНрдХ рдкрд░ рдбреЗрдЯрд╛ рд╡рд┐рддрд░рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд▓рдЧрдиреЗ рд╡рд╛рд▓рд╛ рд╕рдордп рдХрд╛рдлреА рдХрдо рд╣реЛ рдЧрдпрд╛ рдерд╛ред рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рд╣рдореЗрдВ рдХрд┐рд╕реА рдХрд╛рд░реНрдп рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдбреЗрдЯрд╛ рдХреЛ рдкреВрд░реЗ рдиреЗрдЯрд╡рд░реНрдХ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рддрд╛ рд╣реИред рдпрджрд┐ рд╡реЗ рдкрд░реНрдпрд╛рдкреНрдд рдмрдбрд╝реЗ рд╣реИрдВ, рддреЛ рдХрд╛рд░реНрдп рдирд┐рд╖реНрдкрд╛рджрди рд╕рдордп рдореЗрдВ рдХрд╛рдлреА рд╡реГрджреНрдзрд┐ рд╣реЛ рд╕рдХрддреА рд╣реИ, рдФрд░ рдЙрдирдХреЗ рдЕрд╕реНрдерд╛рдпреА рднрдВрдбрд╛рд░рдг рдХреЗ рд▓рд┐рдП рд╕реНрдкрд╛рд░реНрдХ рдХрд╛рд░реНрдп рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рдЖрд╡рдВрдЯрд┐рдд рдбрд┐рд╕реНрдХ рд╕реНрдерд╛рди рдХреА рдХрд╛рдлреА рдмрдбрд╝реА рдорд╛рддреНрд░рд╛ рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдЗрд╕ рдиреБрдХрд╕рд╛рди рдХреЛ рд╡рд┐рд╢реЗрд╖ рд╕реЙрдлрд╝реНрдЯрд╡реЗрдпрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрдо рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдСрд▓рдХреНрд╕рд┐рдпреЛ) рдореЗрдВ рдбреЗрдЯрд╛ рд╕реНрдерд╛рдиреАрдпрддрд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХрд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдорддрд▓рдм рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдХреНрд▓рд╕реНрдЯрд░ рдХреЗ рдиреЛрдбреНрд╕ рдкрд░ рдбреЗрдЯрд╛ рдХреА рдПрдХ рдкреВрд░реА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
  2. рджреВрд╕рд░рд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдиреБрдХрд╕рд╛рди рд╕реБрд░рдХреНрд╖рд╛ рд╣реИ. рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рд╕реНрдкрд╛рд░реНрдХ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рд╕реБрд░рдХреНрд╖рд╛-рд╕рдВрдмрдВрдзрд┐рдд рд╕реБрд╡рд┐рдзрд╛рдПрдВ рдЕрдХреНрд╖рдо рд╣реИрдВ, рдХреЗрд░реНрдмрд░реЛрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рджрд╕реНрддрд╛рд╡реЗрдЬ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реИ (рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╕рдВрдмрдВрдзрд┐рдд рд╡рд┐рдХрд▓реНрдк рд╕рдВрд╕реНрдХрд░рдг 3.0.0 рдореЗрдВ рдкреЗрд╢ рдХрд┐рдП рдЧрдП рдереЗ, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдЕрддрд┐рд░рд┐рдХреНрдд рдХрд╛рдо рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА), рдФрд░ рд╕реБрд░рдХреНрд╖рд╛ рджрд╕реНрддрд╛рд╡реЗрдЬ рдХреЗ рд▓рд┐рдП рд╕реНрдкрд╛рд░реНрдХ (https://spark.apache.org/docs/2.4.5/security.html) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреЗрд╡рд▓ YARN, рдореЗрд╕реЛрд╕ рдФрд░ рд╕реНрдЯреИрдВрдбрдЕрд▓реЛрди рдХреНрд▓рд╕реНрдЯрд░ рдкреНрд░рдореБрдЦ рд╕реНрдЯреЛрд░ рдХреЗ рд░реВрдк рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрддреЗ рд╣реИрдВред рдЙрд╕реА рд╕рдордп, рдЬрд┐рд╕ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рддрд╣рдд рд╕реНрдкрд╛рд░реНрдХ рдХрд╛рд░реНрдп рд▓реЙрдиреНрдЪ рдХрд┐рдП рдЧрдП рд╣реИрдВ, рдЙрд╕реЗ рд╕реАрдзреЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ - рд╣рдо рдХреЗрд╡рд▓ рдЙрд╕ рд╕реЗрд╡рд╛ рдЦрд╛рддреЗ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рд╕рдХреЗ рддрд╣рдд рдпрд╣ рдХрд╛рдо рдХрд░реЗрдЧрд╛, рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХреА рдЧрдИ рд╕реБрд░рдХреНрд╖рд╛ рдиреАрддрд┐рдпреЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЪреБрдирд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рд╕рдВрдмрдВрдз рдореЗрдВ, рдпрд╛ рддреЛ рд░реВрдЯ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдЙрддреНрдкрд╛рджрдХ рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рд╕реБрд░рдХреНрд╖рд┐рдд рдирд╣реАрдВ рд╣реИ, рдпрд╛ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдпреВрдЖрдИрдбреА рд╡рд╛рд▓реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдбреЗрдЯрд╛ рддрдХ рдкрд╣реБрдВрдЪ рдЕрдзрд┐рдХрд╛рд░ рд╡рд┐рддрд░рд┐рдд рдХрд░рддреЗ рд╕рдордп рдЕрд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ (рдЗрд╕реЗ PodSecurityPolicies рдмрдирд╛рдХрд░ рдФрд░ рдЙрдиреНрд╣реЗрдВ рд▓рд┐рдВрдХ рдХрд░рдХреЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ) рд╕рдВрдмрдВрдзрд┐рдд рд╕реЗрд╡рд╛ рдЦрд╛рддреЗ)ред рд╡рд░реНрддрдорд╛рди рдореЗрдВ, рд╕рдорд╛рдзрд╛рди рдпрд╛ рддреЛ рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рд╕реАрдзреЗ рдбреЙрдХрд░ рдЫрд╡рд┐ рдореЗрдВ рд░рдЦрдирд╛ рд╣реИ, рдпрд╛ рдЖрдкрдХреЗ рд╕рдВрдЧрдарди рдореЗрдВ рдЕрдкрдирд╛рдП рдЧрдП рд░рд╣рд╕реНрдпреЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдФрд░ рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддрдВрддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдкрд╛рд░реНрдХ рд▓реЙрдиреНрдЪ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдирд╛ рд╣реИред
  3. рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реНрдкрд╛рд░реНрдХ рдиреМрдХрд░рд┐рдпрд╛рдВ рдЪрд▓рд╛рдирд╛ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рддреМрд░ рдкрд░ рдЕрднреА рднреА рдкреНрд░рдпреЛрдЧрд╛рддреНрдордХ рдореЛрдб рдореЗрдВ рд╣реИ рдФрд░ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рдХрд▓рд╛рдХреГрддрд┐рдпреЛрдВ (рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓реЗрдВ, рдбреЙрдХрд░ рдмреЗрд╕ рдЫрд╡рд┐рдпрд╛рдВ рдФрд░ рд▓реЙрдиреНрдЪ рд╕реНрдХреНрд░рд┐рдкреНрдЯ) рдореЗрдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрджрд▓рд╛рд╡ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╕рд╛рдордЧреНрд░реА рддреИрдпрд╛рд░ рдХрд░рддреЗ рд╕рдордп, рд╕рдВрд╕реНрдХрд░рдг 2.3.0 рдФрд░ 2.4.5 рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рдЧрдпрд╛, рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд╛рдлреА рднрд┐рдиреНрди рдерд╛ред

рдЖрдЗрдП рдЕрдкрдбреЗрдЯ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдВ - рд╕реНрдкрд╛рд░реНрдХ рдХрд╛ рдПрдХ рдирдпрд╛ рд╕рдВрд╕реНрдХрд░рдг (3.0.0) рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдЬрд╛рд░реА рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЬрд┐рд╕рдиреЗ рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдкрд░ рд╕реНрдкрд╛рд░реНрдХ рдХреЗ рдХрд╛рдо рдореЗрдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрджрд▓рд╛рд╡ рд▓рд╛рдП, рд▓реЗрдХрд┐рди рдЗрд╕ рд╕рдВрд╕рд╛рдзрди рдкреНрд░рдмрдВрдзрдХ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдХреА рдкреНрд░рдпреЛрдЧрд╛рддреНрдордХ рд╕реНрдерд┐рддрд┐ рдмрд░рдХрд░рд╛рд░ рд░рдЦреАред рд╢рд╛рдпрдж рдЕрдЧрд▓рд╛ рдЕрдкрдбреЗрдЯ рдЖрдкрдХреЗ рд╕рд┐рд╕реНрдЯрдо рдХреА рд╕реБрд░рдХреНрд╖рд╛ рдХреЗ рдбрд░ рдХреЗ рдмрд┐рдирд╛ рдФрд░ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдШрдЯрдХреЛрдВ рдХреЛ рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдмрд┐рдирд╛, YARN рдХреЛ рдЫреЛрдбрд╝рдиреЗ рдФрд░ рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдкрд░ рд╕реНрдкрд╛рд░реНрдХ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреА рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрдиреБрд╢рдВрд╕рд╛ рдХрд░рдирд╛ рд╕рдВрднрд╡ рдмрдирд╛ рджреЗрдЧрд╛ред

рд╕рдорд╛рдкреНрддред

рд╕реНрд░реЛрдд: www.habr.com

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╝реЗрдВ