Kubernetes рдорд╛ Apache Spark рдЪрд▓рд╛рдЙрдБрджреИ

рдкреНрд░рд┐рдп рдкрд╛рдардХрд╣рд░реВ, рд╢реБрдн рджрд┐рдЙрдБрд╕реЛред рдЖрдЬ рд╣рд╛рдореА Apache Spark рд░ рдпрд╕рдХреЛ рд╡рд┐рдХрд╛рд╕ рд╕рдореНрднрд╛рд╡рдирд╛рд╣рд░реВрдХреЛ рдмрд╛рд░реЗрдорд╛ рдереЛрд░реИ рдХреБрд░рд╛ рдЧрд░реНрдиреЗрдЫреМрдВред

Kubernetes рдорд╛ Apache Spark рдЪрд▓рд╛рдЙрдБрджреИ

рдмрд┐рдЧ рдбрд╛рдЯрд╛рдХреЛ рдЖрдзреБрдирд┐рдХ рд╕рдВрд╕рд╛рд░рдорд╛, Apache Spark рдмреНрдпрд╛рдЪ рдбреЗрдЯрд╛ рдкреНрд░рд╢реЛрдзрди рдХрд╛рд░реНрдпрд╣рд░реВ рд╡рд┐рдХрд╛рд╕ рдЧрд░реНрдирдХреЛ рд▓рд╛рдЧрд┐ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдорд╛рдирдХ рд╣реЛред рдердк рд░реВрдкрдорд╛, рдпреЛ рд╕реНрдЯреНрд░рд┐рдорд┐рдЩ рдЕрдиреБрдкреНрд░рдпреЛрдЧрд╣рд░реВ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрди рдкрдирд┐ рдкреНрд░рдпреЛрдЧ рдЧрд░рд┐рдиреНрдЫ рдЬреБрди рдорд╛рдЗрдХреНрд░реЛ рдмреНрдпрд╛рдЪ рдЕрд╡рдзрд╛рд░рдгрд╛, рдкреНрд░рд╢реЛрдзрди рд░ рдвреБрд╡рд╛рдиреА рдбрд╛рдЯрд╛ рд╕рд╛рдирд╛ рднрд╛рдЧрд╣рд░реВрдорд╛ рдХрд╛рдо рдЧрд░реНрджрдЫ (рд╕реНрдкрд╛рд░реНрдХ рд╕реНрдЯреНрд░рдХреНрдЪрд░реНрдб рд╕реНрдЯреНрд░рд┐рдорд┐рдЩ)ред рд░ рдкрд░рдореНрдкрд░рд╛рдЧрдд рд░реВрдкрдорд╛ рдпреЛ рд╕рдордЧреНрд░ Hadoop рд╕реНрдЯреНрдпрд╛рдХрдХреЛ рднрд╛рдЧ рднрдПрдХреЛ рдЫ, рд╕реНрд░реЛрдд рдкреНрд░рдмрдиреНрдзрдХрдХреЛ рд░реВрдкрдорд╛ YARN (рд╡рд╛ рдХреЗрд╣рд┐ рдЕрд╡рд╕реНрдерд╛рдорд╛ Apache Mesos) рдкреНрд░рдпреЛрдЧ рдЧрд░реАред 2020 рд╕рдореНрдо, рд╕рднреНрдп Hadoop рд╡рд┐рддрд░рдгрдХреЛ рдХрдореАрдХреЛ рдХрд╛рд░рдгрд▓реЗ рдпрд╕рдХреЛ рдкрд░рдореНрдкрд░рд╛рдЧрдд рд░реВрдкрдорд╛ рдпрд╕рдХреЛ рдкреНрд░рдпреЛрдЧ рдзреЗрд░реИ рдХрдореНрдкрдиреАрд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рдкреНрд░рд╢реНрдирдорд╛ рдЫ - HDP рд░ CDH рдХреЛ рд╡рд┐рдХрд╛рд╕ рд░реЛрдХрд┐рдПрдХреЛ рдЫ, CDH рд░рд╛рдореНрд░реЛрд╕рдБрдЧ рд╡рд┐рдХрд╕рд┐рдд рднрдПрдХреЛ рдЫреИрди рд░ рдЙрдЪреНрдЪ рд▓рд╛рдЧрдд рдЫ, рд░ рдмрд╛рдБрдХреА Hadoop рдЖрдкреВрд░реНрддрд┐рдХрд░реНрддрд╛рд╣рд░реВ рдЫрдиреНред рдХрд┐ рдд рдЕрд╕реНрддрд┐рддреНрд╡ рд╕рдорд╛рдкреНрдд рднрдпреЛ рд╡рд╛ рдЕрдиреНрдзрдХрд╛рд░ рднрд╡рд┐рд╖реНрдп рдЫред рддрд╕рд░реНрде, Kubernetes рдХреЛ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ Apache Spark рдХреЛ рдкреНрд░рдХреНрд╖реЗрдкрдг рд╕рдореБрджрд╛рдп рд░ рдареВрд▓рд╛ рдХрдореНрдкрдиреАрд╣рд░реБ рдорд╛рдЭ рдмрдвреНрджреЛ рдЪрд╛рд╕реЛрдХреЛ рд╡рд┐рд╖рдп рд╣реЛ - рдирд┐рдЬреА рд░ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдХреНрд▓рд╛рдЙрдбрд╣рд░реБрдорд╛ рдХрдиреНрдЯреЗрдирд░ рдЕрд░реНрдХреЗрд╕реНрдЯреНрд░реЗрд╕рди рд░ рд╕рдВрд╕рд╛рдзрди рд╡реНрдпрд╡рд╕реНрдерд╛рдкрди рдорд╛ рдПрдХ рдорд╛рдирдХ рдмрдиреЗрдХреЛ рдЫ, рдпрд╕рд▓реЗ YARN рдорд╛ рд╕реНрдкрд╛рд░реНрдХ рдХрд╛рд░реНрдпрд╣рд░реБ рдХреЛ рдЕрд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╕рдВрд╕рд╛рдзрди рддрд╛рд▓рд┐рдХрд╛ рд╕рдВрдЧ рд╕рдорд╕реНрдпрд╛ рд╕рдорд╛рдзрд╛рди рдЧрд░реНрджрдЫ рд░ рдкреНрд░рджрд╛рди рдЧрд░реНрджрдЫред рд╕рдмреИ рдЖрдХрд╛рд░ рд░ рд╕реНрдЯреНрд░рд╛рдЗрдкрдХрд╛ рдХрдореНрдкрдиреАрд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рдзреЗрд░реИ рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рд░ рдЦреБрд▓рд╛ рд╡рд┐рддрд░рдгрдХреЛ рд╕рд╛рде рд╕реНрдерд┐рд░ рд░реВрдкрдорд╛ рд╡рд┐рдХрд╛рд╕ рднрдЗрд░рд╣реЗрдХреЛ рдкреНрд▓реЗрдЯрдлрд░реНрдоред рдердк рд░реВрдкрдорд╛, рд▓реЛрдХрдкреНрд░рд┐рдпрддрд╛рдХреЛ рдЖрдзрд╛рд░рдорд╛, рдзреЗрд░реИрд▓реЗ рдкрд╣рд┐рд▓реЗ рдиреИ рдЖрдлреНрдиреИ рд╕реНрдерд╛рдкрдирд╛рд╣рд░реВрдХреЛ рдПрдХ рдЬреЛрдбреА рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрди рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдЧрд░рд┐рд╕рдХреЗрдХрд╛ рдЫрдиреН рд░ рдпрд╕рдХреЛ рдкреНрд░рдпреЛрдЧрдорд╛ рдЖрдлреНрдиреЛ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдмрдврд╛рдПрдХрд╛ рдЫрдиреН, рдЬрд╕рд▓реЗ рдЪрд╛рд▓рд▓рд╛рдИ рд╕рд░рд▓ рдмрдирд╛рдЙрдБрдЫред

рд╕рдВрд╕реНрдХрд░рдг 2.3.0 рдмрд╛рдЯ рд╕реБрд░реБ рдЧрд░реНрджреИ, Apache Spark рд▓реЗ Kubernetes рдХреНрд▓рд╕реНрдЯрд░рдорд╛ рдЪрд▓рд┐рд░рд╣реЗрдХреЛ рдХрд╛рд░реНрдпрд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рд╕рдорд░реНрдерди рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрдпреЛ рд░ рдЖрдЬ, рд╣рд╛рдореА рдпрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдгрдХреЛ рд╣рд╛рд▓рдХреЛ рдкрд░рд┐рдкрдХреНрд╡рддрд╛, рдпрд╕рдХреЛ рдкреНрд░рдпреЛрдЧрдХрд╛ рд▓рд╛рдЧрд┐ рд╡рд┐рднрд┐рдиреНрди рд╡рд┐рдХрд▓реНрдкрд╣рд░реВ рд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдирдХреЛ рдХреНрд░рдордорд╛ рд╕рд╛рдордирд╛ рдЧрд░реНрдиреЗ рд╕рдорд╕реНрдпрд╛рд╣рд░реВрдХреЛ рдмрд╛рд░реЗрдорд╛ рдХреБрд░рд╛ рдЧрд░реНрдиреЗрдЫреМрдВред

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

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

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

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

    Kubernetes рдорд╛ Apache Spark рдЪрд▓рд╛рдЙрдБрджреИ

  • рдПрдХ рд╡рд┐рдХрд╛рд╕рдХрд░реНрддрд╛рд▓реЗ рдкрд░реАрдХреНрд╖рдг рд▓реБрдкрдорд╛ Kubernetes рдХреНрд▓рд╕реНрдЯрд░рдорд╛ рд╕реНрдкрд╛рд░реНрдХ рдХрд╛рд░реНрдп рдЪрд▓рд╛рдЙрдБрдЫред

    Kubernetes рдорд╛ Apache Spark рдЪрд▓рд╛рдЙрдБрджреИ

рдкрд╣рд┐рд▓реЛ рд╡рд┐рдХрд▓реНрдкрдХреЛ рдЕрд╕реНрддрд┐рддреНрд╡рдХреЛ рдЕрдзрд┐рдХрд╛рд░ рдЫ, рддрд░ рдпрд╕рд▓реЗ рдзреЗрд░реИ рдмреЗрдлрд╛рдЗрджрд╛рд╣рд░реВ рд╕рдорд╛рд╡реЗрд╢ рдЧрд░реНрджрдЫ:

  • рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рдХрд╛рд╕рдХрд░реНрддрд╛рд▓рд╛рдИ рдХрд╛рд░реНрдпрд╕реНрдерд▓рдмрд╛рдЯ рдЙрд╕рд▓рд╛рдИ рдЖрд╡рд╢реНрдпрдХ рдкрд░реНрдиреЗ рдЕрдиреНрддрд┐рдо рдкреНрд░рдгрд╛рд▓реАрд╣рд░реВрдХреЛ рд╕рдмреИ рдЙрджрд╛рд╣рд░рдгрд╣рд░реВрдорд╛ рдкрд╣реБрдБрдЪ рдкреНрд░рджрд╛рди рдЧрд░рд┐рдиреБрдкрд░реНрдЫред
  • рд╡рд┐рдХрд╛рд╕ рднрдЗрд░рд╣реЗрдХреЛ рдХрд╛рд░реНрдп рдЪрд▓рд╛рдЙрдирдХреЛ рд▓рд╛рдЧрд┐ рдХрд╛рдо рдЧрд░реНрдиреЗ рдореЗрд╕рд┐рдирдорд╛ рдкрд░реНрдпрд╛рдкреНрдд рдорд╛рддреНрд░рд╛рдорд╛ рд╕реНрд░реЛрддрд╣рд░реВ рдЖрд╡рд╢реНрдпрдХ рдкрд░реНрджрдЫред

рджреЛрд╕реНрд░реЛ рд╡рд┐рдХрд▓реНрдкрдорд╛ рдпреА рдмреЗрдлрд╛рдЗрджрд╛рд╣рд░реВ рдЫреИрдирдиреН, рдХрд┐рдирдХрд┐ Kubernetes рдХреНрд▓рд╕реНрдЯрд░рдХреЛ рдкреНрд░рдпреЛрдЧрд▓реЗ рддрдкрд╛рдИрдВрд▓рд╛рдИ рдХрд╛рд░реНрдпрд╣рд░реВ рдЪрд▓рд╛рдЙрдирдХреЛ рд▓рд╛рдЧрд┐ рдЖрд╡рд╢реНрдпрдХ рд╕реНрд░реЛрдд рдкреЛрдЦрд░реА рдЖрд╡рдВрдЯрд┐рдд рдЧрд░реНрди рд░ рдпрд╕рд▓рд╛рдИ рдЕрдиреНрддрд┐рдо рдкреНрд░рдгрд╛рд▓реА рдЙрджрд╛рд╣рд░рдгрд╣рд░реВрдорд╛ рдЖрд╡рд╢реНрдпрдХ рдкрд╣реБрдБрдЪ рдкреНрд░рджрд╛рди рдЧрд░реНрди рдЕрдиреБрдорддрд┐ рджрд┐рдиреНрдЫ, рд▓рдЪрд┐рд▓реЛ рд░реВрдкрдорд╛ Kubernetes рд░реЛрд▓ рдореЛрдбреЗрд▓ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рдпрд╕рдорд╛ рдкрд╣реБрдБрдЪ рдкреНрд░рджрд╛рди рдЧрд░реНрджрдЫред рд╡рд┐рдХрд╛рд╕ рдЯреЛрд▓реАрдХрд╛ рд╕рдмреИ рд╕рджрд╕реНрдпрд╣рд░реВред рдпрд╕рд▓рд╛рдИ рдкрд╣рд┐рд▓реЛ рдкреНрд░рдпреЛрдЧ рдХреЗрд╕рдХреЛ рд░реВрдкрдорд╛ рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдЧрд░реМрдВ - рдПрдХ рд╕реНрдерд╛рдиреАрдп рд╡рд┐рдХрд╛рд╕рдХрд░реНрддрд╛ рдореЗрд╕рд┐рдирдмрд╛рдЯ рдХреБрдмрд░реНрдиреЗрдЯреНрд╕ рдХреНрд▓рд╕реНрдЯрд░рдорд╛ рдкрд░реАрдХреНрд╖рдг рд▓реБрдкрдорд╛ рд╕реНрдкрд╛рд░реНрдХ рдХрд╛рд░реНрдпрд╣рд░реВ рд╕реБрд░реБ рдЧрд░реНрджреИред

рд╕реНрдерд╛рдиреАрдп рд░реВрдкрдорд╛ рдЪрд▓рд╛рдЙрди рд╕реНрдкрд╛рд░реНрдХ рд╕реНрдерд╛рдкрдирд╛ рдЧрд░реНрдиреЗ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдХреЛ рдмрд╛рд░реЗрдорд╛ рдердк рдХреБрд░рд╛ рдЧрд░реМрдВред рд╕реНрдкрд╛рд░реНрдХ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрди рд╕реБрд░реБ рдЧрд░реНрди рддрдкрд╛рдИрдВрд▓реЗ рдпрд╕рд▓рд╛рдИ рд╕реНрдерд╛рдкрдирд╛ рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫ:

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

рд╣рд╛рдореА Kubernetes рд╕рдБрдЧ рдХрд╛рдо рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдкреНрдпрд╛рдХреЗрдЬрд╣рд░реВ рд╕рдЩреНрдХрд▓рди рдЧрд░реНрдЫреМрдВ:

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

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

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

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

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

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

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

рдпрд╕рдХреЛ рдорджреНрджрддрд▓реЗ, рддрдкрд╛рдЗрдБ рдбрдХрд░ рдЫрд╡рд┐рд╣рд░реВ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ рд░ рддрд┐рдиреАрд╣рд░реВрд▓рд╛рдИ рд░рд┐рдореЛрдЯ рд░реЗрдЬрд┐рд╕реНрдЯреНрд░реАрд╣рд░реВрдорд╛ рдЕрдкрд▓реЛрдб рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ, рддрд░ рдкреВрд░реНрд╡рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд░реВрдкрдорд╛ рдпрд╕рдорд╛ рдзреЗрд░реИ рдмреЗрдлрд╛рдЗрджрд╛рд╣рд░реВ рдЫрдиреН:

  • рдмрд┐рдирд╛ рдЕрд╕рдлрд▓рддрд╛рд▓реЗ рдПрдХреИрдЪреЛрдЯрд┐ 3 рдбрдХрд░ рдЫрд╡рд┐рд╣рд░реВ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрджрдЫ - рд╕реНрдкрд╛рд░реНрдХ, PySpark рд░ R рдХреЛ рд▓рд╛рдЧрд┐;
  • рддрдкрд╛рдИрдВрд▓рд╛рдИ рдЫрд╡рд┐ рдирд╛рдо рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЧрд░реНрди рдЕрдиреБрдорддрд┐ рджрд┐рдБрджреИрдиред

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

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

рдпрд╕рдХреЛ рдорджреНрджрддрд▓реЗ, рд╣рд╛рдореА рд╕реНрдкрд╛рд░реНрдХ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ Pi рдЧрдгрдирд╛ рдЧрд░реНрдирдХреЛ рд▓рд╛рдЧрд┐ рдкрд░реАрдХреНрд╖рдг рдХрд╛рд░реНрдп рд╕рд╣рд┐рддрдХреЛ рдЖрдзрд╛рд░рднреВрдд рд╕реНрдкрд╛рд░реНрдХ рдЫрд╡рд┐рд▓рд╛рдИ рднреЗрд▓рд╛ рдЧрд░реНрдЫреМрдВ (рдпрд╣рд╛рдБ {docker-registry-url} рддрдкрд╛рдИрдВрдХреЛ рдбрдХрд░ рдЫрд╡рд┐ рд░рдЬрд┐рд╕реНрдЯреНрд░реАрдХреЛ URL рд╣реЛ, {repo} рд░рдЬрд┐рд╕реНрдЯреНрд░реА рднрд┐рддреНрд░рдХреЛ рднрдгреНрдбрд╛рд░рдХреЛ рдирд╛рдо рд╣реЛ, рдЬреБрди OpenShift рдорд╛ рдкрд░рд┐рдпреЛрдЬрдирд╛рд╕рдБрдЧ рдореЗрд▓ рдЦрд╛рдиреНрдЫ, {image-name} - рдЫрд╡рд┐рдХреЛ рдирд╛рдо (рдпрджрд┐ рдЫрд╡рд┐рд╣рд░реВрдХреЛ рддреАрди-рд╕реНрддрд░ рд╡рд┐рднрд╛рдЬрди рдкреНрд░рдпреЛрдЧ рдЧрд░рд┐рдиреНрдЫ, рдЙрджрд╛рд╣рд░рдгрдХрд╛ рд▓рд╛рдЧрд┐, Red Hat OpenShift рдЫрд╡рд┐рд╣рд░реВрдХреЛ рдПрдХреАрдХреГрдд рд░рдЬрд┐рд╕реНрдЯреНрд░реАрдорд╛ рдЬрд╕реНрддреИ), {tag} - рдпрд╕рдХреЛ рдЯреНрдпрд╛рдЧ рдЫрд╡рд┐ рдХреЛ рд╕рдВрд╕реНрдХрд░рдг):

./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

рдХрдиреНрд╕реЛрд▓ рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ OKD рдХреНрд▓рд╕реНрдЯрд░рдорд╛ рд▓рдЧ рдЗрди рдЧрд░реНрдиреБрд╣реЛрд╕реН (рдпрд╣рд╛рдБ {OKD-API-URL} OKD рдХреНрд▓рд╕реНрдЯрд░ API URL рд╣реЛ):

oc login {OKD-API-URL}

рдбрдХрд░ рд░рдЬрд┐рд╕реНрдЯреНрд░реАрдорд╛ рдкреНрд░рд╛рдзрд┐рдХрд░рдгрдХреЛ рд▓рд╛рдЧрд┐ рд╣рд╛рд▓рдХреЛ рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛рдХреЛ рдЯреЛрдХрди рдкреНрд░рд╛рдкреНрдд рдЧрд░реМрдВ:

oc whoami -t

OKD рдХреНрд▓рд╕реНрдЯрд░рдХреЛ рдЖрдиреНрддрд░рд┐рдХ рдбрдХрд░ рд░рдЬрд┐рд╕реНрдЯреНрд░реАрдорд╛ рд▓рдЧ рдЗрди рдЧрд░реНрдиреБрд╣реЛрд╕реН (рд╣рд╛рдореА рдкрд╛рд╕рд╡рд░реНрдбрдХреЛ рд░реВрдкрдорд╛ рдЕрдШрд┐рд▓реНрд▓реЛ рдЖрджреЗрд╢ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рдкреНрд░рд╛рдкреНрдд рдЯреЛрдХрди рдкреНрд░рдпреЛрдЧ рдЧрд░реНрджрдЫреМрдВ):

docker login {docker-registry-url}

рдбрдХрд░ рд░рдЬрд┐рд╕реНрдЯреНрд░реА OKD рдорд╛ рдПрд╕реЗрдореНрдмрд▓ рдЧрд░рд┐рдПрдХреЛ рдбрдХрд░ рдЫрд╡рд┐ рдЕрдкрд▓реЛрдб рдЧрд░реМрдВ:

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

рднреЗрд▓рд╛ рдЧрд░рд┐рдПрдХреЛ рдЫрд╡рд┐ OKD рдорд╛ рдЙрдкрд▓рдмреНрдз рдЫ рднрдиреЗрд░ рдЬрд╛рдБрдЪ рдЧрд░реМрдВред рдпреЛ рдЧрд░реНрдирдХрд╛ рд▓рд╛рдЧрд┐, рдмреНрд░рд╛рдЙрдЬрд░рдорд╛ рд╕рдореНрдмрдиреНрдзрд┐рдд рдкрд░рд┐рдпреЛрдЬрдирд╛рдХрд╛ рдЫрд╡рд┐рд╣рд░реВрдХреЛ рд╕реВрдЪреАрд╕рд╣рд┐рдд URL рдЦреЛрд▓реНрдиреБрд╣реЛрд╕реН (рдпрд╣рд╛рдБ {project} OpenShift рдХреНрд▓рд╕реНрдЯрд░ рднрд┐рддреНрд░рдХреЛ рдкрд░рд┐рдпреЛрдЬрдирд╛рдХреЛ рдирд╛рдо рд╣реЛ, {OKD-WEBUI-URL} OpenShift рд╡реЗрдм рдХрдиреНрд╕реЛрд▓рдХреЛ URL рд╣реЛред ) - https://{OKD-WEBUI-URL}/console /project/{project}/browse/images/{image-name}ред

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

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

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

 /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 - рдбрдХрд░ рдЫрд╡рд┐ рдкреЛрдбрд╣рд░реВ рд╕реБрд░реБ рдЧрд░реНрди рдкреНрд░рдпреЛрдЧ рдЧрд░рд┐рдпреЛ;

spark.master тАФ Kubernetes API URL (рдмрд╛рд╣реНрдп рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЧрд░рд┐рдПрдХреЛ рдЫ рддреНрдпрд╕реИрд▓реЗ рдкрд╣реБрдБрдЪ рд╕реНрдерд╛рдиреАрдп рдореЗрд╕рд┐рдирдмрд╛рдЯ рд╣реБрдиреНрдЫ);

local:// рдбрдХрд░ рдЫрд╡рд┐ рднрд┐рддреНрд░ рд╕реНрдкрд╛рд░реНрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдирдпреЛрдЧреНрдп рдорд╛рд░реНрдЧ рд╣реЛред

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

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

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

рддрдкрд╛рдИрдВрд▓реЗ рдпрд╕реНрддреЛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрдиреБрд╣реБрдиреЗрдЫ (рдпрд╣рд╛рдБ {location} рдлрд╛рдЗрд▓ рдбрд╛рдЙрдирд▓реЛрдб рдЧрд░реНрди рдкреНрд░рдпреЛрдЧ рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ URL рд╣реЛ):

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}"

рдпрд╕рдкрдЫрд┐, рд╣рд╛рдореА HDFS рдорд╛ рдЕрдкрд▓реЛрдб рдЧрд░рд┐рдПрдХреЛ рд╕реНрдкрд╛рд░реНрдХ рдлрд╛рдЗрд▓ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рд╕реНрдкрд╛рд░реНрдХ-рд╕рдмрдорд┐рдЯ рдЧрд░реНрди рд╕рдХреНрдЫреМрдВ (рдпрд╣рд╛рдБ {class-name} рдХрд╛рд░реНрдп рдкреВрд░рд╛ рдЧрд░реНрди рд╕реБрд░реБ рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдкрд░реНрдиреЗ рдХрдХреНрд╖рд╛рдХреЛ рдирд╛рдо рд╣реЛ):

/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}

рдпреЛ рдзреНрдпрд╛рди рджрд┐рдиреБрдкрд░реНрдЫ рдХрд┐ HDFS рдкрд╣реБрдБрдЪ рдЧрд░реНрди рд░ рдХрд╛рд░реНрдп рдХрд╛рд░реНрдпрд╣рд░реВ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдЧрд░реНрди, рддрдкрд╛рдИрдВрд▓реЗ Dockerfile рд░ entrypoint.sh рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкрд░рд┐рд╡рд░реНрддрди рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдкрд░реНрджрдЫ - /opt/spark/jars рдбрд╛рдЗрд░реЗрдХреНрдЯрд░реАрдорд╛ рдирд┐рд░реНрднрд░ рдкреБрд╕реНрддрдХрд╛рд▓рдпрд╣рд░реВ рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдЧрд░реНрди Dockerfile рдорд╛ рдирд┐рд░реНрджреЗрд╢рди рдердкреНрдиреБрд╣реЛрд╕реН рд░ HDFS рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рди рдлрд╛рдЗрд▓ SPARK_CLASSPATH рдорд╛ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдмрд┐рдиреНрджреБрдорд╛ рд╕рдорд╛рд╡реЗрд╢ рдЧрд░реНрдиреБрд╣реЛрд╕реНред

рджреЛрд╕реНрд░реЛ рдкреНрд░рдпреЛрдЧ рдХреЗрд╕ - Apache Livy

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

Kubernetes рдорд╛ Apache Spark рдЪрд▓рд╛рдЙрдБрджреИ

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

Apache Livy рдХреЛ рдмрд╛рд░реЗрдорд╛ рдереЛрд░реИ - рдпрд╕рд▓реЗ HTTP рд╕рд░реНрднрд░рдХреЛ рд░реВрдкрдорд╛ рдХрд╛рдо рдЧрд░реНрджрдЫ рдЬрд╕рд▓реЗ рд╡реЗрдм рдЗрдиреНрдЯрд░рдлреЗрд╕ рд░ RESTful API рдкреНрд░рджрд╛рди рдЧрд░реНрджрдЫ рдЬрд╕рд▓реЗ рддрдкрд╛рдИрдВрд▓рд╛рдИ рдЖрд╡рд╢реНрдпрдХ рдкреНрдпрд╛рд░рд╛рдорд┐рдЯрд░рд╣рд░реВ рдкрд╛рд░ рдЧрд░реЗрд░ рдЯрд╛рдврд╛рдмрд╛рдЯ рд╕реНрдкрд╛рд░реНрдХ-рд╕рдмрдорд┐рдЯ рд╕реБрд░реБ рдЧрд░реНрди рдЕрдиреБрдорддрд┐ рджрд┐рдиреНрдЫред рдкрд░рдореНрдкрд░рд╛рдЧрдд рд░реВрдкрдорд╛ рдпреЛ HDP рд╡рд┐рддрд░рдгрдХреЛ рднрд╛рдЧрдХреЛ рд░реВрдкрдорд╛ рдкрдард╛рдЗрдПрдХреЛ рдЫ, рддрд░ рдЙрдкрдпреБрдХреНрдд manifest рд░ рдбрдХрд░ рдЫрд╡рд┐рд╣рд░реВрдХреЛ рд╕реЗрдЯ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ OKD рд╡рд╛ рдХреБрдиреИ рдЕрдиреНрдп Kubernetes рд╕реНрдерд╛рдкрдирд╛рдорд╛ рдкрдирд┐ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫ, рдЬрд╕реНрддреИ рдпреЛ - 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"]

рдЙрддреНрдкрдиреНрди рдЫрд╡рд┐ рдирд┐рд░реНрдорд╛рдг рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫ рд░ рддрдкрд╛рдИрдВрдХреЛ рдЕрд╡рд╕реНрдерд┐рдд рдбрдХрд░ рд░рд┐рдкреЛрдЬрд┐рдЯрд░реАрдорд╛ рдЕрдкрд▓реЛрдб рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫ, рдЬрд╕реНрддреИ рдЖрдиреНрддрд░рд┐рдХ OKD рднрдгреНрдбрд╛рд░ред рдпрд╕рд▓рд╛рдИ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдирдХреЛ рд▓рд╛рдЧрд┐, рдирд┐рдореНрди manifest рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреБрд╣реЛрд╕реН ({registry-url} - рдбрдХрд░ рдЫрд╡рд┐ рд░рдЬрд┐рд╕реНрдЯреНрд░реАрдХреЛ URL, {image-name} - рдбрдХрд░ рдЫрд╡рд┐ рдирд╛рдо, {tag} - Docker рдЫрд╡рд┐ рдЯреНрдпрд╛рдЧ, {livy-url} - рдЗрдЪреНрдЫрд┐рдд URL рдЬрд╣рд╛рдБ рд╕рд░реНрднрд░ рдкрд╣реБрдБрдЪрдпреЛрдЧреНрдп Livy рд╣реБрдиреЗрдЫ; рдпрджрд┐ Red Hat OpenShift Kubernetes рд╡рд┐рддрд░рдгрдХреЛ рд░реВрдкрдорд╛ рдкреНрд░рдпреЛрдЧ рдЧрд░рд┐рдиреНрдЫ рднрдиреЗ "Route" manifest рдкреНрд░рдпреЛрдЧ рдЧрд░рд┐рдиреНрдЫ, рдЕрдиреНрдпрдерд╛ NodePort рдкреНрд░рдХрд╛рд░рдХреЛ рд╕рдореНрдмрдиреНрдзрд┐рдд Ingress рд╡рд╛ Service manifest рдкреНрд░рдпреЛрдЧ рдЧрд░рд┐рдиреНрдЫ):

---
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

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

{
    "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": {}
}

рд╕рдЩреНрдХрд▓рдирдмрд╛рдЯ рдкрд╣рд┐рд▓реЛ рдЕрдиреБрд░реЛрдз рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЧрд░реМрдВ, OKD рдЗрдиреНрдЯрд░рдлреЗрд╕рдорд╛ рдЬрд╛рдиреБрд╣реЛрд╕реН рд░ рдЬрд╛рдБрдЪ рдЧрд░реНрдиреБрд╣реЛрд╕реН рдХрд┐ рдХрд╛рд░реНрдп рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рд╕реБрд░реБ рднрдПрдХреЛ рдЫ - https://{OKD-WEBUI-URL}/console/project/{project}/browse/podsред рдПрдХреИ рд╕рдордпрдорд╛, Livy рдЗрдиреНрдЯрд░рдлреЗрд╕ (http://{livy-url}/ui) рдорд╛ рдПрдХ рд╕рддреНрд░ рджреЗрдЦрд╛ рдкрд░реНрдиреЗрдЫ, рдЬрд╕ рднрд┐рддреНрд░, Livy API рд╡рд╛ рдЧреНрд░рд╛рдлрд┐рдХрд▓ рдЗрдиреНрдЯрд░рдлреЗрд╕ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░, рддрдкрд╛рдЗрдБ рдХрд╛рд░реНрдпрдХреЛ рдкреНрд░рдЧрддрд┐ рдЯреНрд░реНрдпрд╛рдХ рдЧрд░реНрди рд░ рд╕рддреНрд░ рдЕрдзреНрдпрдпрди рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫред рд▓рдЧрд╣рд░реВред

рдЕрдм Livy рдХрд╕рд░реА рдХрд╛рдо рдЧрд░реНрджрдЫ рджреЗрдЦрд╛рдЙрдиреБрд╣реЛрд╕реНред рдпреЛ рдЧрд░реНрдирдХреЛ рд▓рд╛рдЧрд┐, Livy рд╕рд░реНрднрд░рдХреЛ рд╕рд╛рде рдкреЛрдб рднрд┐рддреНрд░ Livy рдХрдиреНрдЯреЗрдирд░рдХреЛ рд▓рдЧрд╣рд░реВ рдЬрд╛рдБрдЪ рдЧрд░реМрдВ - https://{OKD-WEBUI-URL}/console/project/{project}/browse/pods/{livy-pod-name }?tab=logsред рддрд┐рдиреАрд╣рд░реВрдмрд╛рдЯ рд╣рд╛рдореАрд▓реЗ рджреЗрдЦреНрди рд╕рдХреНрдЫреМрдВ рдХрд┐ Livy REST API рд▓рд╛рдИ "livy" рдирд╛рдордХреЛ рдХрдиреНрдЯреЗрдирд░рдорд╛ рдХрд▓ рдЧрд░реНрджрд╛, рд╣рд╛рдореАрд▓реЗ рдорд╛рдерд┐ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрдХреЛ рдЬрд╕реНрддреИ рд╕реНрдкрд╛рд░реНрдХ-рд╕рдмрдорд┐рдЯ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЧрд░рд┐рдиреНрдЫ (рдпрд╣рд╛рдБ {livy-pod-name} рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░рд┐рдПрдХреЛ рдкреЛрдбрдХреЛ рдирд╛рдо рд╣реЛред Livy рд╕рд░реНрднрд░ рд╕рдВрдЧ)ред рд╕рдЩреНрдХрд▓рдирд▓реЗ рджреЛрд╕реНрд░реЛ рдХреНрд╡реЗрд░реА рдкрдирд┐ рдкреНрд░рд╕реНрддреБрдд рдЧрд░реНрджрдЫ рдЬрд╕рд▓реЗ рддрдкрд╛рдИрдВрд▓рд╛рдИ рдЯрд╛рд╕реНрдХрд╣рд░реВ рдЪрд▓рд╛рдЙрди рдЕрдиреБрдорддрд┐ рджрд┐рдиреНрдЫ рдЬрд╕рд▓реЗ Livy рд╕рд░реНрднрд░ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рдЯрд╛рдврд╛рдмрд╛рдЯ рдПрдХ рд╕реНрдкрд╛рд░реНрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдирдпреЛрдЧреНрдп рд╣реЛрд╕реНрдЯ рдЧрд░реНрджрдЫред

рддреЗрд╕реНрд░реЛ рдкреНрд░рдпреЛрдЧ рдХреЗрд╕ - рд╕реНрдкрд╛рд░реНрдХ рдЕрдкрд░реЗрдЯрд░

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

Kubernetes рдорд╛ Apache Spark рдЪрд▓рд╛рдЙрдБрджреИ
рдпрд╕рд▓рд╛рдИ рддреЗрд╕реНрд░реЛ рдкреНрд░рдпреЛрдЧ рдХреЗрд╕рдХреЛ рд░реВрдкрдорд╛ рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдЧрд░реМрдВ - рдЙрддреНрдкрд╛рджрди рд▓реБрдкрдорд╛ Kubernetes рдХреНрд▓рд╕реНрдЯрд░рдорд╛ рд╕реНрдкрд╛рд░реНрдХ рдХрд╛рд░реНрдпрд╣рд░реВ рдирд┐рдпрдорд┐рдд рд░реВрдкрдорд╛ рдЪрд▓рд┐рд░рд╣реЗрдХреЛ рдЫред

рд╕реНрдкрд╛рд░реНрдХ рдЕрдкрд░реЗрдЯрд░ рдЦреБрд▓рд╛ рд╕реНрд░реЛрдд рд╣реЛ рд░ рдЧреБрдЧрд▓ рдХреНрд▓рд╛рдЙрдб рдкреНрд▓реЗрдЯрдлрд░реНрдо рднрд┐рддреНрд░ рд╡рд┐рдХрд╕рд┐рдд рдЧрд░рд┐рдПрдХреЛ рдЫ - 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. рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рднрдгреНрдбрд╛рд░рдмрд╛рдЯ manifests рдкреНрд░рдпреЛрдЧ рдЧрд░реНрджреИ (https://github.com/GoogleCloudPlatform/spark-on-k8s-operator/tree/master/manifest)ред рдпреЛ рдирд┐рдореНрдирд▓рд╛рдИ рдзреНрдпрд╛рди рджрд┐рди рд▓рд╛рдпрдХ рдЫ - Cloudflow рдорд╛ API рд╕рдВрд╕реНрдХрд░рдг v1beta1 рд╕рдВрдЧ рдПрдХ рдЕрдкрд░реЗрдЯрд░ рд╕рдорд╛рд╡реЗрд╢ рдЫред рдпрджрд┐ рдпрд╕ рдкреНрд░рдХрд╛рд░рдХреЛ рд╕реНрдерд╛рдкрдирд╛ рдкреНрд░рдпреЛрдЧ рдЧрд░рд┐рдиреНрдЫ рднрдиреЗ, рд╕реНрдкрд╛рд░реНрдХ рдПрдкреНрд▓рд┐рдХреЗрд╕рди рдореНрдпрд╛рдирд┐рдлреЗрд╕реНрдЯ рд╡рд┐рд╡рд░рдгрд╣рд░реВ рдЙрдкрдпреБрдХреНрдд API рд╕рдВрд╕реНрдХрд░рдгрдХреЛ рд╕рд╛рде Git рдорд╛ рдЙрджрд╛рд╣рд░рдг рдЯреНрдпрд╛рдЧрд╣рд░реВрдорд╛ рдЖрдзрд╛рд░рд┐рдд рд╣реБрдиреБрдкрд░реНрдЫ, рдЙрджрд╛рд╣рд░рдгрдХрд╛ рд▓рд╛рдЧрд┐, "v1beta1-0.9.0-2.4.0"ред рдЕрдкрд░реЗрдЯрд░рдХреЛ рд╕рдВрд╕реНрдХрд░рдг "рд╕рдВрд╕реНрдХрд░рдг" рд╢рдмреНрджрдХреЛрд╢рдорд╛ рдЕрдкрд░реЗрдЯрд░рдорд╛ рд╕рдорд╛рд╡реЗрд╢ рдЧрд░рд┐рдПрдХреЛ CRD рдХреЛ рд╡рд┐рд╡рд░рдгрдорд╛ рдлреЗрд▓рд╛ рдкрд╛рд░реНрди рд╕рдХрд┐рдиреНрдЫ:
    oc get crd sparkapplications.sparkoperator.k8s.io -o yaml
    	

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

oc get sparkapplications -n {project}

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

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

manifest рдЙрддреНрдкрдиреНрди рдЧрд░реНрдиреЗ рдПрдЙрдЯрд╛ рдЙрджрд╛рд╣рд░рдг (рдпрд╣рд╛рдБ {spark-service-account} Spark рдХрд╛рд░реНрдпрд╣рд░реВ рдЪрд▓рд╛рдЙрдирдХреЛ рд▓рд╛рдЧрд┐ Kubernetes рдХреНрд▓рд╕реНрдЯрд░ рднрд┐рддреНрд░рдХреЛ рд╕реЗрд╡рд╛ рдЦрд╛рддрд╛ рд╣реЛ):

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"

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

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

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

рддреНрдпрд╕ рдкрдЫрд┐, рд╣рд╛рдореА рд╣рд╛рдореНрд░реЛ manifest spark-pi.yaml рдлрд╛рдЗрд▓рдорд╛ рдмрдЪрдд рдЧрд░реНрдЫреМрдВ рд░ рдпрд╕рд▓рд╛рдИ рд╣рд╛рдореНрд░реЛ Kubernetes рдХреНрд▓рд╕реНрдЯрд░рдорд╛ рд▓рд╛рдЧреВ рдЧрд░реНрдЫреМрдВ:

oc apply -f spark-pi.yaml

рдпрд╕рд▓реЗ "sparkapplications" рдкреНрд░рдХрд╛рд░рдХреЛ рд╡рд╕реНрддреБ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрдиреЗрдЫ:

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

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

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

рдХрд╛рд░реНрдп рдкреВрд░рд╛ рднрдПрдкрдЫрд┐, POD "рд╕рдорд╛рдкреНрдд" рд╕реНрдерд┐рддрд┐рдорд╛ рдЬрд╛рдиреНрдЫ, рдЬреБрди "sparkapplications" рдорд╛ рдкрдирд┐ рдЕрджреНрдпрд╛рд╡рдзрд┐рдХ рд╣реБрдиреЗрдЫред рдПрдкреНрд▓рд┐рдХреЗрд╕рди рд▓рдЧрд╣рд░реВ рдмреНрд░рд╛рдЙрдЬрд░рдорд╛ рд╡рд╛ рдирд┐рдореНрди рдЖрджреЗрд╢ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рд╣реЗрд░реНрди рд╕рдХрд┐рдиреНрдЫ (рдпрд╣рд╛рдБ {sparkapplications-pod-name} рдЪрд▓рд┐рд░рд╣реЗрдХреЛ рдХрд╛рд░реНрдпрдХреЛ рдкреЛрдбрдХреЛ рдирд╛рдо рд╣реЛ):

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

рд╕реНрдкрд╛рд░реНрдХ рдХрд╛рд░реНрдпрд╣рд░реВ рдкрдирд┐ рд╡рд┐рд╢реЗрд╖ sparkctl рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫред рдпрд╕рд▓рд╛рдИ рд╕реНрдерд╛рдкрдирд╛ рдЧрд░реНрди, рдпрд╕рдХреЛ рд╕реНрд░реЛрдд рдХреЛрдбрдХреЛ рд╕рд╛рде рднрдгреНрдбрд╛рд░ рдХреНрд▓реЛрди рдЧрд░реНрдиреБрд╣реЛрд╕реН, Go рд╕реНрдерд╛рдкрдирд╛ рдЧрд░реНрдиреБрд╣реЛрд╕реН рд░ рдпреЛ рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдирд┐рд░реНрдорд╛рдг рдЧрд░реНрдиреБрд╣реЛрд╕реН:

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}

рдирд┐рд╖реНрдХрд░реНрд╖рдорд╛, рдо Kubernetes рдорд╛ рд╕реНрдкрд╛рд░реНрдХ (2.4.5) рдХреЛ рд╣рд╛рд▓рдХреЛ рд╕реНрдерд┐рд░ рд╕рдВрд╕реНрдХрд░рдг рдкреНрд░рдпреЛрдЧ рдЧрд░реНрджрд╛ рдкрддреНрддрд╛ рд▓рдЧрд╛рдПрдХрд╛ рд╣рд╛рдирд┐рд╣рд░реВ рд╡рд┐рдЪрд╛рд░ рдЧрд░реНрди рдЪрд╛рд╣рдиреНрдЫреБ:

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

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

Finред

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

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдердкреНрди