Апачи ΠšΠ°Ρ„ΠΊΠ° ΠΈ стриминг ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π½Π° ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ со стриминг Π½Π° искра

Π—Π΄Ρ€Π°Π²ΠΎ, Π₯Π°Π±Ρ€! ДСнСска ќС ΠΈΠ·Π³Ρ€Π°Π΄ΠΈΠΌΠ΅ систСм кој ќС Π³ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΡƒΠ²Π° прСноситС Π½Π° ΠΏΠΎΡ€Π°ΠΊΠΈΡ‚Π΅ Π½Π° Apache Kafka со помош Π½Π° Spark Streaming ΠΈ ќС Π³ΠΈ запишС Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ΠΈΡ‚Π΅ ΠΎΠ΄ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ°Ρ‚Π° Π²ΠΎ Π±Π°Π·Π°Ρ‚Π° Π½Π° ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ Π½Π° ΠΎΠ±Π»Π°ΠΊΠΎΡ‚ AWS RDS.

Π”Π° замислимС Π΄Π΅ΠΊΠ° ΠΎΠ΄Ρ€Π΅Π΄Π΅Π½Π° ΠΊΡ€Π΅Π΄ΠΈΡ‚Π½Π° ΠΈΠ½ΡΡ‚ΠΈΡ‚ΡƒΡ†ΠΈΡ˜Π° Π½ΠΈ поставува Π·Π°Π΄Π°Ρ‡Π° Π΄Π° Π³ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΡƒΠ²Π°ΠΌΠ΅ Π΄ΠΎΡ˜Π΄ΠΎΠ²Π½ΠΈΡ‚Π΅ трансакции β€žΠ²ΠΎ Π»Π΅Ρ‚β€œ Π½ΠΈΠ· ситС нСјзини Ρ„ΠΈΠ»ΠΈΡ˜Π°Π»ΠΈ. Ова ΠΌΠΎΠΆΠ΅ Π΄Π° сС Π½Π°ΠΏΡ€Π°Π²ΠΈ со Ρ†Π΅Π» Π½Π°Π²Ρ€Π΅ΠΌΠ΅Π½ΠΎ ΠΏΡ€Π΅ΡΠΌΠ΅Ρ‚ΡƒΠ²Π°ΡšΠ΅ Π½Π° ΠΎΡ‚Π²ΠΎΡ€Π΅Π½Π° Π΄Π΅Π²ΠΈΠ·Π½Π° ΠΏΠΎΠ·ΠΈΡ†ΠΈΡ˜Π° Π·Π° Ρ‚Ρ€Π΅Π·ΠΎΡ€ΠΎΡ‚, Π»ΠΈΠΌΠΈΡ‚ΠΈ ΠΈΠ»ΠΈ финансиски Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ΠΈ Π·Π° трансакции ΠΈΡ‚Π½.

Како Π΄Π° Π³ΠΎ ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ€Π°Ρ‚Π΅ овој ΡΠ»ΡƒΡ‡Π°Ρ˜ Π±Π΅Π· ΡƒΠΏΠΎΡ‚Ρ€Π΅Π±Π° Π½Π° магија ΠΈ ΠΌΠ°Π³ΠΈΡ‡Π½ΠΈ ΠΌΠ°Π³ΠΈΠΈ - ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ˜Ρ‚Π΅ ΠΏΠΎΠ΄ Ρ€Π΅Π·! Оди!

Апачи ΠšΠ°Ρ„ΠΊΠ° ΠΈ стриминг ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π½Π° ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ со стриминг Π½Π° искра
(Π˜Π·Π²ΠΎΡ€ Π½Π° слика)

Π’ΠΎΠ²Π΅Π΄

Π‘Π΅ Ρ€Π°Π·Π±ΠΈΡ€Π°, ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ°Ρ‚Π° Π½Π° Π³ΠΎΠ»Π΅ΠΌΠ° ΠΊΠΎΠ»ΠΈΡ‡ΠΈΠ½Π° Π½Π° ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ Π²ΠΎ Ρ€Π΅Π°Π»Π½ΠΎ Π²Ρ€Π΅ΠΌΠ΅ Π΄Π°Π²Π° ΠΌΠ½ΠΎΠ³Ρƒ моТности Π·Π° ΡƒΠΏΠΎΡ‚Ρ€Π΅Π±Π° Π²ΠΎ соврСмСнитС систСми. Π•Π΄Π½Π° ΠΎΠ΄ Π½Π°Ρ˜ΠΏΠΎΠΏΡƒΠ»Π°Ρ€Π½ΠΈΡ‚Π΅ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΈ Π·Π° ΠΎΠ²Π° Π΅ Ρ‚Π°Π½Π΄Π΅ΠΌΠΎΡ‚ Π½Π° Apache Kafka ΠΈ Spark Streaming, ΠΊΠ°Π΄Π΅ ΡˆΡ‚ΠΎ ΠšΠ°Ρ„ΠΊΠ° создава ΠΏΡ€ΠΎΡ‚ΠΎΠΊ Π½Π° ΠΏΠ°ΠΊΠ΅Ρ‚ΠΈ Π·Π° дојдовни ΠΏΠΎΡ€Π°ΠΊΠΈ, Π° Spark Streaming Π³ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΡƒΠ²Π° ΠΎΠ²ΠΈΠ΅ ΠΏΠ°ΠΊΠ΅Ρ‚ΠΈ Π²ΠΎ Π΄Π°Π΄Π΅Π½ врСмСнски ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π».

Π—Π° Π΄Π° ја Π·Π³ΠΎΠ»Π΅ΠΌΠΈΠΌΠ΅ Ρ‚ΠΎΠ»Π΅Ρ€Π°Π½Ρ†ΠΈΡ˜Π°Ρ‚Π° Π½Π° Π³Ρ€Π΅ΡˆΠΊΠ° Π½Π° Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π°Ρ‚Π°, ќС користимС ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π½ΠΈ Ρ‚ΠΎΡ‡ΠΊΠΈ. Π‘ΠΎ овој ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·Π°ΠΌ, ΠΊΠΎΠ³Π° ΠΌΠΎΡ‚ΠΎΡ€ΠΎΡ‚ Spark Streaming Ρ‚Ρ€Π΅Π±Π° Π΄Π° Π³ΠΈ Π²Ρ€Π°Ρ‚ΠΈ ΠΈΠ·Π³ΡƒΠ±Π΅Π½ΠΈΡ‚Π΅ ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ, Ρ‚Ρ€Π΅Π±Π° само Π΄Π° сС Π²Ρ€Π°Ρ‚ΠΈ Π½Π° послСдната ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π½Π° Ρ‚ΠΎΡ‡ΠΊΠ° ΠΈ Π΄Π° ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈ со прСсмСткитС ΠΎΠ΄ Ρ‚Π°ΠΌΡƒ.

АрхитСктура Π½Π° Ρ€Π°Π·Π²ΠΈΠ΅Π½ΠΈΠΎΡ‚ систСм

Апачи ΠšΠ°Ρ„ΠΊΠ° ΠΈ стриминг ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π½Π° ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ со стриминг Π½Π° искра

ΠšΠΎΡ€ΠΈΡΡ‚Π΅Π½ΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΈ:

  • Апачи ΠšΠ°Ρ„ΠΊΠ° Π΅ дистрибуиран систСм Π·Π° ΠΏΠΎΡ€Π°ΠΊΠΈ Π·Π° ΠΎΠ±Ρ˜Π°Π²ΡƒΠ²Π°ΡšΠ΅-ΠΏΡ€Π΅Ρ‚ΠΏΠ»Π°Ρ‚ΠΈ. ПогодСн ΠΈ Π·Π° ΠΎΡ„Π»Π°Ρ˜Π½ ΠΈ Π·Π° онлајн ΠΏΠΎΡ‚Ρ€ΠΎΡˆΡƒΠ²Π°Ρ‡ΠΊΠ° Π½Π° ΠΏΠΎΡ€Π°ΠΊΠΈ. Π—Π° Π΄Π° сС спрСчи Π³ΡƒΠ±Π΅ΡšΠ΅ Π½Π° ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ, ΠΏΠΎΡ€Π°ΠΊΠΈΡ‚Π΅ Π½Π° ΠšΠ°Ρ„ΠΊΠ° сС Π·Π°Ρ‡ΡƒΠ²ΡƒΠ²Π°Π°Ρ‚ Π½Π° дискот ΠΈ сС Ρ€Π΅ΠΏΠ»ΠΈΡ†ΠΈΡ€Π°Π°Ρ‚ Π²ΠΎ кластСрот. БистСмот ΠšΠ°Ρ„ΠΊΠ° Π΅ ΠΈΠ·Π³Ρ€Π°Π΄Π΅Π½ Π½Π° Π²Ρ€Π²ΠΎΡ‚ Π½Π° услугата Π·Π° ΡΠΈΠ½Ρ…Ρ€ΠΎΠ½ΠΈΠ·Π°Ρ†ΠΈΡ˜Π° ZooKeeper;
  • Π‘Ρ‚Ρ€ΠΈΠΌΠΈΠ½Π³ Π½Π° Apache Spark - Spark ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° Π·Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π½Π° стриминг ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ. ΠœΠΎΠ΄ΡƒΠ»ΠΎΡ‚ Spark Streaming Π΅ ΠΈΠ·Π³Ρ€Π°Π΄Π΅Π½ со ΠΌΠΈΠΊΡ€ΠΎ-Π±Π°Ρ‡ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π°, ΠΊΠ°Π΄Π΅ ΡˆΡ‚ΠΎ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΡ‚ Π½Π° ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ сС Ρ‚ΠΎΠ»ΠΊΡƒΠ²Π° ΠΊΠ°ΠΊΠΎ ΠΊΠΎΠ½Ρ‚ΠΈΠ½ΡƒΠΈΡ€Π°Π½Π° Π½ΠΈΠ·Π° ΠΎΠ΄ ΠΌΠ°Π»ΠΈ ΠΏΠ°ΠΊΠ΅Ρ‚ΠΈ со ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ. Spark Streaming Π·Π΅ΠΌΠ° ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ ΠΎΠ΄ Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ ΠΈΠ·Π²ΠΎΡ€ΠΈ ΠΈ Π³ΠΈ ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡ€Π° Π²ΠΎ ΠΌΠ°Π»ΠΈ ΠΏΠ°ΠΊΠ΅Ρ‚ΠΈ. НовитС ΠΏΠ°ΠΊΠ΅Ρ‚ΠΈ сС ΠΊΡ€Π΅ΠΈΡ€Π°Π°Ρ‚ Π²ΠΎ Ρ€Π΅Π΄ΠΎΠ²Π½ΠΈ ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π»ΠΈ. На ΠΏΠΎΡ‡Π΅Ρ‚ΠΎΠΊΠΎΡ‚ Π½Π° сСкој врСмСнски ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π» сС ΠΊΡ€Π΅ΠΈΡ€Π° Π½ΠΎΠ² ΠΏΠ°ΠΊΠ΅Ρ‚ ΠΈ ситС ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ Π΄ΠΎΠ±ΠΈΠ΅Π½ΠΈ Π·Π° Π²Ρ€Π΅ΠΌΠ΅ Π½Π° Ρ‚ΠΎΡ˜ ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π» сС Π²ΠΊΠ»ΡƒΡ‡Π΅Π½ΠΈ Π²ΠΎ ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΡ‚. На ΠΊΡ€Π°Ρ˜ΠΎΡ‚ Π½Π° ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π»ΠΎΡ‚, растот Π½Π° ΠΏΠ°ΠΊΠ΅Ρ‚ΠΈΡ‚Π΅ прСстанува. Π“ΠΎΠ»Π΅ΠΌΠΈΠ½Π°Ρ‚Π° Π½Π° ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π»ΠΎΡ‚ сС ΠΎΠ΄Ρ€Π΅Π΄ΡƒΠ²Π° со ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Π°Ρ€ Π½Π°Ρ€Π΅Ρ‡Π΅Π½ сСриски ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π»;
  • Apache Spark SQL - ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡ€Π° Ρ€Π΅Π»Π°Ρ†ΠΈΠΎΠ½Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° со Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»Π½ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈΡ€Π°ΡšΠ΅ Spark. Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π½ΠΈ ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ Π·Π½Π°Ρ‡ΠΈ ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ ΡˆΡ‚ΠΎ ΠΈΠΌΠ°Π°Ρ‚ шСма, односно СдинствСн сСт Π½Π° полиња Π·Π° ситС записи. Spark SQL ΠΏΠΎΠ΄Π΄Ρ€ΠΆΡƒΠ²Π° Π²Π½Π΅ΡΡƒΠ²Π°ΡšΠ΅ ΠΎΠ΄ Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ структурирани ΠΈΠ·Π²ΠΎΡ€ΠΈ Π½Π° ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ ΠΈ, Π±Π»Π°Π³ΠΎΠ΄Π°Ρ€Π΅Π½ΠΈΠ΅ Π½Π° достапноста Π½Π° ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ Π·Π° ΡˆΠ΅ΠΌΠ°Ρ‚Π°, ΠΌΠΎΠΆΠ΅ Сфикасно Π΄Π° Π³ΠΈ Π²Ρ€Π°Ρ‚ΠΈ само ΠΏΠΎΡ‚Ρ€Π΅Π±Π½ΠΈΡ‚Π΅ полиња Π½Π° записи, Π° исто Ρ‚Π°ΠΊΠ° ΠΎΠ±Π΅Π·Π±Π΅Π΄ΡƒΠ²Π° DataFrame API;
  • AWS RDS Π΅ Ρ€Π΅Π»Π°Ρ‚ΠΈΠ²Π½ΠΎ Π΅Π²Ρ‚ΠΈΠ½Π° Ρ€Π΅Π»Π°Ρ†ΠΈΠΎΠ½Π° Π±Π°Π·Π° Π½Π° ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ заснована Π½Π° ΠΎΠ±Π»Π°ΠΊ, Π²Π΅Π±-услуга ΡˆΡ‚ΠΎ Π³ΠΎ поСдноставува ΠΏΠΎΡΡ‚Π°Π²ΡƒΠ²Π°ΡšΠ΅Ρ‚ΠΎ, Ρ€Π°Π±ΠΎΡ‚Π΅ΡšΠ΅Ρ‚ΠΎ ΠΈ ΡΠΊΠ°Π»ΠΈΡ€Π°ΡšΠ΅Ρ‚ΠΎ, Π° сС администрира Π΄ΠΈΡ€Π΅ΠΊΡ‚Π½ΠΎ ΠΎΠ΄ Amazon.

Π˜Π½ΡΡ‚Π°Π»ΠΈΡ€Π°ΡšΠ΅ ΠΈ водСњС Π½Π° сСрвСрот ΠšΠ°Ρ„ΠΊΠ°

ΠŸΡ€Π΅Π΄ Π΄ΠΈΡ€Π΅ΠΊΡ‚Π½ΠΎ Π΄Π° Π³ΠΎ користитС ΠšΠ°Ρ„ΠΊΠ°, Ρ‚Ρ€Π΅Π±Π° Π΄Π° Π±ΠΈΠ΄Π΅Ρ‚Π΅ сигурни Π΄Π΅ΠΊΠ° ΠΈΠΌΠ°Ρ‚Π΅ Java, бидСјќи ... JVM сС користи Π·Π° Ρ€Π°Π±ΠΎΡ‚Π°:

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

АјдС Π΄Π° создадСмС Π½ΠΎΠ² корисник Π·Π° Ρ€Π°Π±ΠΎΡ‚Π° со ΠšΠ°Ρ„ΠΊΠ°:

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

Π‘Π»Π΅Π΄Π½ΠΎ, ΠΏΡ€Π΅Π·Π΅ΠΌΠ΅Ρ‚Π΅ ја Π΄ΠΈΡΡ‚Ρ€ΠΈΠ±ΡƒΡ†ΠΈΡ˜Π°Ρ‚Π° ΠΎΠ΄ ΠΎΡ„ΠΈΡ†ΠΈΡ˜Π°Π»Π½Π°Ρ‚Π° Π²Π΅Π±-страница Π½Π° Apache Kafka:

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

Апачи ΠšΠ°Ρ„ΠΊΠ° ΠΈ стриминг ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π½Π° ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ со стриминг Π½Π° искра

Π”Π° Π³ΠΈ ΠΏΡ€ΠΎΠΏΡƒΡˆΡ‚ΠΈΠΌΠ΅ ΠΌΠΎΠΌΠ΅Π½Ρ‚ΠΈΡ‚Π΅ Π½Π° Ρ‚Π΅ΡΡ‚ΠΈΡ€Π°ΡšΠ΅ Π½Π° ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΠΎΡ‚ ΠΈ ΠΏΠΎΡ‚Ρ€ΠΎΡˆΡƒΠ²Π°Ρ‡ΠΎΡ‚ Π·Π° новосоздадСната Ρ‚Π΅ΠΌΠ°. ПовСќС Π΄Π΅Ρ‚Π°Π»ΠΈ Π·Π° Ρ‚ΠΎΠ° ΠΊΠ°ΠΊΠΎ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° тСстиратС ΠΈΡΠΏΡ€Π°ΡœΠ°ΡšΠ΅ ΠΈ ΠΏΡ€ΠΈΠΌΠ°ΡšΠ΅ ΠΏΠΎΡ€Π°ΠΊΠΈ сС напишани Π²ΠΎ ΠΎΡ„ΠΈΡ†ΠΈΡ˜Π°Π»Π½Π°Ρ‚Π° Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡ˜Π° - Π˜ΡΠΏΡ€Π°Ρ‚Π΅Ρ‚Π΅ Π½Π΅ΠΊΠΎΠ»ΠΊΡƒ ΠΏΠΎΡ€Π°ΠΊΠΈ. Па, ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΡƒΠ²Π°ΠΌΠ΅ Π΄Π° ΠΏΠΈΡˆΡƒΠ²Π°ΠΌΠ΅ ΠΏΡ€ΠΎΠ΄ΡƒΡ†Π΅Π½Ρ‚ Π²ΠΎ Python ΠΊΠΎΡ€ΠΈΡΡ‚Π΅Ρ˜ΡœΠΈ Π³ΠΎ 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

Apache Spark Π΅ ΡƒΠ½ΠΈΠ²Π΅Ρ€Π·Π°Π»Π½Π° ΠΈ со високи пСрформанси кластСр ΠΊΠΎΠΌΠΏΡ˜ΡƒΡ‚Π΅Ρ€ΡΠΊΠ° ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ°.

Spark Ρ€Π°Π±ΠΎΡ‚ΠΈ ΠΏΠΎΠ΄ΠΎΠ±Ρ€ΠΎ ΠΎΠ΄ ΠΏΠΎΠΏΡƒΠ»Π°Ρ€Π½ΠΈΡ‚Π΅ ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ Π½Π° ΠΌΠΎΠ΄Π΅Π»ΠΎΡ‚ MapReduce Π΄ΠΎΠ΄Π΅ΠΊΠ° ΠΏΠΎΠ΄Π΄Ρ€ΠΆΡƒΠ²Π° ΠΏΠΎΡˆΠΈΡ€ΠΎΠΊ опсСг Π½Π° Ρ‚ΠΈΠΏΠΎΠ²ΠΈ Π½Π° прСсмСтки, Π²ΠΊΠ»ΡƒΡ‡ΡƒΠ²Π°Ρ˜ΡœΠΈ ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½ΠΈ Π±Π°Ρ€Π°ΡšΠ° ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π½Π° стримови. Π‘Ρ€Π·ΠΈΠ½Π°Ρ‚Π° ΠΈΠ³Ρ€Π° Π²Π°ΠΆΠ½Π° ΡƒΠ»ΠΎΠ³Π° ΠΏΡ€ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π½Π° Π³ΠΎΠ»Π΅ΠΌΠΈ ΠΊΠΎΠ»ΠΈΡ‡ΠΈΠ½ΠΈ Π½Π° ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ, бидСјќи Π±Ρ€Π·ΠΈΠ½Π°Ρ‚Π° Π΅ Ρ‚Π°Π° ΡˆΡ‚ΠΎ Π²ΠΈ ΠΎΠ²ΠΎΠ·ΠΌΠΎΠΆΡƒΠ²Π° Π΄Π° Ρ€Π°Π±ΠΎΡ‚ΠΈΡ‚Π΅ ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎ Π±Π΅Π· Π΄Π° Ρ‚Ρ€ΠΎΡˆΠΈΡ‚Π΅ ΠΌΠΈΠ½ΡƒΡ‚ΠΈ ΠΈΠ»ΠΈ часови Π½Π° Ρ‡Π΅ΠΊΠ°ΡšΠ΅. Π•Π΄Π½Π° ΠΎΠ΄ Π½Π°Ρ˜Π³ΠΎΠ»Π΅ΠΌΠΈΡ‚Π΅ прСдности Π½Π° Spark ΡˆΡ‚ΠΎ Π³ΠΎ ΠΏΡ€Π°Π²ΠΈ Ρ‚ΠΎΠ»ΠΊΡƒ Π±Ρ€Π· Π΅ Π½Π΅Π³ΠΎΠ²Π°Ρ‚Π° способност Π΄Π° Π²Ρ€ΡˆΠΈ прСсмСтки Π²ΠΎ ΠΌΠ΅ΠΌΠΎΡ€ΠΈΡ˜Π°Ρ‚Π°.

Оваа Ρ€Π°ΠΌΠΊΠ° Π΅ напишана Π²ΠΎ Scala, Ρ‚Π°ΠΊΠ° ΡˆΡ‚ΠΎ ΠΏΡ€Π²ΠΎ Ρ‚Ρ€Π΅Π±Π° Π΄Π° ја инсталиратС:

sudo apt-get install scala

ΠŸΡ€Π΅Π·Π΅ΠΌΠ΅Ρ‚Π΅ ја Π΄ΠΈΡΡ‚Ρ€ΠΈΠ±ΡƒΡ†ΠΈΡ˜Π°Ρ‚Π° Π½Π° Spark ΠΎΠ΄ ΠΎΡ„ΠΈΡ†ΠΈΡ˜Π°Π»Π½Π°Ρ‚Π° Π²Π΅Π±-страница:

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

Π”ΠΎΠ΄Π°Π΄Π΅Ρ‚Π΅ ја ΠΏΠ°Ρ‚Π΅ΠΊΠ°Ρ‚Π° Π΄ΠΎ Spark Π²ΠΎ Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠ°Ρ‚Π° bash:

vim ~/.bashrc

Π”ΠΎΠ΄Π°Π΄Π΅Ρ‚Π΅ Π³ΠΈ слСднитС Ρ€Π΅Π΄ΠΎΠ²ΠΈ ΠΏΡ€Π΅ΠΊΡƒ ΡƒΡ€Π΅Π΄Π½ΠΈΠΊΠΎΡ‚:

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

Π˜Π·Π²Ρ€ΡˆΠ΅Ρ‚Π΅ ја ΠΊΠΎΠΌΠ°Π½Π΄Π°Ρ‚Π° ΠΏΠΎΠ΄ΠΎΠ»Ρƒ ΠΎΡ‚ΠΊΠ°ΠΊΠΎ ќС Π½Π°ΠΏΡ€Π°Π²ΠΈΡ‚Π΅ ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈ Π²ΠΎ bashrc:

source ~/.bashrc

Π Π°ΡΠΏΠΎΡ€Π΅Π΄ΡƒΠ²Π°ΡšΠ΅ Π½Π° AWS PostgreSQL

ΠžΡΡ‚Π°Π½ΡƒΠ²Π° само Π΄Π° ја распорСдимС Π±Π°Π·Π°Ρ‚Π° Π½Π° ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ Π²ΠΎ која ќС Π³ΠΈ ΠΏΡ€ΠΈΠΊΠ°Ρ‡ΡƒΠ²Π°ΠΌΠ΅ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π΅Π½ΠΈΡ‚Π΅ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎΠ΄ стримовитС. Π—Π° ΠΎΠ²Π° ќС ја користимС услугата AWS RDS.

ΠžΠ΄Π΅Ρ‚Π΅ Π²ΠΎ ΠΊΠΎΠ½Π·ΠΎΠ»Π°Ρ‚Π° AWS -> AWS RDS -> Π‘Π°Π·ΠΈ Π½Π° ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ -> ΠšΡ€Π΅ΠΈΡ€Π°Ρ˜ Π±Π°Π·Π° Π½Π° ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ:
Апачи ΠšΠ°Ρ„ΠΊΠ° ΠΈ стриминг ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π½Π° ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ со стриминг Π½Π° искра

Π˜Π·Π±Π΅Ρ€Π΅Ρ‚Π΅ PostgreSQL ΠΈ ΠΊΠ»ΠΈΠΊΠ½Π΅Ρ‚Π΅ Π‘Π»Π΅Π΄Π½ΠΎ:
Апачи ΠšΠ°Ρ„ΠΊΠ° ΠΈ стриминг ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π½Π° ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ со стриминг Π½Π° искра

Π‘ΠΈΠ΄Π΅Ρ˜ΡœΠΈ Овој ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π΅ само Π·Π° Π΅Π΄ΡƒΠΊΠ°Ρ‚ΠΈΠ²Π½ΠΈ Ρ†Π΅Π»ΠΈ; Π½ΠΈΠ΅ ќС користимС бСсплатСн сСрвСр β€žΠ½Π° ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌβ€œ (бСсплатно Π½ΠΈΠ²ΠΎ):
Апачи ΠšΠ°Ρ„ΠΊΠ° ΠΈ стриминг ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π½Π° ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ со стриминг Π½Π° искра

Π‘Π»Π΅Π΄Π½ΠΎ, ставамС ΡˆΡ‚ΠΈΠΊΠ»ΠΈΡ€Π°ΡšΠ΅ Π²ΠΎ Π±Π»ΠΎΠΊΠΎΡ‚ Free Tier, Π° ΠΏΠΎΡ‚ΠΎΠ° автоматски ќС Π½ΠΈ Π±ΠΈΠ΄Π΅ ΠΏΠΎΠ½ΡƒΠ΄Π΅Π½ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠΊ ΠΎΠ΄ класата t2.micro - ΠΈΠ°ΠΊΠΎ слаб, Ρ‚ΠΎΡ˜ Π΅ бСсплатСн ΠΈ сосСма ΠΏΠΎΠ³ΠΎΠ΄Π΅Π½ Π·Π° Π½Π°ΡˆΠ°Ρ‚Π° Π·Π°Π΄Π°Ρ‡Π°:
Апачи ΠšΠ°Ρ„ΠΊΠ° ΠΈ стриминг ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π½Π° ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ со стриминг Π½Π° искра

Π‘Π»Π΅Π΄ΡƒΠ²Π°Π°Ρ‚ ΠΌΠ½ΠΎΠ³Ρƒ Π²Π°ΠΆΠ½ΠΈ Ρ€Π°Π±ΠΎΡ‚ΠΈ: ΠΈΠΌΠ΅Ρ‚ΠΎ Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΡ‚ Π½Π° Π±Π°Π·Π°Ρ‚Π° Π½Π° ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ, ΠΈΠΌΠ΅Ρ‚ΠΎ Π½Π° Π³Π»Π°Π²Π½ΠΈΠΎΡ‚ корисник ΠΈ Π½Π΅Π³ΠΎΠ²Π°Ρ‚Π° Π»ΠΎΠ·ΠΈΠ½ΠΊΠ°. АјдС Π΄Π° Π³ΠΎ ΠΈΠΌΠ΅Π½ΡƒΠ²Π°ΠΌΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΡ‚: myHabrTest, Π³Π»Π°Π²Π΅Π½ корисник: Ρ…Π°Π±Ρ€, Π»ΠΎΠ·ΠΈΠ½ΠΊΠ°: habr12345 ΠΈ ΠΊΠ»ΠΈΠΊΠ½Π΅Ρ‚Π΅ Π½Π° ΠΊΠΎΠΏΡ‡Π΅Ρ‚ΠΎ Π‘Π»Π΅Π΄Π½ΠΎ:
Апачи ΠšΠ°Ρ„ΠΊΠ° ΠΈ стриминг ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π½Π° ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ со стриминг Π½Π° искра

На слСдната страница ΠΈΠΌΠ° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈ ΠΎΠ΄Π³ΠΎΠ²ΠΎΡ€Π½ΠΈ Π·Π° пристапноста Π½Π° Π½Π°ΡˆΠΈΠΎΡ‚ сСрвСр Π·Π° Π±Π°Π·Π° Π½Π° ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ ΠΎΠ΄Π½Π°Π΄Π²ΠΎΡ€ (Јавна пристапност) ΠΈ достапноста Π½Π° ΠΏΠΎΡ€Ρ‚Π°Ρ‚Π°:

Апачи ΠšΠ°Ρ„ΠΊΠ° ΠΈ стриминг ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π½Π° ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ со стриминг Π½Π° искра

АјдС Π΄Π° создадСмС Π½ΠΎΠ²Π° поставка Π·Π° бСзбСдносната Π³Ρ€ΡƒΠΏΠ° VPC, која ќС ΠΎΠ²ΠΎΠ·ΠΌΠΎΠΆΠΈ Π½Π°Π΄Π²ΠΎΡ€Π΅ΡˆΠ΅Π½ пристап Π΄ΠΎ Π½Π°ΡˆΠΈΠΎΡ‚ сСрвСр Π·Π° Π±Π°Π·ΠΈ Π½Π° ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ ΠΏΡ€Π΅ΠΊΡƒ ΠΏΠΎΡ€Ρ‚Π°Ρ‚Π° 5432 (PostgreSQL).
АјдС Π΄Π° ΠΎΠ΄ΠΈΠΌΠ΅ Π²ΠΎ ΠΊΠΎΠ½Π·ΠΎΠ»Π°Ρ‚Π° AWS Π²ΠΎ посСбСн ΠΏΡ€ΠΎΠ·ΠΎΡ€Π΅Ρ† Π½Π° прСлистувачот Π΄ΠΎ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π½Π°Ρ‚Π° Ρ‚Π°Π±Π»Π° VPC -> БСзбСдносни Π³Ρ€ΡƒΠΏΠΈ -> ΠšΡ€Π΅ΠΈΡ€Π°Ρ˜ ΡΠ΅ΠΊΡ†ΠΈΡ˜Π° Π·Π° бСзбСдносна Π³Ρ€ΡƒΠΏΠ°:
Апачи ΠšΠ°Ρ„ΠΊΠ° ΠΈ стриминг ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π½Π° ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ со стриминг Π½Π° искра

Π“ΠΎ поставивмС ΠΈΠΌΠ΅Ρ‚ΠΎ Π·Π° Π³Ρ€ΡƒΠΏΠ°Ρ‚Π° Π·Π° бСзбСдност - PostgreSQL, опис, Π½Π°Π²Π΅Π΄Π΅Ρ‚Π΅ со кој VPC Ρ‚Ρ€Π΅Π±Π° Π΄Π° сС ΠΏΠΎΠ²Ρ€Π·Π΅ ΠΎΠ²Π°Π° Π³Ρ€ΡƒΠΏΠ° ΠΈ ΠΊΠ»ΠΈΠΊΠ½Π΅Ρ‚Π΅ Π½Π° ΠΊΠΎΠΏΡ‡Π΅Ρ‚ΠΎ ΠšΡ€Π΅ΠΈΡ€Π°Ρ˜:
Апачи ΠšΠ°Ρ„ΠΊΠ° ΠΈ стриминг ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π½Π° ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ со стриминг Π½Π° искра

ΠŸΠΎΠΏΠΎΠ»Π½Π΅Ρ‚Π΅ Π³ΠΈ ΠΏΡ€Π°Π²ΠΈΠ»Π°Ρ‚Π° Π·Π° Π²Π»Π΅Π· Π·Π° ΠΏΠΎΡ€Ρ‚Π°Ρ‚Π° 5432 Π·Π° новосоздадСната Π³Ρ€ΡƒΠΏΠ°, ΠΊΠ°ΠΊΠΎ ΡˆΡ‚ΠΎ Π΅ ΠΏΡ€ΠΈΠΊΠ°ΠΆΠ°Π½ΠΎ Π½Π° сликата ΠΏΠΎΠ΄ΠΎΠ»Ρƒ. НС ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Ρ€Π°Ρ‡Π½ΠΎ Π΄Π° ја ΠΎΠ΄Ρ€Π΅Π΄ΠΈΡ‚Π΅ ΠΏΠΎΡ€Ρ‚Π°Ρ‚Π°, Π½ΠΎ ΠΈΠ·Π±Π΅Ρ€Π΅Ρ‚Π΅ PostgreSQL ΠΎΠ΄ ΠΏΠ°Ρ“Π°Ρ‡ΠΊΠ°Ρ‚Π° листа Π’ΠΈΠΏ.

Π‘Ρ‚Ρ€ΠΎΠ³ΠΎ ΠΊΠ°ΠΆΠ°Π½ΠΎ, врСдноста ::/0 Π·Π½Π°Ρ‡ΠΈ достапност Π½Π° дојдовСн ΡΠΎΠΎΠ±Ρ€Π°ΡœΠ°Ρ˜ Π΄ΠΎ сСрвСрот ΠΎΠ΄ Ρ†Π΅Π»ΠΈΠΎΡ‚ свСт, ΡˆΡ‚ΠΎ канонски Π½Π΅ Π΅ цСлосно Ρ‚ΠΎΡ‡Π½ΠΎ, Π½ΠΎ Π·Π° Π΄Π° Π³ΠΎ Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€Π°ΠΌΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΡ‚, Π΄Π° си Π΄ΠΎΠ·Π²ΠΎΠ»ΠΈΠΌΠ΅ Π΄Π° Π³ΠΎ користимС овој пристап:
Апачи ΠšΠ°Ρ„ΠΊΠ° ΠΈ стриминг ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π½Π° ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ со стриминг Π½Π° искра

Π‘Π΅ Π²Ρ€Π°ΡœΠ°ΠΌΠ΅ Π½Π° страницата Π½Π° прСлистувачот, ΠΊΠ°Π΄Π΅ ΡˆΡ‚ΠΎ ΠΈΠΌΠ°ΠΌΠ΅ ΠΎΡ‚Π²ΠΎΡ€Π΅Π½ΠΎ β€žΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€Π°Ρ˜ Π½Π°ΠΏΡ€Π΅Π΄Π½ΠΈ ΠΏΠΎΡΡ‚Π°Π²ΠΊΠΈβ€œ ΠΈ ΠΈΠ·Π±ΠΈΡ€Π°ΠΌΠ΅ Π²ΠΎ Π΄Π΅Π»ΠΎΡ‚ VPC бСзбСдносни Π³Ρ€ΡƒΠΏΠΈ -> Π˜Π·Π±Π΅Ρ€Π΅Ρ‚Π΅ постоСчки VPC бСзбСдносни Π³Ρ€ΡƒΠΏΠΈ -> PostgreSQL:
Апачи ΠšΠ°Ρ„ΠΊΠ° ΠΈ стриминг ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π½Π° ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ со стриминг Π½Π° искра

Π‘Π»Π΅Π΄Π½ΠΎ, Π²ΠΎ ΠΎΠΏΡ†ΠΈΠΈΡ‚Π΅ Π½Π° Π±Π°Π·Π°Ρ‚Π° Π½Π° ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ -> ИмС Π½Π° Π±Π°Π·Π°Ρ‚Π° Π½Π° ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ -> поставСтС Π³ΠΎ ΠΈΠΌΠ΅Ρ‚ΠΎ - habrDB.

МоТСмС Π΄Π° Π³ΠΈ оставимС прСостанатитС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈ, со исклучок Π½Π° ΠΎΠ½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΡƒΠ²Π°ΡšΠ΅ Π½Π° Ρ€Π΅Π·Π΅Ρ€Π²Π½Π°Ρ‚Π° копија (ΠΏΠ΅Ρ€ΠΈΠΎΠ΄ Π½Π° Π·Π°Π΄Ρ€ΠΆΡƒΠ²Π°ΡšΠ΅ Π½Π° Ρ€Π΅Π·Π΅Ρ€Π²Π½Π°Ρ‚Π° копија - 0 Π΄Π΅Π½Π°), слСдСњС ΠΈ Π£Π²ΠΈΠ΄ Π²ΠΎ пСрформанситС, стандардно. ΠšΠ»ΠΈΠΊΠ½Π΅Ρ‚Π΅ Π½Π° ΠΊΠΎΠΏΡ‡Π΅Ρ‚ΠΎ ΠšΡ€Π΅ΠΈΡ€Π°Ρ˜ Π±Π°Π·Π° Π½Π° ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ:
Апачи ΠšΠ°Ρ„ΠΊΠ° ΠΈ стриминг ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π½Π° ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ со стриминг Π½Π° искра

Π Π°ΠΊΡƒΠ²Π°Ρ‡ со ΠΊΠΎΠ½Ρ†ΠΈ

ΠŸΠΎΡΠ»Π΅Π΄Π½Π°Ρ‚Π° Ρ„Π°Π·Π° ќС Π±ΠΈΠ΄Π΅ Ρ€Π°Π·Π²ΠΎΡ˜ Π½Π° Ρ€Π°Π±ΠΎΡ‚Π° Spark, која ќС ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΡƒΠ²Π° Π½ΠΎΠ²ΠΈ ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ ΠΊΠΎΠΈ Π΄ΠΎΠ°Ρ“Π°Π°Ρ‚ ΠΎΠ΄ ΠšΠ°Ρ„ΠΊΠ° Π½Π° сСкои Π΄Π²Π΅ сСкунди ΠΈ ќС Π³ΠΈ внСсС Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ΠΈΡ‚Π΅ Π²ΠΎ Π±Π°Π·Π°Ρ‚Π° Π½Π° ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ.

Како ΡˆΡ‚ΠΎ Π΅ Π½Π°Π²Π΅Π΄Π΅Π½ΠΎ ΠΏΠΎΠ³ΠΎΡ€Π΅, ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π½ΠΈΡ‚Π΅ Ρ‚ΠΎΡ‡ΠΊΠΈ сС основСн ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·Π°ΠΌ Π²ΠΎ SparkStreaming ΡˆΡ‚ΠΎ ΠΌΠΎΡ€Π° Π΄Π° сС ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€Π° Π·Π° Π΄Π° сС ΠΎΠ±Π΅Π·Π±Π΅Π΄ΠΈ Ρ‚ΠΎΠ»Π΅Ρ€Π°Π½Ρ†ΠΈΡ˜Π° Π½Π° Π³Ρ€Π΅ΡˆΠΊΠΈ. ЌС користимС ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π½ΠΈ Ρ‚ΠΎΡ‡ΠΊΠΈ ΠΈ, Π°ΠΊΠΎ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π°Ρ‚Π° Π½Π΅ успСС, ΠΌΠΎΠ΄ΡƒΠ»ΠΎΡ‚ Spark Streaming ќС Ρ‚Ρ€Π΅Π±Π° само Π΄Π° сС Π²Ρ€Π°Ρ‚ΠΈ Π½Π° послСдната ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π½Π° Ρ‚ΠΎΡ‡ΠΊΠ° ΠΈ Π΄Π° ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈ со прСсмСткитС ΠΎΠ΄ Π½Π΅Π³ΠΎ Π·Π° Π΄Π° Π³ΠΈ Π²Ρ€Π°Ρ‚ΠΈ ΠΈΠ·Π³ΡƒΠ±Π΅Π½ΠΈΡ‚Π΅ ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ.

ΠšΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π½Π°Ρ‚Π° Ρ‚ΠΎΡ‡ΠΊΠ° ΠΌΠΎΠΆΠ΅ Π΄Π° сС ΠΎΠ²ΠΎΠ·ΠΌΠΎΠΆΠΈ со ΠΏΠΎΡΡ‚Π°Π²ΡƒΠ²Π°ΡšΠ΅ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡƒΠΌ Π½Π° Π΄ΠΎΠ²Π΅Ρ€Π»ΠΈΠ² Π΄Π°Ρ‚ΠΎΡ‚Π΅Ρ‡Π΅Π½ систСм Ρ‚ΠΎΠ»Π΅Ρ€Π°Π½Ρ‚Π΅Π½ Π·Π° Π³Ρ€Π΅ΡˆΠΊΠΈ (ΠΊΠ°ΠΊΠΎ HDFS, S3, ΠΈΡ‚Π½.) Π²ΠΎ кој ќС сС складираат ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈΡ‚Π΅ Π·Π° ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π½Π°Ρ‚Π° Ρ‚ΠΎΡ‡ΠΊΠ°. Ова сС ΠΏΡ€Π°Π²ΠΈ со ΠΊΠΎΡ€ΠΈΡΡ‚Π΅ΡšΠ΅, Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

streamingContext.checkpoint(checkpointDirectory)

Π’ΠΎ Π½Π°ΡˆΠΈΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ќС Π³ΠΎ користимС слСдниов пристап, ΠΈΠΌΠ΅Π½ΠΎ, Π°ΠΊΠΎ постои Π”ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡƒΠΌ Π·Π° ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π½ΠΈ Ρ‚ΠΎΡ‡ΠΊΠΈ, Ρ‚ΠΎΠ³Π°Ρˆ контСкстот ќС сС Ρ€Π΅ΠΊΡ€Π΅ΠΈΡ€Π° ΠΎΠ΄ ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈΡ‚Π΅ Π·Π° ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π½Π°Ρ‚Π° Ρ‚ΠΎΡ‡ΠΊΠ°. Ако Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡƒΠΌΠΎΡ‚ Π½Π΅ постои (Ρ‚.Π΅. сС ΠΈΠ·Π²Ρ€ΡˆΡƒΠ²Π° Π·Π° ΠΏΡ€Π² ΠΏΠ°Ρ‚), Ρ‚ΠΎΠ³Π°Ρˆ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡ˜Π°Ρ‚Π°ToCreateContext сС ΠΏΠΎΠ²ΠΈΠΊΡƒΠ²Π° Π΄Π° создадС Π½ΠΎΠ² контСкст ΠΈ Π΄Π° Π³ΠΎ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€Π° DSstreams:

from pyspark.streaming import StreamingContext

context = StreamingContext.getOrCreate(checkpointDirectory, functionToCreateContext)

НиС создавамС ΠΎΠ±Ρ˜Π΅ΠΊΡ‚ DirectStream Π·Π° Π΄Π° сС ΠΏΠΎΠ²Ρ€Π·Π΅ΠΌΠ΅ со Ρ‚Π΅ΠΌΠ°Ρ‚Π° β€žΡ‚Ρ€Π°Π½ΡΠ°ΠΊΡ†ΠΈΡ˜Π°β€œ ΠΊΠΎΡ€ΠΈΡΡ‚Π΅Ρ˜ΡœΠΈ Π³ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΡ‚ createDirectStream ΠΎΠ΄ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°Ρ‚Π° KafkaUtils:

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

ΠšΠΎΡ€ΠΈΡΡ‚Π΅Ρ˜ΡœΠΈ Spark 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

Π”ΠΎΠ±ΠΈΠ²Π°ΡšΠ΅ Π½Π° тСкстот Π·Π° Π±Π°Ρ€Π°ΡšΠ΅ ΠΈ Π½Π΅Π³ΠΎΠ²ΠΎ ΠΈΠ·Π²Ρ€ΡˆΡƒΠ²Π°ΡšΠ΅ ΠΏΡ€Π΅ΠΊΡƒ Spark 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β€œ. Π’Ρ€Π΅Π±Π° Π΄Π° користитС Endpoint ΠΊΠ°ΠΊΠΎ URL-адрСса Π½Π° сСрвСрот Π½Π° Π±Π°Π·Π°Ρ‚Π° Π½Π° ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ, ΡˆΡ‚ΠΎ Π΅ ΠΏΡ€ΠΈΠΊΠ°ΠΆΠ°Π½ΠΎ Π²ΠΎ Π΄Π΅Π»ΠΎΡ‚ ΠŸΠΎΠ²Ρ€Π·ΡƒΠ²Π°ΡšΠ΅ ΠΈ бСзбСдност:

Апачи ΠšΠ°Ρ„ΠΊΠ° ΠΈ стриминг ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π½Π° ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ со стриминг Π½Π° искра

Π—Π° ΠΏΡ€Π°Π²ΠΈΠ»Π½ΠΎ ΠΏΠΎΠ²Ρ€Π·ΡƒΠ²Π°ΡšΠ΅ Π½Π° Spark ΠΈ Kafka, Ρ‚Ρ€Π΅Π±Π° Π΄Π° ја ΠΈΠ·Π²Ρ€ΡˆΠΈΡ‚Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚Π° ΠΏΡ€Π΅ΠΊΡƒ smark-submit ΠΊΠΎΡ€ΠΈΡΡ‚Π΅Ρ˜ΡœΠΈ Π³ΠΎ Π°Ρ€Ρ‚Π΅Ρ„Π°ΠΊΡ‚ΠΎΡ‚ искра-стриминг-ΠΊΠ°Ρ„ΠΊΠ°-0-8_2.11. Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»Π½ΠΎ, ќС користимС ΠΈ Π°Ρ€Ρ‚Π΅Ρ„Π°ΠΊΡ‚ Π·Π° ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ†ΠΈΡ˜Π° со Π±Π°Π·Π°Ρ‚Π° Π½Π° ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ PostgreSQL; ќС Π³ΠΈ прСнСсСмС ΠΏΡ€Π΅ΠΊΡƒ --ΠΏΠ°ΠΊΠ΅Ρ‚ΠΈ.

Π—Π° флСксибилност Π½Π° скриптата, ΠΊΠ°ΠΊΠΎ Π²Π»Π΅Π·Π½ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈ ќС Π³ΠΎ Π²ΠΊΠ»ΡƒΡ‡ΠΈΠΌΠ΅ ΠΈ ΠΈΠΌΠ΅Ρ‚ΠΎ Π½Π° сСрвСрот Π·Π° ΠΏΠΎΡ€Π°ΠΊΠΈ ΠΈ Ρ‚Π΅ΠΌΠ°Ρ‚Π° ΠΎΠ΄ која сакамС Π΄Π° ΠΏΡ€ΠΈΠΌΠ°ΠΌΠ΅ ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ.

Π—Π½Π°Ρ‡ΠΈ, Π²Ρ€Π΅ΠΌΠ΅ Π΅ Π΄Π° сС стартува ΠΈ Π΄Π° сС ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈ функционалноста Π½Π° систСмот:

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 сСкунди сС ΠΏΠΎΡ˜Π°Π²ΡƒΠ²Π°Π°Ρ‚ Π½ΠΎΠ²ΠΈ Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ΠΈ ΠΎΠ΄ Π°Π³Ρ€Π΅Π³Π°Ρ†ΠΈΡ˜Π°, бидСјќи Π³ΠΎ поставивмС ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π»ΠΎΡ‚ Π½Π° сСрии Π½Π° 2 сСкунди ΠΊΠΎΠ³Π° Π³ΠΎ ΠΊΡ€Π΅ΠΈΡ€Π°Π²ΠΌΠ΅ ΠΎΠ±Ρ˜Π΅ΠΊΡ‚ΠΎΡ‚ StreamingContext:

Апачи ΠšΠ°Ρ„ΠΊΠ° ΠΈ стриминг ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π½Π° ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ со стриминг Π½Π° искра

Π‘Π»Π΅Π΄Π½ΠΎ, ΠΏΡ€Π°Π²ΠΈΠΌΠ΅ Сдноставно Π±Π°Ρ€Π°ΡšΠ΅ Π΄ΠΎ Π±Π°Π·Π°Ρ‚Π° Π½Π° ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ Π·Π° Π΄Π° Π³ΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΠΌΠ΅ присуството Π½Π° записи Π²ΠΎ Ρ‚Π°Π±Π΅Π»Π°Ρ‚Π° Ρ‚Ρ€Π°Π½ΡΠ°ΠΊΡ†ΠΈΡ˜Π°_ΠΏΡ€ΠΎΡ‚ΠΎΠΊ:

Апачи ΠšΠ°Ρ„ΠΊΠ° ΠΈ стриминг ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π½Π° ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ со стриминг Π½Π° искра

Π—Π°ΠΊΠ»ΡƒΡ‡ΠΎΠΊ

Оваа ΡΡ‚Π°Ρ‚ΠΈΡ˜Π° Ρ€Π°Π·Π³Π»Π΅Π΄Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π·Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π½Π° ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ со помош Π½Π° Spark Streaming Π²ΠΎ врска со Apache Kafka ΠΈ PostgreSQL. Π‘ΠΎ растот Π½Π° ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈΡ‚Π΅ ΠΎΠ΄ Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ ΠΈΠ·Π²ΠΎΡ€ΠΈ, Ρ‚Π΅ΡˆΠΊΠΎ Π΅ Π΄Π° сС ΠΏΡ€Π΅Ρ†Π΅Π½ΠΈ ΠΏΡ€Π°ΠΊΡ‚ΠΈΡ‡Π½Π°Ρ‚Π° врСдност Π½Π° Spark Streaming Π·Π° ΠΊΡ€Π΅ΠΈΡ€Π°ΡšΠ΅ стриминг ΠΈ Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠΈ Π²ΠΎ Ρ€Π΅Π°Π»Π½ΠΎ Π²Ρ€Π΅ΠΌΠ΅.

ЦСлосниот ΠΈΠ·Π²ΠΎΡ€Π΅Π½ ΠΊΠΎΠ΄ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π³ΠΎ Π½Π°Ρ˜Π΄Π΅Ρ‚Π΅ Π²ΠΎ ΠΌΠΎΠ΅Ρ‚ΠΎ ΡΠΊΠ»Π°Π΄ΠΈΡˆΡ‚Π΅ Π½Π° GitHub.

Π‘Ρ€Π΅ΡœΠ΅Π½ сум ΡˆΡ‚ΠΎ Ρ€Π°Π·Π³ΠΎΠ²Π°Ρ€Π°ΠΌ Π·Π° ΠΎΠ²Π°Π° ΡΡ‚Π°Ρ‚ΠΈΡ˜Π°, со Π½Π΅Ρ‚Ρ€ΠΏΠ΅Π½ΠΈΠ΅ Π³ΠΈ ΠΎΡ‡Π΅ΠΊΡƒΠ²Π°ΠΌ Π²Π°ΡˆΠΈΡ‚Π΅ ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈ, Π° исто Ρ‚Π°ΠΊΠ° сС Π½Π°Π΄Π΅Π²Π°ΠΌ Π½Π° конструктивна ΠΊΡ€ΠΈΡ‚ΠΈΠΊΠ° ΠΎΠ΄ ситС Π³Ρ€ΠΈΠΆΠ»ΠΈΠ²ΠΈ Ρ‡ΠΈΡ‚Π°Ρ‚Π΅Π»ΠΈ.

Π’ΠΈ посакувам успСх!

П.с. ΠŸΡ€Π²ΠΈΡ‡Π½ΠΎ бСшС ΠΏΠ»Π°Π½ΠΈΡ€Π°Π½ΠΎ Π΄Π° сС користи Π»ΠΎΠΊΠ°Π»Π½Π° Π±Π°Π·Π° Π½Π° ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ PostgreSQL, Π½ΠΎ со ΠΎΠ³Π»Π΅Π΄ Π½Π° ΠΌΠΎΡ˜Π°Ρ‚Π° Ρ™ΡƒΠ±ΠΎΠ² ΠΊΠΎΠ½ AWS, Ρ€Π΅ΡˆΠΈΠ² Π΄Π° ја прСмСстам Π±Π°Π·Π°Ρ‚Π° Π½Π° ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ Π²ΠΎ ΠΎΠ±Π»Π°ΠΊΠΎΡ‚. Π’ΠΎ слСдната ΡΡ‚Π°Ρ‚ΠΈΡ˜Π° Π½Π° ΠΎΠ²Π°Π° Ρ‚Π΅ΠΌΠ°, ќС ΠΏΠΎΠΊΠ°ΠΆΠ°ΠΌ ΠΊΠ°ΠΊΠΎ Π΄Π° Π³ΠΎ ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ€Π°ΠΌ Ρ†Π΅Π»ΠΈΠΎΡ‚ систСм опишан ΠΏΠΎΠ³ΠΎΡ€Π΅ Π²ΠΎ AWS ΠΊΠΎΡ€ΠΈΡΡ‚Π΅Ρ˜ΡœΠΈ AWS Kinesis ΠΈ AWS EMR. Π‘Π»Π΅Π΄Π΅Ρ‚Π΅ Π³ΠΈ вСститС!

Π˜Π·Π²ΠΎΡ€: www.habr.com

Π”ΠΎΠ΄Π°Π΄Π΅Ρ‚Π΅ ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€