рд╕реНрдкрд╛рд░реНрдХ рд╕реНрдЯреНрд░рд┐рдорд┐рдЩрдХреЛ рд╕рд╛рде рдЕрдкрд╛рдЪреЗ рдХрд╛рдлреНрдХрд╛ рд░ рд╕реНрдЯреНрд░рд┐рдорд┐рдЩ рдбрд╛рдЯрд╛ рдкреНрд░реЛрд╕реЗрд╕рд┐рдЩ

рдирдорд╕реНрддреЗ, Habr! рдЖрдЬ рд╣рд╛рдореА рд╕реНрдкрд╛рд░реНрдХ рд╕реНрдЯреНрд░рд┐рдорд┐рдЩ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ Apache Kafka рд╕рдиреНрджреЗрд╢ рд╕реНрдЯреНрд░рд┐рдорд╣рд░реВ рдкреНрд░рд╢реЛрдзрди рдЧрд░реНрдиреЗ рдкреНрд░рдгрд╛рд▓реА рдирд┐рд░реНрдорд╛рдг рдЧрд░реНрдиреЗрдЫреМрдВ рд░ AWS RDS рдХреНрд▓рд╛рдЙрдб рдбрд╛рдЯрд╛рдмреЗрд╕рдорд╛ рдкреНрд░рд╢реЛрдзрди рдкрд░рд┐рдгрд╛рдорд╣рд░реВ рд▓реЗрдЦреНрдиреЗрдЫреМрдВред

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

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

рд╕реНрдкрд╛рд░реНрдХ рд╕реНрдЯреНрд░рд┐рдорд┐рдЩрдХреЛ рд╕рд╛рде рдЕрдкрд╛рдЪреЗ рдХрд╛рдлреНрдХрд╛ рд░ рд╕реНрдЯреНрд░рд┐рдорд┐рдЩ рдбрд╛рдЯрд╛ рдкреНрд░реЛрд╕реЗрд╕рд┐рдЩ
(рдЫрд╡рд┐ рд╕реНрд░реЛрдд)

рдкрд░рд┐рдЪрдп

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

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

рд╡рд┐рдХрд╕рд┐рдд рдкреНрд░рдгрд╛рд▓реА рдХреЛ рд╡рд╛рд╕реНрддреБрдХрд▓рд╛

рд╕реНрдкрд╛рд░реНрдХ рд╕реНрдЯреНрд░рд┐рдорд┐рдЩрдХреЛ рд╕рд╛рде рдЕрдкрд╛рдЪреЗ рдХрд╛рдлреНрдХрд╛ рд░ рд╕реНрдЯреНрд░рд┐рдорд┐рдЩ рдбрд╛рдЯрд╛ рдкреНрд░реЛрд╕реЗрд╕рд┐рдЩ

рдкреНрд░рдпреЛрдЧ рдЧрд░рд┐рдПрдХрд╛ рдЕрд╡рдпрд╡рд╣рд░реВ:

  • рдЕрдкрд╛рдЪреЗ рдХрд╛рдлреНрдХрд╛ рдПрдХ рд╡рд┐рддрд░рд┐рдд рдкреНрд░рдХрд╛рд╢рди-рд╕рджрд╕реНрдпрддрд╛ рд╕рдиреНрджреЗрд╢ рдкреНрд░рдгрд╛рд▓реА рд╣реЛред рдЕрдлрд▓рд╛рдЗрди рд░ рдЕрдирд▓рд╛рдЗрди рд╕рдиреНрджреЗрд╢ рдЦрдкрдд рджреБрд╡реИ рд▓рд╛рдЧрд┐ рдЙрдкрдпреБрдХреНрддред рдбрд╛рдЯрд╛ рд╣рд╛рдирд┐ рд░реЛрдХреНрдирдХреЛ рд▓рд╛рдЧрд┐, рдХрд╛рдлреНрдХрд╛ рд╕рдиреНрджреЗрд╢рд╣рд░реВ рдбрд┐рд╕реНрдХрдорд╛ рднрдгреНрдбрд╛рд░рдг рдЧрд░рд┐рдиреНрдЫ рд░ рдХреНрд▓рд╕реНрдЯрд░ рднрд┐рддреНрд░ рдкреНрд░рддрд┐рдХреГрддрд┐ рдЧрд░рд┐рдиреНрдЫред рдХрд╛рдлреНрдХрд╛ рдкреНрд░рдгрд╛рд▓реА ZooKeeper рд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЬреЗрд╕рди рд╕реЗрд╡рд╛рдХреЛ рд╢реАрд░реНрд╖рдорд╛ рдмрдирд╛рдЗрдПрдХреЛ рдЫ;
  • рдЕрдкрд╛рдЪреЗ рд╕реНрдкрд╛рд░реНрдХ рд╕реНрдЯреНрд░рд┐рдорд┐рдЩ - рд╕реНрдЯреНрд░рд┐рдорд┐рдЩ рдбрд╛рдЯрд╛ рдкреНрд░рд╢реЛрдзрдирдХрд╛ рд▓рд╛рдЧрд┐ рд╕реНрдкрд╛рд░реНрдХ рдШрдЯрдХред рд╕реНрдкрд╛рд░реНрдХ рд╕реНрдЯреНрд░рд┐рдорд┐рдЩ рдореЛрдбреНрдпреБрд▓рд▓рд╛рдИ рдорд╛рдЗрдХреНрд░реЛ-рдмреНрдпрд╛рдЪ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рдмрдирд╛рдЗрдПрдХреЛ рдЫ, рдЬрд╣рд╛рдБ рдбрд╛рдЯрд╛ рд╕реНрдЯреНрд░рд┐рдорд▓рд╛рдИ рд╕рд╛рдирд╛ рдбрд╛рдЯрд╛ рдкреНрдпрд╛рдХреЗрдЯрд╣рд░реВрдХреЛ рдирд┐рд░рдиреНрддрд░ рдЕрдиреБрдХреНрд░рдордХреЛ рд░реВрдкрдорд╛ рд╡реНрдпрд╛рдЦреНрдпрд╛ рдЧрд░рд┐рдиреНрдЫред рд╕реНрдкрд╛рд░реНрдХ рд╕реНрдЯреНрд░рд┐рдорд┐рдЩрд▓реЗ рд╡рд┐рднрд┐рдиреНрди рд╕реНрд░реЛрддрд╣рд░реВрдмрд╛рдЯ рдбрд╛рдЯрд╛ рд▓рд┐рдиреНрдЫ рд░ рдпрд╕рд▓рд╛рдИ рд╕рд╛рдирд╛ рдкреНрдпрд╛рдХреЗрдЬрд╣рд░реВрдорд╛ рдорд┐рд▓рд╛рдЙрдБрдЫред рдирдпрд╛рдБ рдкреНрдпрд╛рдХреЗрдЬрд╣рд░реВ рдирд┐рдпрдорд┐рдд рдЕрдиреНрддрд░рд╛рд▓рд╣рд░реВрдорд╛ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░рд┐рдиреНрдЫрдиреНред рдкреНрд░рддреНрдпреЗрдХ рд╕рдордп рдЕрдиреНрддрд░рд╛рд▓рдХреЛ рд╕реБрд░реБрдорд╛, рдирдпрд╛рдБ рдкреНрдпрд╛рдХреЗрдЯ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░рд┐рдиреНрдЫ, рд░ рддреНрдпреЛ рдЕрдиреНрддрд░рд╛рд▓рдорд╛ рдкреНрд░рд╛рдкреНрдд рднрдПрдХреЛ рдХреБрдиреИ рдкрдирд┐ рдбрд╛рдЯрд╛ рдкреНрдпрд╛рдХреЗрдЯрдорд╛ рд╕рдорд╛рд╡реЗрд╢ рдЧрд░рд┐рдиреНрдЫред рдЕрдиреНрддрд░рд╛рд▓рдХреЛ рдЕрдиреНрддреНрдпрдорд╛, рдкреНрдпрд╛рдХреЗрдЯ рд╡реГрджреНрдзрд┐ рд░реЛрдХрд┐рдиреНрдЫред рдЕрдиреНрддрд░рд╛рд▓рдХреЛ рдЖрдХрд╛рд░ рдмреНрдпрд╛рдЪ рдЕрдиреНрддрд░рд╛рд▓ рднрдирд┐рдиреЗ рдкреНрдпрд╛рд░рд╛рдорд┐рдЯрд░ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рдг рдЧрд░рд┐рдиреНрдЫ;
  • Apache Spark SQL - рд╕реНрдкрд╛рд░реНрдХ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рд╕рдВрдЧ рд░рд┐рд▓реЗрд╢рдирд▓ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдХреЛ рд╕рдВрдпреЛрдЬрди рдЧрд░реНрджрдЫред рд╕рдВрд░рдЪрд┐рдд рдбреЗрдЯрд╛ рднрдиреЗрдХреЛ рд╕реНрдХрд┐рдорд╛ рднрдПрдХреЛ рдбреЗрдЯрд╛ рд╣реЛ, рддреНрдпреЛ рд╣реЛ, рд╕рдмреИ рд░реЗрдХрд░реНрдбрд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рдлрд┐рд▓реНрдбрд╣рд░реВрдХреЛ рдПрдХрд▓ рд╕реЗрдЯред Spark SQL рд▓реЗ рд╡рд┐рднрд┐рдиреНрди рд╕рдВрд░рдЪрд┐рдд рдбреЗрдЯрд╛ рд╕реНрд░реЛрддрд╣рд░реВрдмрд╛рдЯ рдЗрдирдкреБрдЯрд▓рд╛рдИ рд╕рдорд░реНрдерди рдЧрд░реНрджрдЫ рд░, рд╕реНрдХрд┐рдорд╛ рдЬрд╛рдирдХрд╛рд░реАрдХреЛ рдЙрдкрд▓рдмреНрдзрддрд╛рдХреЛ рд▓рд╛рдЧрд┐ рдзрдиреНрдпрд╡рд╛рдж, рдпрд╕рд▓реЗ рдХреБрд╢рд▓рддрд╛рдкреВрд░реНрд╡рдХ рд░реЗрдХрд░реНрдбрд╣рд░реВрдХреЛ рдЖрд╡рд╢реНрдпрдХ рдХреНрд╖реЗрддреНрд░рд╣рд░реВ рдорд╛рддреНрд░ рдкреБрди: рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрди рд╕рдХреНрдЫ, рд░ DataFrame API рд╣рд░реВ рдкрдирд┐ рдкреНрд░рджрд╛рди рдЧрд░реНрджрдЫ;
  • AWS RDS рдПрдХ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рд╕рд╕реНрддреЛ рдХреНрд▓рд╛рдЙрдб-рдЖрдзрд╛рд░рд┐рдд рд░рд┐рд▓реЗрд╕рдирд▓ рдбрд╛рдЯрд╛рдмреЗрд╕ рд╣реЛ, рд╡реЗрдм рд╕реЗрд╡рд╛ рдЬрд╕рд▓реЗ рд╕реЗрдЯрдЕрдк, рд╕рдЮреНрдЪрд╛рд▓рди рд░ рд╕реНрдХреЗрд▓рд┐рдВрдЧрд▓рд╛рдИ рд╕рд░рд▓ рдмрдирд╛рдЙрдБрдЫ, рд░ рд╕реАрдзрд╛ Amazon рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╢рд╛рд╕рд┐рдд рд╣реБрдиреНрдЫред

рдХрд╛рдлреНрдХрд╛ рд╕рд░реНрднрд░ рд╕реНрдерд╛рдкрдирд╛ рд░ рдЪрд▓рд╛рдЙрдБрджреИ

рдХрд╛рдлреНрдХрд╛ рд╕рд┐рдзреИ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреБ рдЕрдШрд┐, рддрдкрд╛рдЗрдБрд╕рдБрдЧ рдЬрд╛рднрд╛ рдЫ рднрдиреЗрд░ рдирд┐рд╢реНрдЪрд┐рдд рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫ, рдХрд┐рдирдХрд┐... JVM рдХрд╛рдордХреЛ рд▓рд╛рдЧрд┐ рдкреНрд░рдпреЛрдЧ рдЧрд░рд┐рдиреНрдЫ:

sudo apt-get update 
sudo apt-get install default-jre
java -version

рдХрд╛рдлреНрдХрд╛рд╕рдБрдЧ рдХрд╛рдо рдЧрд░реНрди рдирдпрд╛рдБ рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реМрдВ:

sudo useradd kafka -m
sudo passwd kafka
sudo adduser kafka sudo

рдЕрд░реНрдХреЛ, рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдЕрдкрд╛рдЪреЗ рдХрд╛рдлреНрдХрд╛ рд╡реЗрдмрд╕рд╛рдЗрдЯрдмрд╛рдЯ рд╡рд┐рддрд░рдг рдбрд╛рдЙрдирд▓реЛрдб рдЧрд░реНрдиреБрд╣реЛрд╕реН:

wget -P /YOUR_PATH "http://apache-mirror.rbc.ru/pub/apache/kafka/2.2.0/kafka_2.12-2.2.0.tgz"

рдбрд╛рдЙрдирд▓реЛрдб рдЧрд░рд┐рдПрдХреЛ рдЕрднрд┐рд▓реЗрдЦ рдЕрдирдкреНрдпрд╛рдХ рдЧрд░реНрдиреБрд╣реЛрд╕реН:

tar -xvzf /YOUR_PATH/kafka_2.12-2.2.0.tgz
ln -s /YOUR_PATH/kafka_2.12-2.2.0 kafka

рдЕрд░реНрдХреЛ рдЪрд░рдг рд╡реИрдХрд▓реНрдкрд┐рдХ рдЫред рддрдереНрдп рдпреЛ рд╣реЛ рдХрд┐ рдкреВрд░реНрд╡рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд╕реЗрдЯрд┐рдЩрд╣рд░реВрд▓реЗ рддрдкрд╛рдИрдВрд▓рд╛рдИ Apache Kafka рдХреЛ рд╕рдмреИ рдХреНрд╖рдорддрд╛рд╣рд░реВ рдкреВрд░реНрдг рд░реВрдкрдорд╛ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрди рдЕрдиреБрдорддрд┐ рджрд┐рдБрджреИрдиред рдЙрджрд╛рд╣рд░рдгрдХрд╛ рд▓рд╛рдЧрд┐, рд╕рдиреНрджреЗрд╢рд╣рд░реВ рдкреНрд░рдХрд╛рд╢рд┐рдд рдЧрд░реНрди рд╕рдХрд┐рдиреЗ рд╡рд┐рд╖рдп, рдХреЛрдЯреА, рд╕рдореВрд╣ рдореЗрдЯрд╛рдЙрдиреБрд╣реЛрд╕реНред рдпрд╕рд▓рд╛рдИ рдкрд░рд┐рд╡рд░реНрддрди рдЧрд░реНрди, рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рди рдлрд╛рдЗрд▓ рд╕рдореНрдкрд╛рджрди рдЧрд░реМрдВ:

vim ~/kafka/config/server.properties

рдлрд╛рдЗрд▓рдХреЛ рдЕрдиреНрддреНрдпрдорд╛ рдирд┐рдореНрди рдердкреНрдиреБрд╣реЛрд╕реН:

delete.topic.enable = true

рдХрд╛рдлреНрдХрд╛ рд╕рд░реНрднрд░ рд╕реБрд░реБ рдЧрд░реНрдиреБ рдЕрдШрд┐, рддрдкрд╛рдИрдВрд▓реЗ ZooKeeper рд╕рд░реНрднрд░ рд╕реБрд░реБ рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫ; рд╣рд╛рдореА рдХрд╛рдлреНрдХрд╛ рд╡рд┐рддрд░рдгрдХреЛ рд╕рд╛рде рдЖрдЙрдиреЗ рд╕рд╣рд╛рдпрдХ рд▓рд┐рдкрд┐ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреЗрдЫреМрдВ:

Cd ~/kafka
bin/zookeeper-server-start.sh config/zookeeper.properties

ZooKeeper рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рд╕реБрд░реБ рднрдПрдкрдЫрд┐, рдХрд╛рдлреНрдХрд╛ рд╕рд░реНрднрд░рд▓рд╛рдИ рдЫреБрдЯреНрдЯреИ рдЯрд░реНрдорд┐рдирд▓рдорд╛ рд╕реБрд░реБ рдЧрд░реНрдиреБрд╣реЛрд╕реН:

bin/kafka-server-start.sh config/server.properties

рд▓реЗрдирджреЗрди рдирд╛рдордХ рдирдпрд╛рдБ рд╡рд┐рд╖рдп рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реМрдВ:

bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 3 --topic transaction

рдирд┐рд╢реНрдЪрд┐рдд рдЧрд░реНрдиреБрд╣реЛрд╕реН рдХрд┐ рд╡рд┐рднрд╛рдЬрди рд░ рдкреНрд░рддрд┐рдХреГрддрд┐рдХреЛ рдЖрд╡рд╢реНрдпрдХ рд╕рдВрдЦреНрдпрд╛рдХреЛ рд╕рд╛рде рдПрдХ рд╡рд┐рд╖рдп рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░рд┐рдПрдХреЛ рдЫ:

bin/kafka-topics.sh --describe --zookeeper localhost:2181

рд╕реНрдкрд╛рд░реНрдХ рд╕реНрдЯреНрд░рд┐рдорд┐рдЩрдХреЛ рд╕рд╛рде рдЕрдкрд╛рдЪреЗ рдХрд╛рдлреНрдХрд╛ рд░ рд╕реНрдЯреНрд░рд┐рдорд┐рдЩ рдбрд╛рдЯрд╛ рдкреНрд░реЛрд╕реЗрд╕рд┐рдЩ

рдирдпрд╛рдБ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░рд┐рдПрдХреЛ рд╡рд┐рд╖рдпрдХреЛ рд▓рд╛рдЧрд┐ рдирд┐рд░реНрдорд╛рддрд╛ рд░ рдЙрдкрднреЛрдХреНрддрд╛ рдкрд░реАрдХреНрд╖рдгрдХреЛ рдХреНрд╖рдгрд╣рд░реВ рд╕рдореНрдЭреМрдВред рддрдкрд╛рдИрдВ рдХрд╕рд░реА рд╕рдиреНрджреЗрд╢рд╣рд░реВ рдкрдард╛рдЙрди рд░ рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрдиреЗ рдкрд░реАрдХреНрд╖рдг рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ рднрдиреНрдиреЗ рдмрд╛рд░реЗ рдердк рд╡рд┐рд╡рд░рдгрд╣рд░реВ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдХрд╛рдЧрдЬрд╛рддрд╣рд░реВрдорд╛ рд▓реЗрдЦрд┐рдПрдХрд╛ рдЫрдиреН - рдХреЗрд╣реА рд╕рдиреНрджреЗрд╢ рдкрдард╛рдЙрдиреБрд╣реЛрд╕реНред рдЦреИрд░, рд╣рд╛рдореА KafkaProducer API рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рдкрд╛рдЗрдердирдорд╛ рдирд┐рд░реНрдорд╛рддрд╛ рд▓реЗрдЦреНрди рдЕрдЧрд╛рдбрд┐ рдмрдвреНрдЫреМрдВред

рдирд┐рд░реНрдорд╛рддрд╛ рд▓реЗрдЦрди

рдирд┐рд░реНрдорд╛рддрд╛рд▓реЗ рдЕрдирд┐рдпрдорд┐рдд рдбрд╛рдЯрд╛ рдЙрддреНрдкрдиреНрди рдЧрд░реНрдиреЗрдЫ - 100 рд╕рдиреНрджреЗрд╢рд╣рд░реВ рдкреНрд░рддреНрдпреЗрдХ рд╕реЗрдХреЗрдиреНрдбрдорд╛ред рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдбреЗрдЯрд╛ рджреНрд╡рд╛рд░рд╛ рд╣рд╛рдореАрд▓реЗ рддреАрди рдХреНрд╖реЗрддреНрд░рд╣рд░реВ рдорд┐рд▓реЗрд░ рдмрдиреЗрдХреЛ рд╢рдмреНрджрдХреЛрд╢рд▓рд╛рдИ рдмреБрдЭрд╛рдЙрдБрдЫреМрдВ:

  • рд╕рд╛рдЦрд╛ - рдХреНрд░реЗрдбрд┐рдЯ рд╕рдВрд╕реНрдерд╛рдХреЛ рдмрд┐рдХреНрд░реА рдмрд┐рдиреНрджреБрдХреЛ рдирд╛рдо;
  • рдореБрджреНрд░рд╛ - рд▓реЗрдирджреЗрди рдореБрджреНрд░рд╛;
  • рд░рдХрдо - рд▓реЗрдирджреЗрди рд░рдХрдоред рдмреИрдВрдХ рджреНрд╡рд╛рд░рд╛ рдореБрджреНрд░рд╛ рдЦрд░рд┐рдж рдЧрд░реНрджрд╛ рд░рдХрдо рдзрдирд╛рддреНрдордХ рд╕рдВрдЦреНрдпрд╛ рд╣реБрдиреЗрдЫ, рд░ рдпрджрд┐ рдпреЛ рдПрдХ рдмрд┐рдХреНрд░реА рд╣реЛ рднрдиреЗ рдЛрдгрд╛рддреНрдордХ рд╕рдВрдЦреНрдпрд╛ рд╣реБрдиреЗрдЫред

рдирд┐рд░реНрдорд╛рддрд╛рдХреЛ рд▓рд╛рдЧрд┐ рдХреЛрдб рдпрд╕реНрддреЛ рджреЗрдЦрд┐рдиреНрдЫ:

from numpy.random import choice, randint

def get_random_value():
    new_dict = {}

    branch_list = ['Kazan', 'SPB', 'Novosibirsk', 'Surgut']
    currency_list = ['RUB', 'USD', 'EUR', 'GBP']

    new_dict['branch'] = choice(branch_list)
    new_dict['currency'] = choice(currency_list)
    new_dict['amount'] = randint(-100, 100)

    return new_dict

рдЕрд░реНрдХреЛ, рдкрдард╛рдЙрдиреЗ рд╡рд┐рдзрд┐ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░, рд╣рд╛рдореА JSON рдврд╛рдБрдЪрд╛рдорд╛ рд╣рд╛рдореАрд▓рд╛рдИ рдЖрд╡рд╢реНрдпрдХ рд╡рд┐рд╖рдпрдХреЛ рд▓рд╛рдЧрд┐ рд╕рд░реНрднрд░рдорд╛ рд╕рдиреНрджреЗрд╢ рдкрдард╛рдЙрдБрдЫреМрдВ:

from kafka import KafkaProducer    

producer = KafkaProducer(bootstrap_servers=['localhost:9092'],
                             value_serializer=lambda x:dumps(x).encode('utf-8'),
                             compression_type='gzip')
my_topic = 'transaction'
data = get_random_value()

try:
    future = producer.send(topic = my_topic, value = data)
    record_metadata = future.get(timeout=10)
    
    print('--> The message has been sent to a topic: 
            {}, partition: {}, offset: {}' 
            .format(record_metadata.topic,
                record_metadata.partition,
                record_metadata.offset ))   
                             
except Exception as e:
    print('--> It seems an Error occurred: {}'.format(e))

finally:
    producer.flush()

рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЪрд▓рд╛рдЙрдБрджрд╛, рд╣рд╛рдореАрд▓реЗ рдЯрд░реНрдорд┐рдирд▓рдорд╛ рдирд┐рдореНрди рд╕рдиреНрджреЗрд╢рд╣рд░реВ рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрдЫреМрдВ:

рд╕реНрдкрд╛рд░реНрдХ рд╕реНрдЯреНрд░рд┐рдорд┐рдЩрдХреЛ рд╕рд╛рде рдЕрдкрд╛рдЪреЗ рдХрд╛рдлреНрдХрд╛ рд░ рд╕реНрдЯреНрд░рд┐рдорд┐рдЩ рдбрд╛рдЯрд╛ рдкреНрд░реЛрд╕реЗрд╕рд┐рдЩ

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

Apache Spark рд╕реНрдерд╛рдкрдирд╛ рдЧрд░реНрджреИ

рдЕрдкрд╛рдЪреЗ рд╕реНрдкрд╛рд░реНрдХ рдПрдХ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рд░ рдЙрдЪреНрдЪ рдкреНрд░рджрд░реНрд╢рди рдХреНрд▓рд╕реНрдЯрд░ рдХрдореНрдкреНрдпреБрдЯрд┐рдЩ рдкреНрд▓реЗрдЯрдлрд░реНрдо рд╣реЛред

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

рдпреЛ рдлреНрд░реЗрдорд╡рд░реНрдХ Scala рдорд╛ рд▓реЗрдЦрд┐рдПрдХреЛ рдЫ, рддреНрдпрд╕реИрд▓реЗ рддрдкрд╛рдИрдВрд▓реЗ рдпрд╕рд▓рд╛рдИ рдкрд╣рд┐рд▓реЗ рд╕реНрдерд╛рдкрдирд╛ рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫ:

sudo apt-get install scala

рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рд╡реЗрдмрд╕рд╛рдЗрдЯрдмрд╛рдЯ рд╕реНрдкрд╛рд░реНрдХ рд╡рд┐рддрд░рдг рдбрд╛рдЙрдирд▓реЛрдб рдЧрд░реНрдиреБрд╣реЛрд╕реН:

wget "http://mirror.linux-ia64.org/apache/spark/spark-2.4.2/spark-2.4.2-bin-hadoop2.7.tgz"

рдЕрднрд┐рд▓реЗрдЦ рдЕрдирдкреНрдпрд╛рдХ рдЧрд░реНрдиреБрд╣реЛрд╕реН:

sudo tar xvf spark-2.4.2/spark-2.4.2-bin-hadoop2.7.tgz -C /usr/local/spark

рдмреНрдпрд╛рд╕ рдлрд╛рдЗрд▓рдорд╛ рд╕реНрдкрд╛рд░реНрдХрдХреЛ рдорд╛рд░реНрдЧ рдердкреНрдиреБрд╣реЛрд╕реН:

vim ~/.bashrc

рд╕рдореНрдкрд╛рджрдХ рдорд╛рд░реНрдлрдд рдирд┐рдореНрди рд▓рд╛рдЗрдирд╣рд░реВ рдердкреНрдиреБрд╣реЛрд╕реН:

SPARK_HOME=/usr/local/spark
export PATH=$SPARK_HOME/bin:$PATH

bashrc рдорд╛ рдкрд░рд┐рд╡рд░реНрддрди рдЧрд░реЗрдкрдЫрд┐ рддрд▓рдХреЛ рдЖрджреЗрд╢ рдЪрд▓рд╛рдЙрдиреБрд╣реЛрд╕реН:

source ~/.bashrc

AWS PostgreSQL рддреИрдирд╛рдд рдЧрд░реНрджреИ

рд╣рд╛рдореАрд▓реЗ рд╕реНрдЯреНрд░рд┐рдорд╣рд░реВрдмрд╛рдЯ рдкреНрд░рд╢реЛрдзрд┐рдд рдЬрд╛рдирдХрд╛рд░реА рдЕрдкрд▓реЛрдб рдЧрд░реНрдиреЗ рдбрд╛рдЯрд╛рдмреЗрд╕ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрди рдмрд╛рдБрдХреА рдЫред рдпрд╕рдХрд╛ рд▓рд╛рдЧрд┐ рд╣рд╛рдореА AWS RDS рд╕реЗрд╡рд╛ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреЗрдЫреМрдВред

AWS рдХрдиреНрд╕реЛрд▓рдорд╛ рдЬрд╛рдиреБрд╣реЛрд╕реН -> AWS RDS -> рдбрд╛рдЯрд╛рдмреЗрд╕ -> рдбрд╛рдЯрд╛рдмреЗрд╕ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрдиреБрд╣реЛрд╕реН:
рд╕реНрдкрд╛рд░реНрдХ рд╕реНрдЯреНрд░рд┐рдорд┐рдЩрдХреЛ рд╕рд╛рде рдЕрдкрд╛рдЪреЗ рдХрд╛рдлреНрдХрд╛ рд░ рд╕реНрдЯреНрд░рд┐рдорд┐рдЩ рдбрд╛рдЯрд╛ рдкреНрд░реЛрд╕реЗрд╕рд┐рдЩ

PostgreSQL рдЪрдпрди рдЧрд░реНрдиреБрд╣реЛрд╕реН рд░ рдЕрд░реНрдХреЛ рдХреНрд▓рд┐рдХ рдЧрд░реНрдиреБрд╣реЛрд╕реН:
рд╕реНрдкрд╛рд░реНрдХ рд╕реНрдЯреНрд░рд┐рдорд┐рдЩрдХреЛ рд╕рд╛рде рдЕрдкрд╛рдЪреЗ рдХрд╛рдлреНрдХрд╛ рд░ рд╕реНрдЯреНрд░рд┐рдорд┐рдЩ рдбрд╛рдЯрд╛ рдкреНрд░реЛрд╕реЗрд╕рд┐рдЩ

рдХрд┐рдирднрдиреЗ рдпреЛ рдЙрджрд╛рд╣рд░рдг рд╢реИрдХреНрд╖рд┐рдХ рдЙрджреНрджреЗрд╢реНрдпрдХрд╛ рд▓рд╛рдЧрд┐ рдорд╛рддреНрд░ рд╣реЛ; рд╣рд╛рдореА "рдиреНрдпреВрдирддрдо" (рдирд┐: рд╢реБрд▓реНрдХ рдЯрд┐рдпрд░) рдирд┐: рд╢реБрд▓реНрдХ рд╕рд░реНрднрд░ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреЗрдЫреМрдВ:
рд╕реНрдкрд╛рд░реНрдХ рд╕реНрдЯреНрд░рд┐рдорд┐рдЩрдХреЛ рд╕рд╛рде рдЕрдкрд╛рдЪреЗ рдХрд╛рдлреНрдХрд╛ рд░ рд╕реНрдЯреНрд░рд┐рдорд┐рдЩ рдбрд╛рдЯрд╛ рдкреНрд░реЛрд╕реЗрд╕рд┐рдЩ

рдЕрд░реНрдХреЛ, рд╣рд╛рдореАрд▓реЗ рдлреНрд░рд┐ рдЯрд┐рдпрд░ рдмреНрд▓рдХрдорд╛ рдЯрд┐рдХ рд░рд╛рдЦреНрдЫреМрдВ, рд░ рддреНрдпрд╕ рдкрдЫрд┐ рд╣рд╛рдореАрд▓рд╛рдИ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдкрдорд╛ t2.micro рд╡рд░реНрдЧрдХреЛ рдЙрджрд╛рд╣рд░рдг рдкреНрд░рд╕реНрддрд╛рд╡ рдЧрд░рд┐рдиреЗрдЫ - рдХрдордЬреЛрд░ рднрдП рдкрдирд┐, рдпреЛ рдирд┐: рд╢реБрд▓реНрдХ рдЫ рд░ рд╣рд╛рдореНрд░реЛ рдХрд╛рд░реНрдпрдХреЛ рд▓рд╛рдЧрд┐ рдПрдХрджрдо рдЙрдкрдпреБрдХреНрдд рдЫ:
рд╕реНрдкрд╛рд░реНрдХ рд╕реНрдЯреНрд░рд┐рдорд┐рдЩрдХреЛ рд╕рд╛рде рдЕрдкрд╛рдЪреЗ рдХрд╛рдлреНрдХрд╛ рд░ рд╕реНрдЯреНрд░рд┐рдорд┐рдЩ рдбрд╛рдЯрд╛ рдкреНрд░реЛрд╕реЗрд╕рд┐рдЩ

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

рдЕрд░реНрдХреЛ рдкреГрд╖реНрдардорд╛ рдмрд╛рд╣рд┐рд░рдмрд╛рдЯ рд╣рд╛рдореНрд░реЛ рдбрд╛рдЯрд╛рдмреЗрд╕ рд╕рд░реНрднрд░рдХреЛ рдкрд╣реБрдБрдЪ (рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдкрд╣реБрдБрдЪ) рд░ рдкреЛрд░реНрдЯ рдЙрдкрд▓рдмреНрдзрддрд╛рдХреЛ рд▓рд╛рдЧрд┐ рдЬрд┐рдореНрдореЗрд╡рд╛рд░ рдкреНрдпрд╛рд░рд╛рдорд┐рдЯрд░рд╣рд░реВ рдЫрдиреН:

рд╕реНрдкрд╛рд░реНрдХ рд╕реНрдЯреНрд░рд┐рдорд┐рдЩрдХреЛ рд╕рд╛рде рдЕрдкрд╛рдЪреЗ рдХрд╛рдлреНрдХрд╛ рд░ рд╕реНрдЯреНрд░рд┐рдорд┐рдЩ рдбрд╛рдЯрд╛ рдкреНрд░реЛрд╕реЗрд╕рд┐рдЩ

VPC рд╕реБрд░рдХреНрд╖рд╛ рд╕рдореВрд╣рдХреЛ рд▓рд╛рдЧрд┐ рдирдпрд╛рдБ рд╕реЗрдЯрд┐рдЩ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реМрдВ, рдЬрд╕рд▓реЗ рдкреЛрд░реНрдЯ релрекрейреи (PostgreSQL) рдорд╛рд░реНрдлрдд рд╣рд╛рдореНрд░реЛ рдбрд╛рдЯрд╛рдмреЗрд╕ рд╕рд░реНрднрд░рдорд╛ рдмрд╛рд╣реНрдп рдкрд╣реБрдБрдЪрд▓рд╛рдИ рдЕрдиреБрдорддрд┐ рджрд┐рдиреЗрдЫред
AWS рдХрдиреНрд╕реЛрд▓рдорд╛ рдЫреБрдЯреНрдЯреИ рдмреНрд░рд╛рдЙрдЬрд░ рд╡рд┐рдиреНрдбреЛрдорд╛ VPC рдбреНрдпрд╛рд╕рдмреЛрд░реНрдбрдорд╛ рдЬрд╛рдФрдВ -> рд╕реБрд░рдХреНрд╖рд╛ рд╕рдореВрд╣рд╣рд░реВ -> рд╕реБрд░рдХреНрд╖рд╛ рд╕рдореВрд╣ рдЦрдгреНрдб рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрдиреБрд╣реЛрд╕реН:
рд╕реНрдкрд╛рд░реНрдХ рд╕реНрдЯреНрд░рд┐рдорд┐рдЩрдХреЛ рд╕рд╛рде рдЕрдкрд╛рдЪреЗ рдХрд╛рдлреНрдХрд╛ рд░ рд╕реНрдЯреНрд░рд┐рдорд┐рдЩ рдбрд╛рдЯрд╛ рдкреНрд░реЛрд╕реЗрд╕рд┐рдЩ

рд╣рд╛рдореАрд▓реЗ рд╕реБрд░рдХреНрд╖рд╛ рд╕рдореВрд╣рдХреЛ рд▓рд╛рдЧрд┐ рдирд╛рдо рд╕реЗрдЯ рдЧрд░реНтАНрдпреМрдВ - PostgreSQL, рдПрдЙрдЯрд╛ рд╡рд┐рд╡рд░рдг, рдпреЛ рд╕рдореВрд╣ рдХреБрди VPC рд╕рдБрдЧ рд╕рдореНрдмрдиреНрдзрд┐рдд рд╣реБрдиреБрдкрд░реНрдЫ рд░ рд╕рд┐рд░реНрдЬрдирд╛ рдмрдЯрдирдорд╛ рдХреНрд▓рд┐рдХ рдЧрд░реНрдиреБрд╣реЛрд╕реН:
рд╕реНрдкрд╛рд░реНрдХ рд╕реНрдЯреНрд░рд┐рдорд┐рдЩрдХреЛ рд╕рд╛рде рдЕрдкрд╛рдЪреЗ рдХрд╛рдлреНрдХрд╛ рд░ рд╕реНрдЯреНрд░рд┐рдорд┐рдЩ рдбрд╛рдЯрд╛ рдкреНрд░реЛрд╕реЗрд╕рд┐рдЩ

рдирдпрд╛рдБ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░рд┐рдПрдХреЛ рд╕рдореВрд╣рдХреЛ рд▓рд╛рдЧрд┐ рдкреЛрд░реНрдЯ 5432 рдХреЛ рд▓рд╛рдЧрд┐ рдЗрдирдмрд╛рдЙрдиреНрдб рдирд┐рдпрдорд╣рд░реВ рднрд░реНрдиреБрд╣реЛрд╕реН, рдЬрд╕реНрддреИ рддрд▓рдХреЛ рдЪрд┐рддреНрд░рдорд╛ рджреЗрдЦрд╛рдЗрдПрдХреЛ рдЫред рддрдкрд╛рдИрдВрд▓реЗ рдкреЛрд░реНрдЯ рдореНрдпрд╛рдиреБрдЕрд▓ рд░реВрдкрдорд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрди, рддрд░ рдкреНрд░рдХрд╛рд░ рдбреНрд░рдк-рдбрд╛рдЙрди рд╕реВрдЪреАрдмрд╛рдЯ PostgreSQL рдЪрдпрди рдЧрд░реНрдиреБрд╣реЛрд╕реНред

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

рд╣рд╛рдореА рдмреНрд░рд╛рдЙрдЬрд░ рдкреГрд╖реНрдардорд╛ рдлрд░реНрдХрдиреНрдЫреМрдВ, рдЬрд╣рд╛рдБ рд╣рд╛рдореАрд╕рдБрдЧ "рдЙрдиреНрдирдд рд╕реЗрдЯрд┐рдЩрд╣рд░реВ рдХрдиреНрдлрд┐рдЧрд░ рдЧрд░реНрдиреБрд╣реЛрд╕реН" рдЦреБрд▓рд╛ рдЫ рд░ VPC рд╕реБрд░рдХреНрд╖рд╛ рд╕рдореВрд╣ рдЦрдгреНрдбрдорд╛ рдЪрдпрди рдЧрд░реНрдиреБрд╣реЛрд╕реН -> рдЕрд╡рд╕реНрдерд┐рдд VPC рд╕реБрд░рдХреНрд╖рд╛ рд╕рдореВрд╣рд╣рд░реВ рдЫрдиреМрдЯ рдЧрд░реНрдиреБрд╣реЛрд╕реН -> PostgreSQL:
рд╕реНрдкрд╛рд░реНрдХ рд╕реНрдЯреНрд░рд┐рдорд┐рдЩрдХреЛ рд╕рд╛рде рдЕрдкрд╛рдЪреЗ рдХрд╛рдлреНрдХрд╛ рд░ рд╕реНрдЯреНрд░рд┐рдорд┐рдЩ рдбрд╛рдЯрд╛ рдкреНрд░реЛрд╕реЗрд╕рд┐рдЩ

рдЕрд░реНрдХреЛ, рдбрд╛рдЯрд╛рдмреЗрд╕ рд╡рд┐рдХрд▓реНрдкрд╣рд░реВрдорд╛ -> рдбрд╛рдЯрд╛рдмреЗрд╕ рдирд╛рдо -> рдирд╛рдо рд╕реЗрдЯ рдЧрд░реНрдиреБрд╣реЛрд╕реН - habrDB.

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

рдереНрд░реЗрдб рд╣реНрдпрд╛рдиреНрдбрд▓рд░

рдЕрдиреНрддрд┐рдо рдЪрд░рдг рд╕реНрдкрд╛рд░реНрдХ рдХрд╛рд░реНрдпрдХреЛ рд╡рд┐рдХрд╛рд╕ рд╣реБрдиреЗрдЫ, рдЬрд╕рд▓реЗ рдкреНрд░рддреНрдпреЗрдХ рджреБрдИ рд╕реЗрдХреЗрдиреНрдбрдорд╛ рдХрд╛рдлреНрдХрд╛рдмрд╛рдЯ рдЖрдЙрдиреЗ рдирдпрд╛рдБ рдбрд╛рдЯрд╛рд▓рд╛рдИ рдкреНрд░рд╢реЛрдзрди рдЧрд░реНрдиреЗрдЫ рд░ рдкрд░рд┐рдгрд╛рдо рдбрд╛рдЯрд╛рдмреЗрд╕рдорд╛ рдкреНрд░рд╡рд┐рд╖реНрдЯ рдЧрд░реНрдиреЗрдЫред

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

рдЪреЗрдХрдкреЛрдЗрдиреНрдЯрд┐рдЩрд▓рд╛рдИ рджреЛрд╖-рд╕рд╣рд┐рд╖реНрдгреБ, рднрд░рдкрд░реНрджреЛ рдлрд╛рдЗрд▓ рдкреНрд░рдгрд╛рд▓реА (рдЬрд╕реНрддреИ HDFS, S3, рдЖрджрд┐) рдорд╛ рдбрд╛рдЗрд░реЗрдХреНрдЯрд░реА рд╕реЗрдЯ рдЧрд░реЗрд░ рд╕рдХреНрд╖рдо рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫ рдЬрд╕рдорд╛ рдЪреЗрдХрдкреЛрдЗрдиреНрдЯ рдЬрд╛рдирдХрд╛рд░реА рднрдгреНрдбрд╛рд░рдг рдЧрд░рд┐рдиреЗрдЫред рдпреЛ рдкреНрд░рдпреЛрдЧ рдЧрд░реА рдЧрд░рд┐рдиреНрдЫ, рдЙрджрд╛рд╣рд░рдгрдХрд╛ рд▓рд╛рдЧрд┐:

streamingContext.checkpoint(checkpointDirectory)

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

from pyspark.streaming import StreamingContext

context = StreamingContext.getOrCreate(checkpointDirectory, functionToCreateContext)

рд╣рд╛рдореАрд▓реЗ KafkaUtils рдкреБрд╕реНрддрдХрд╛рд▓рдпрдХреЛ createDirectStream рд╡рд┐рдзрд┐ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ "рд▓реЗрдирджреЗрди" рд╡рд┐рд╖рдпрд╕рдБрдЧ рдЬрдбрд╛рди рдЧрд░реНрди DirectStream рд╡рд╕реНрддреБ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрдЫреМрдВ:

from pyspark.streaming.kafka import KafkaUtils
    
sc = SparkContext(conf=conf)
ssc = StreamingContext(sc, 2)

broker_list = 'localhost:9092'
topic = 'transaction'

directKafkaStream = KafkaUtils.createDirectStream(ssc,
                                [topic],
                                {"metadata.broker.list": broker_list})

JSON рдврд╛рдБрдЪрд╛рдорд╛ рдЖрдЧрдорди рдбреЗрдЯрд╛ рдкрд╛рд░реНрд╕рд┐рдЩ:

rowRdd = rdd.map(lambda w: Row(branch=w['branch'],
                                       currency=w['currency'],
                                       amount=w['amount']))
                                       
testDataFrame = spark.createDataFrame(rowRdd)
testDataFrame.createOrReplaceTempView("treasury_stream")

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

select 
    from_unixtime(unix_timestamp()) as curr_time,
    t.branch                        as branch_name,
    t.currency                      as currency_code,
    sum(amount)                     as batch_value
from treasury_stream t
group by
    t.branch,
    t.currency

рдХреНрд╡реЗрд░реА рдкрд╛рда рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрджреИ рд░ рдпрд╕рд▓рд╛рдИ рд╕реНрдкрд╛рд░реНрдХ SQL рдорд╛рд░реНрдлрдд рдЪрд▓рд╛рдЙрдБрджреИ:

sql_query = get_sql_query()
testResultDataFrame = spark.sql(sql_query)
testResultDataFrame.show(n=5)

рд░ рддреНрдпрд╕рдкрдЫрд┐ рд╣рд╛рдореА AWS RDS рдорд╛ рддрд╛рд▓рд┐рдХрд╛рдорд╛ рдирддрд┐рдЬрд╛ рдПрдХрддреНрд░рд┐рдд рдбрд╛рдЯрд╛ рдмрдЪрдд рдЧрд░реНрдЫреМрдВред рдбрд╛рдЯрд╛рдмреЗрд╕ рддрд╛рд▓рд┐рдХрд╛рдорд╛ рдПрдХрддреНрд░рд┐рдд рдкрд░рд┐рдгрд╛рдорд╣рд░реВ рдмрдЪрдд рдЧрд░реНрди, рд╣рд╛рдореА DataFrame рд╡рд╕реНрддреБрдХреЛ рд▓реЗрдЦрди рд╡рд┐рдзрд┐ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреЗрдЫреМрдВ:

testResultDataFrame.write 
    .format("jdbc") 
    .mode("append") 
    .option("driver", 'org.postgresql.Driver') 
    .option("url","jdbc:postgresql://myhabrtest.ciny8bykwxeg.us-east-1.rds.amazonaws.com:5432/habrDB") 
    .option("dbtable", "transaction_flow") 
    .option("user", "habr") 
    .option("password", "habr12345") 
    .save()

AWS RDS рдорд╛ рдЬрдбрд╛рди рд╕реЗрдЯрдЕрдк рдЧрд░реНрдиреЗ рдмрд╛рд░реЗ рдХреЗрд╣реА рд╢рдмреНрджрд╣рд░реВред рд╣рд╛рдореАрд▓реЗ "AWS PostgreSQL рдбрд┐рдкреНрд▓реЛрдЗрдЩ" рдЪрд░рдгрдорд╛ рдпрд╕рдХреЛ рд▓рд╛рдЧрд┐ рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛ рд░ рдкрд╛рд╕рд╡рд░реНрдб рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрдпреМрдВред рддрдкрд╛рдИрдВрд▓реЗ рдбрд╛рдЯрд╛рдмреЗрд╕ рд╕рд░реНрднрд░ url рдХреЛ рд░реВрдкрдорд╛ Endpoint рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреБрдкрд░реНрдЫ, рдЬреБрди рдЬрдбрд╛рди рд░ рд╕реБрд░рдХреНрд╖рд╛ рдЦрдгреНрдбрдорд╛ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реБрдиреНрдЫ:

рд╕реНрдкрд╛рд░реНрдХ рд╕реНрдЯреНрд░рд┐рдорд┐рдЩрдХреЛ рд╕рд╛рде рдЕрдкрд╛рдЪреЗ рдХрд╛рдлреНрдХрд╛ рд░ рд╕реНрдЯреНрд░рд┐рдорд┐рдЩ рдбрд╛рдЯрд╛ рдкреНрд░реЛрд╕реЗрд╕рд┐рдЩ

рд╕реНрдкрд╛рд░реНрдХ рд░ рдХрд╛рдлреНрдХрд╛рд▓рд╛рдИ рд╕рд╣реА рд░реВрдкрдорд╛ рдЬрдбрд╛рди рдЧрд░реНрдирдХреЛ рд▓рд╛рдЧрд┐, рддрдкрд╛рдИрдВрд▓реЗ рдЖрд░реНрдЯрд┐рдлреНрдпрд╛рдХреНрдЯ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ smark-submit рдорд╛рд░реНрдлрдд рдХрд╛рдо рдЪрд▓рд╛рдЙрдиреБ рдкрд░реНрдЫред spark-streaming-kafka-0-8_2.11ред рдердк рд░реВрдкрдорд╛, рд╣рд╛рдореА PostgreSQL рдбрд╛рдЯрд╛рдмреЗрд╕рд╕рдБрдЧ рдЕрдиреНрддрд░реНрдХреНрд░рд┐рдпрд╛ рдЧрд░реНрдирдХреЛ рд▓рд╛рдЧрд┐ рдПрдЙрдЯрд╛ рдХрд▓рд╛рдХреГрддрд┐ рдкрдирд┐ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреЗрдЫреМрдВ; рд╣рд╛рдореА рддрд┐рдиреАрд╣рд░реВрд▓рд╛рдИ --packages рдорд╛рд░реНрдлрдд рд╕реНрдерд╛рдирд╛рдиреНрддрд░рдг рдЧрд░реНрдиреЗрдЫреМрдВред

рд╕реНрдХреНрд░рд┐рдкреНрдЯрдХреЛ рд▓рдЪрд┐рд▓реЛрдкрдирдХреЛ рд▓рд╛рдЧрд┐, рд╣рд╛рдореА рд╕рдиреНрджреЗрд╢ рд╕рд░реНрднрд░рдХреЛ рдирд╛рдо рд░ рд╣рд╛рдореАрд▓реЗ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрди рдЪрд╛рд╣рдиреЗ рд╡рд┐рд╖рдпрд▓рд╛рдИ рдЗрдирдкреБрдЯ рдкреНрдпрд╛рд░рд╛рдорд┐рдЯрд░рд╣рд░реВрдХреЛ рд░реВрдкрдорд╛ рдкрдирд┐ рд╕рдорд╛рд╡реЗрд╢ рдЧрд░реНрдиреЗрдЫреМрдВред

рддреНрдпрд╕реЛрднрдП, рдпреЛ рдкреНрд░рдгрд╛рд▓реАрдХреЛ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рд╕реБрд░реБ рдЧрд░реНрди рд░ рдЬрд╛рдБрдЪ рдЧрд░реНрдиреЗ рд╕рдордп рд╣реЛ:

spark-submit 
--packages org.apache.spark:spark-streaming-kafka-0-8_2.11:2.0.2,
org.postgresql:postgresql:9.4.1207 
spark_job.py localhost:9092 transaction

рд╕рдмреИ рдХрд╛рдо рднрдпреЛ! рддрдкрд╛рдИрд▓реЗ рддрд▓рдХреЛ рддрд╕реНрд╡рд┐рд░рдорд╛ рджреЗрдЦреНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ, рдПрдкреНрд▓рд┐рдХреЗрд╕рди рдЪрд▓рд┐рд░рд╣реЗрдХреЛ рдмреЗрд▓рд╛, рдирдпрд╛рдБ рдПрдХрддреНрд░реАрдХрд░рдг рдкрд░рд┐рдгрд╛рдорд╣рд░реВ рдкреНрд░рддреНрдпреЗрдХ 2 рд╕реЗрдХреЗрдиреНрдбрдорд╛ рдЖрдЙрдЯрдкреБрдЯ рд╣реБрдиреНрдЫрдиреН, рдХрд┐рдирдХрд┐ рд╣рд╛рдореАрд▓реЗ StreamingContext рд╡рд╕реНрддреБ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрджрд╛ рдмреНрдпрд╛рдЪрд┐рдЩ рдЕрдиреНрддрд░рд╛рд▓рд▓рд╛рдИ 2 рд╕реЗрдХреЗрдиреНрдбрдорд╛ рд╕реЗрдЯ рдЧрд░реНрдЫреМрдВ:

рд╕реНрдкрд╛рд░реНрдХ рд╕реНрдЯреНрд░рд┐рдорд┐рдЩрдХреЛ рд╕рд╛рде рдЕрдкрд╛рдЪреЗ рдХрд╛рдлреНрдХрд╛ рд░ рд╕реНрдЯреНрд░рд┐рдорд┐рдЩ рдбрд╛рдЯрд╛ рдкреНрд░реЛрд╕реЗрд╕рд┐рдЩ

рдЕрд░реНрдХреЛ, рд╣рд╛рдореА рддрд╛рд▓рд┐рдХрд╛рдорд╛ рд░реЗрдХрд░реНрдбрд╣рд░реВрдХреЛ рдЙрдкрд╕реНрдерд┐рддрд┐ рдЬрд╛рдБрдЪ рдЧрд░реНрдирдХреЛ рд▓рд╛рдЧрд┐ рдбрд╛рдЯрд╛рдмреЗрд╕рдорд╛ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдХреНрд╡реЗрд░реА рдмрдирд╛рдЙрдБрдЫреМрдВ рд▓реЗрдирджреЗрди_рдкреНрд░рд╡рд╛рд╣:

рд╕реНрдкрд╛рд░реНрдХ рд╕реНрдЯреНрд░рд┐рдорд┐рдЩрдХреЛ рд╕рд╛рде рдЕрдкрд╛рдЪреЗ рдХрд╛рдлреНрдХрд╛ рд░ рд╕реНрдЯреНрд░рд┐рдорд┐рдЩ рдбрд╛рдЯрд╛ рдкреНрд░реЛрд╕реЗрд╕рд┐рдЩ

рдирд┐рд╖реНрдХрд░реНрд╖рдорд╛

рдпрд╕ рд▓реЗрдЦрд▓реЗ Apache Kafka рд░ PostgreSQL рд╕рдБрдЧ рд╕рдВрдпреЛрдЬрдирдорд╛ рд╕реНрдкрд╛рд░реНрдХ рд╕реНрдЯреНрд░рд┐рдорд┐рдЩ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рдЬрд╛рдирдХрд╛рд░реАрдХреЛ рд╕реНрдЯреНрд░рд┐рдо рдкреНрд░рд╢реЛрдзрдирдХреЛ рдЙрджрд╛рд╣рд░рдг рд╣реЗрд░реНрдпреЛред рд╡рд┐рднрд┐рдиреНрди рд╕реНрд░реЛрддрд╣рд░реВрдмрд╛рдЯ рдбреЗрдЯрд╛рдХреЛ рд╡реГрджреНрдзрд┐рдХреЛ рд╕рд╛рде, рд╕реНрдЯреНрд░рд┐рдорд┐рдЩ рд░ рд╡рд╛рд╕реНрддрд╡рд┐рдХ-рд╕рдордп рдЕрдиреБрдкреНрд░рдпреЛрдЧрд╣рд░реВ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрди рд╕реНрдкрд╛рд░реНрдХ рд╕реНрдЯреНрд░рд┐рдорд┐рдЩрдХреЛ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдореВрд▓реНрдпрд▓рд╛рдИ рдмрдврд╛рд╡рд╛ рджрд┐рди рдЧрд╛рд╣реНрд░реЛ рдЫред

рддрдкрд╛рдИрдВрд▓реЗ рдореЗрд░реЛ рднрдгреНрдбрд╛рд░рдорд╛ рдкреВрд░реНрдг рд╕реНрд░реЛрдд рдХреЛрдб рдлреЗрд▓рд╛ рдкрд╛рд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ GitHub.

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

рдо рддрдкрд╛рдИрдВрд▓рд╛рдИ рд╕рдлрд▓рддрд╛рдХреЛ рдХрд╛рдордирд╛ рдЧрд░реНрджрдЫреБ!

PS рдкреНрд░рд╛рд░рдореНрднрдорд╛ рдпреЛ рд╕реНрдерд╛рдиреАрдп PostgreSQL рдбрд╛рдЯрд╛рдмреЗрд╕ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреЗ рдпреЛрдЬрдирд╛ рдерд┐рдпреЛ, рддрд░ AWS рдХреЛ рд▓рд╛рдЧреА рдореЗрд░реЛ рдорд╛рдпрд╛ рджрд┐рдПрд░, рдореИрд▓реЗ рдбрд╛рдЯрд╛рдмреЗрд╕рд▓рд╛рдИ рдХреНрд▓рд╛рдЙрдбрдорд╛ рд╕рд╛рд░реНрдиреЗ рдирд┐рд░реНрдгрдп рдЧрд░реЗрдВред рдпрд╕ рд╡рд┐рд╖рдпрдорд╛ рдЕрд░реНрдХреЛ рд▓реЗрдЦрдорд╛, рдо AWS Kinesis рд░ AWS EMR рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ AWS рдорд╛ рдорд╛рдерд┐ рд╡рд░реНрдгрди рдЧрд░рд┐рдПрдХреЛ рд╕рдореНрдкреВрд░реНрдг рдкреНрд░рдгрд╛рд▓реА рдХрд╕рд░реА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЧрд░реНрдиреЗ рднрдиреЗрд░ рджреЗрдЦрд╛рдЙрдиреЗрдЫреБред рд╕рдорд╛рдЪрд╛рд░ рдкрдЫреНрдпрд╛рдЙрдиреБрд╣реЛрд╕реН!

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

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