ΠΡΠΈΠ²Π΅Ρ, Π₯Π°Π±Ρ! Π‘Π΅Π³ΠΎΠ΄Π½Ρ ΠΌΡ ΠΏΠΎΡΡΡΠΎΠΈΠΌ ΡΠΈΡΡΠ΅ΠΌΡ, ΠΊΠΎΡΠΎΡΠ°Ρ Π±ΡΠ΄Π΅Ρ ΠΏΡΠΈ ΠΏΠΎΠΌΠΎΡΠΈ Spark Streaming ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡ ΠΏΠΎΡΠΎΠΊΠΈ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ Apache Kafka ΠΈ Π·Π°ΠΏΠΈΡΡΠ²Π°ΡΡ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ Π² ΠΎΠ±Π»Π°ΡΠ½ΡΡ Π±Π°Π·Ρ Π΄Π°Π½Π½ΡΡ AWS RDS.
ΠΡΠ΅Π΄ΡΡΠ°Π²ΠΈΠΌ, ΡΡΠΎ Π½Π΅ΠΊΠ°Ρ ΠΊΡΠ΅Π΄ΠΈΡΠ½Π°Ρ ΠΎΡΠ³Π°Π½ΠΈΠ·Π°ΡΠΈΡ ΡΡΠ°Π²ΠΈΡ ΠΏΠ΅ΡΠ΅Π΄ Π½Π°ΠΌΠΈ Π·Π°Π΄Π°ΡΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ Π²Ρ ΠΎΠ΄ΡΡΠΈΡ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΉ Β«Π½Π° Π»Π΅ΡΡΒ» ΠΏΠΎ Π²ΡΠ΅ΠΌ ΡΠ²ΠΎΠΈΠΌ ΡΠΈΠ»ΠΈΠ°Π»Π°ΠΌ. ΠΡΠΎ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΡΠ΄Π΅Π»Π°Π½ΠΎ Ρ ΡΠ΅Π»ΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠ²Π½ΠΎΠ³ΠΎ ΡΠ°ΡΡΠ΅ΡΠ° ΠΎΡΠΊΡΡΡΠΎΠΉ Π²Π°Π»ΡΡΠΎΠΉ ΠΏΠΎΠ·ΠΈΡΠΈΠΈ Π΄Π»Ρ ΠΊΠ°Π·Π½Π°ΡΠ΅ΠΉΡΡΠ²Π°, Π»ΠΈΠΌΠΈΡΠΎΠ² ΠΈΠ»ΠΈ ΡΠΈΠ½Π°Π½ΡΠΎΠ²ΠΎΠ³ΠΎ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ° ΠΏΠΎ ΡΠ΄Π΅Π»ΠΊΠ°ΠΌ ΠΈ Ρ.Π΄.
ΠΠ°ΠΊ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°ΡΡ ΡΡΠΎΡ ΠΊΠ΅ΠΉΡ Π±Π΅Π· ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΡ ΠΌΠ°Π³ΠΈΠΈ ΠΈ Π²ΠΎΠ»ΡΠ΅Π±Π½ΡΡ Π·Π°ΠΊΠ»ΠΈΠ½Π°Π½ΠΈΠΉ β ΡΠΈΡΠ°Π΅ΠΌ ΠΏΠΎΠ΄ ΠΊΠ°ΡΠΎΠΌ! ΠΠΎΠ΅Ρ Π°Π»ΠΈ!
ΠΠ²Π΅Π΄Π΅Π½ΠΈΠ΅
ΠΠ΅Π·ΡΡΠ»ΠΎΠ²Π½ΠΎ, ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° Π±ΠΎΠ»ΡΡΠΎΠ³ΠΎ ΠΌΠ°ΡΡΠΈΠ²Π° Π΄Π°Π½Π½ΡΡ Π² ΡΠ΅Π°Π»ΡΠ½ΠΎΠΌ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ ΡΠΈΡΠΎΠΊΠΈΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ Π΄Π»Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ Π² ΡΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ ΡΠΈΡΡΠ΅ΠΌΠ°Ρ . ΠΠ΄Π½ΠΎΠΉ ΠΈΠ· ΠΏΠΎΠΏΡΠ»ΡΡΠ½Π΅ΠΉΡΠΈΡ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°ΡΠΈΠΉ Π΄Π»Ρ ΡΡΠΎΠ³ΠΎ ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠ°Π½Π΄Π΅ΠΌ Apache Kafka ΠΈ Spark Streaming, Π³Π΄Π΅ Kafka β ΡΠΎΠ·Π΄Π°Π΅Ρ ΠΏΠΎΡΠΎΠΊ ΠΏΠ°ΠΊΠ΅ΡΠΎΠ² Π²Ρ ΠΎΠ΄ΡΡΠΈΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ, Π° Spark Streaming ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°Π΅Ρ ΡΡΠΈ ΠΏΠ°ΠΊΠ΅ΡΡ ΡΠ΅ΡΠ΅Π· Π·Π°Π΄Π°Π½Π½ΡΠΉ ΠΈΠ½ΡΠ΅ΡΠ²Π°Π» Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ.
ΠΠ»Ρ ΠΏΠΎΠ²ΡΡΠ΅Π½ΠΈΡ ΠΎΡΠΊΠ°Π·ΠΎΡΡΡΠΎΠΉΡΠΈΠ²ΠΎΡΡΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ, Π±ΡΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΊΠΎΠ½ΡΡΠΎΠ»ΡΠ½ΡΠ΅ ΡΠΎΡΠΊΠΈ β ΡΠ΅ΠΊΠΏΠΎΠΈΠ½ΡΡ (checkpoints). ΠΡΠΈ ΠΏΠΎΠΌΠΎΡΠΈ ΡΡΠΎΠ³ΠΎ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌΠ°, ΠΊΠΎΠ³Π΄Π° ΠΌΠΎΠ΄ΡΠ»Ρ Spark Streaming ΠΏΠΎΡΡΠ΅Π±ΡΠ΅ΡΡΡ Π²ΠΎΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ ΡΡΡΠ°ΡΠ΅Π½Π½ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅, Π΅ΠΌΡ Π½ΡΠΆΠ½ΠΎ Π±ΡΠ΄Π΅Ρ ΡΠΎΠ»ΡΠΊΠΎ Π²Π΅ΡΠ½ΡΡΡΡΡ ΠΊ ΠΏΠΎΡΠ»Π΅Π΄Π½Π΅ΠΉ ΠΊΠΎΠ½ΡΡΠΎΠ»ΡΠ½ΠΎΠΉ ΡΠΎΡΠΊΠ΅ ΠΈ Π²ΠΎΠ·ΠΎΠ±Π½ΠΎΠ²ΠΈΡΡ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΡ ΠΎΡ Π½Π΅Π΅.
ΠΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠ° ΡΠ°Π·ΡΠ°Π±Π°ΡΡΠ²Π°Π΅ΠΌΠΎΠΉ ΡΠΈΡΡΠ΅ΠΌΡ
ΠΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΡ:
Apache Kafka β ΡΡΠΎ ΡΠ°ΡΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½Π°Ρ ΡΠΈΡΡΠ΅ΠΌΠ° ΠΎΠ±ΠΌΠ΅Π½Π° ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡΠΌΠΈ Ρ ΠΏΡΠ±Π»ΠΈΠΊΠ°ΡΠΈΠ΅ΠΉ ΠΈ ΠΏΠΎΠ΄ΠΏΠΈΡΠΊΠΎΠΉ. ΠΠΎΠ΄Ρ ΠΎΠ΄ΠΈΡ ΠΊΠ°ΠΊ Π΄Π»Ρ Π°Π²ΡΠΎΠ½ΠΎΠΌΠ½ΠΎΠ³ΠΎ, ΡΠ°ΠΊ ΠΈ Π΄Π»Ρ ΠΎΠ½Π»Π°ΠΉΠ½ΠΎΠ²ΠΎΠ³ΠΎ ΠΏΠΎΡΡΠ΅Π±Π»Π΅Π½ΠΈΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ. ΠΠ»Ρ ΠΏΡΠ΅Π΄ΠΎΡΠ²ΡΠ°ΡΠ΅Π½ΠΈΡ ΠΏΠΎΡΠ΅ΡΠΈ Π΄Π°Π½Π½ΡΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ Kafka ΡΠΎΡ ΡΠ°Π½ΡΡΡΡΡ Π½Π° Π΄ΠΈΡΠΊΠ΅ ΠΈ ΡΠ΅ΠΏΠ»ΠΈΡΠΈΡΡΡΡΡΡ Π²Π½ΡΡΡΠΈ ΠΊΠ»Π°ΡΡΠ΅ΡΠ°. Π‘ΠΈΡΡΠ΅ΠΌΠ° Kafka ΠΏΠΎΡΡΡΠΎΠ΅Π½Π° ΠΏΠΎΠ²Π΅ΡΡ ΡΠ»ΡΠΆΠ±Ρ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΠΈ ZooKeeper;Apache Spark Streaming β ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ Spark Π΄Π»Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ ΠΏΠΎΡΠΎΠΊΠΎΠ²ΡΡ Π΄Π°Π½Π½ΡΡ . ΠΠΎΠ΄ΡΠ»Ρ Spark Streaming ΠΏΠΎΡΡΡΠΎΠ΅Π½ Ρ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ Β«ΠΌΠΈΠΊΡΠΎΠΏΠ°ΠΊΠ΅ΡΠ½ΠΎΠΉΒ» Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΡ (micro-batch architecture), ΠΊΠΎΠ³Π΄Π° ΠΏΠΎΡΠΎΠΊ Π΄Π°Π½Π½ΡΡ ΠΈΠ½ΡΠ΅ΡΠΏΡΠ΅ΡΠΈΡΡΠ΅ΡΡΡ ΠΊΠ°ΠΊ Π½Π΅ΠΏΡΠ΅ΡΡΠ²Π½Π°Ρ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΡ ΠΌΠ°Π»Π΅Π½ΡΠΊΠΈΡ ΠΏΠ°ΠΊΠ΅ΡΠΎΠ² Π΄Π°Π½Π½ΡΡ . Spark Streaming ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ Π΄Π°Π½Π½ΡΠ΅ ΠΈΠ· ΡΠ°Π·Π½ΡΡ ΠΈΡΡΠΎΡΠ½ΠΈΠΊΠΎΠ² ΠΈ ΠΎΠ±ΡΠ΅Π΄ΠΈΠ½ΡΠ΅Ρ ΠΈΡ Π² Π½Π΅Π±ΠΎΠ»ΡΡΠΈΠ΅ ΠΏΠ°ΠΊΠ΅ΡΡ. ΠΠΎΠ²ΡΠ΅ ΠΏΠ°ΠΊΠ΅ΡΡ ΡΠΎΠ·Π΄Π°ΡΡΡΡ ΡΠ΅ΡΠ΅Π· ΡΠ΅Π³ΡΠ»ΡΡΠ½ΡΠ΅ ΠΈΠ½ΡΠ΅ΡΠ²Π°Π»Ρ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ. Π Π½Π°ΡΠ°Π»Π΅ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΈΠ½ΡΠ΅ΡΠ²Π°Π»Π° Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ ΡΠΎΠ·Π΄Π°Π΅ΡΡΡ Π½ΠΎΠ²ΡΠΉ ΠΏΠ°ΠΊΠ΅Ρ, ΠΈ Π»ΡΠ±ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅, ΠΏΠΎΡΡΡΠΏΠΈΠ²ΡΠΈΠ΅ Π² ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ ΡΡΠΎΠ³ΠΎ ΠΈΠ½ΡΠ΅ΡΠ²Π°Π»Π°, Π²ΠΊΠ»ΡΡΠ°ΡΡΡΡ Π² ΠΏΠ°ΠΊΠ΅Ρ. Π ΠΊΠΎΠ½ΡΠ΅ ΠΈΠ½ΡΠ΅ΡΠ²Π°Π»Π° ΡΠ²Π΅Π»ΠΈΡΠ΅Π½ΠΈΠ΅ ΠΏΠ°ΠΊΠ΅ΡΠ° ΠΏΡΠ΅ΠΊΡΠ°ΡΠ°Π΅ΡΡΡ. Π Π°Π·ΠΌΠ΅Ρ ΠΈΠ½ΡΠ΅ΡΠ²Π°Π»Π° ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅ΡΡΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠΌ, ΠΊΠΎΡΠΎΡΡΠΉ Π½Π°Π·ΡΠ²Π°Π΅ΡΡΡ ΠΈΠ½ΡΠ΅ΡΠ²Π°Π» ΠΏΠ°ΠΊΠ΅ΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ (batch interval);Apache Spark SQL β ΠΎΠ±ΡΠ΅Π΄ΠΈΠ½ΡΠ΅Ρ ΡΠ΅Π»ΡΡΠΈΠΎΠ½Π½ΡΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΡ Ρ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΡΠΌ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ Spark. ΠΠΎΠ΄ ΡΡΡΡΠΊΡΡΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠΌΠΈ Π΄Π°Π½Π½ΡΠΌΠΈ ΠΏΠΎΠ΄ΡΠ°Π·ΡΠΌΠ΅Π²Π°ΡΡΡΡ Π΄Π°Π½Π½ΡΠ΅, ΠΈΠΌΠ΅ΡΡΠΈΠ΅ ΡΡ Π΅ΠΌΡ, ΡΠΎ Π΅ΡΡΡ Π΅Π΄ΠΈΠ½ΡΠΉ Π½Π°Π±ΠΎΡ ΠΏΠΎΠ»Π΅ΠΉ Π΄Π»Ρ Π²ΡΠ΅Ρ Π·Π°ΠΏΠΈΡΠ΅ΠΉ. Spark SQL ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ Π²Π²ΠΎΠ΄ ΠΈΠ· ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²Π° ΠΈΡΡΠΎΡΠ½ΠΈΠΊΠΎΠ² ΡΡΡΡΠΊΡΡΡΠΈΡΠΎΠ²Π°Π½Π½ΡΡ Π΄Π°Π½Π½ΡΡ ΠΈ, Π±Π»Π°Π³ΠΎΠ΄Π°ΡΡ Π½Π°Π»ΠΈΡΠΈΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ ΠΎ ΡΡ Π΅ΠΌΠ΅, ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎ ΠΈΠ·Π²Π»Π΅ΠΊΠ°ΡΡ ΡΠΎΠ»ΡΠΊΠΎ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡΠ΅ ΠΏΠΎΠ»Ρ Π·Π°ΠΏΠΈΡΠ΅ΠΉ, Π° ΡΠ°ΠΊΠΆΠ΅ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ API-ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΡ DataFrame;AWS RDS β ΡΡΠΎ cΡΠ°Π²Π½ΠΈΡΠ΅Π»ΡΠ½ΠΎ Π½Π΅Π΄ΠΎΡΠΎΠ³Π°Ρ ΠΎΠ±Π»Π°ΡΠ½Π°Ρ ΡΠ΅Π»ΡΡΠΈΠΎΠ½Π½Π°Ρ Π±Π°Π·Π° Π΄Π°Π½Π½ΡΡ , Π²Π΅Π±-ΡΠ΅ΡΠ²ΠΈΡ, ΠΊΠΎΡΠΎΡΡΠΉ ΡΠΏΡΠΎΡΠ°Π΅Ρ Π½Π°ΡΡΡΠΎΠΉΠΊΡ, ΡΠΊΡΠΏΠ»ΡΠ°ΡΠ°ΡΠΈΡ ΠΈ ΠΌΠ°ΡΡΡΠ°Π±ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅, Π°Π΄ΠΌΠΈΠ½ΠΈΡΡΡΠΈΡΡΠ΅ΡΡΡ Π½Π΅ΠΏΠΎΡΡΠ΅Π΄cΡΠ²Π΅Π½Π½ΠΎ Amazon.
Π£ΡΡΠ°Π½ΠΎΠ²ΠΊΠ° ΠΈ Π·Π°ΠΏΡΡΠΊ ΡΠ΅ΡΠ²Π΅ΡΠ° Kafka
ΠΠ΅ΡΠ΅Π΄ Π½Π΅ΠΏΠΎΡΡΠ΅Π΄ΡΡΠ²Π΅Π½Π½ΡΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ Kafka, Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΡΠ±Π΅Π΄ΠΈΡΡΡΡ Π² Π½Π°Π»ΠΈΡΠΈΠΈ Java, Ρ.ΠΊ. Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ JVM:
sudo apt-get update
sudo apt-get install default-jre
java -version
Π‘ΠΎΠ·Π΄Π°Π΄ΠΈΠΌ Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ Ρ Kafka:
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
ΠΠ΅ΡΠ΅Π΄ Π·Π°ΠΏΡΡΠΊΠΎΠΌ ΡΠ΅ΡΠ²Π΅ΡΠ° Kafka, Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΡΡΠ°ΡΡΠΎΠ²Π°ΡΡ ΡΠ΅ΡΠ²Π΅Ρ ZooKeeper, Π±ΡΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π²ΡΠΏΠΎΠΌΠΎΠ³Π°ΡΠ΅Π»ΡΠ½ΡΠΉ ΡΠΊΡΠΈΠΏΡ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΠΎΡΡΠ°Π²Π»ΡΠ΅ΡΡΡ Π²ΠΌΠ΅ΡΡΠ΅ Ρ Π΄ΠΈΡΡΡΠΈΠ±ΡΡΠΈΠ²ΠΎΠΌ Kafka:
Cd ~/kafka
bin/zookeeper-server-start.sh config/zookeeper.properties
ΠΠΎΡΠ»Π΅ ΡΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ZooKeeper ΡΡΠΏΠ΅ΡΠ½ΠΎ ΡΡΠ°ΡΡΠΎΠ²Π°Π», Π² ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎΠΌ ΡΠ΅ΡΠΌΠΈΠ½Π°Π»Π΅ Π·Π°ΠΏΡΡΠΊΠ°Π΅ΠΌ ΡΠ΅ΡΠ²Π΅Ρ Kafka:
bin/kafka-server-start.sh config/server.properties
Π‘ΠΎΠ·Π΄Π°Π΄ΠΈΠΌ Π½ΠΎΠ²ΡΠΉ ΡΠΎΠΏΠΈΠΊ ΠΏΠΎΠ΄ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ Transaction:
bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 3 --topic transaction
Π£Π±Π΅Π΄ΠΈΠΌΡΡ, ΡΡΠΎ ΡΠΎΠΏΠΈΠΊ Ρ Π½ΡΠΆΠ½ΡΠΌ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎΠΌ ΠΏΠ°ΡΡΠΈΡΠΈΠΉ ΠΈ ΡΠ΅ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΠ΅ΠΉ Π±ΡΠ» ΡΠΎΠ·Π΄Π°Π½:
bin/kafka-topics.sh --describe --zookeeper localhost:2181
Π£ΠΏΡΡΡΠΈΠΌ ΠΌΠΎΠΌΠ΅Π½ΡΡ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΏΡΠΎΠ΄ΡΡΠ΅ΡΠ° ΠΈ ΠΊΠΎΠ½ΡΡΡΠΌΠ΅ΡΠ° Π΄Π»Ρ Π²Π½ΠΎΠ²Ρ ΡΠΎΠ·Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΡΠΎΠΏΠΈΠΊΠ°. ΠΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎ ΠΎ ΡΠΎΠΌ, ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡΠΎΡΠ΅ΡΡΠΈΡΠΎΠ²Π°ΡΡ ΠΎΡΠΏΡΠ°Π²ΠΊΡ ΠΈ ΠΏΡΠΈΠ΅ΠΌ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ, Π½Π°ΠΏΠΈΡΠ°Π½ΠΎ Π² ΠΎΡΠΈΡΠΈΠ°Π»ΡΠ½ΠΎΠΉ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ β
ΠΠ°ΠΏΠΈΡΠ°Π½ΠΈΠ΅ ΠΏΡΠΎΠ΄ΡΡΠ΅ΡΠ°
ΠΡΠΎΠ΄ΡΡΠ΅Ρ Π±ΡΠ΄Π΅Ρ Π³Π΅Π½Π΅ΡΠΈΡΡ ΡΠ»ΡΡΠ°ΠΉΠ½ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅ β ΠΏΠΎ 100 ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ ΠΊΠ°ΠΆΠ΄ΡΡ ΡΠ΅ΠΊΡΠ½Π΄Ρ. ΠΠΎΠ΄ ΡΠ»ΡΡΠ°ΠΉΠ½ΡΠΌΠΈ Π΄Π°Π½Π½ΡΠΌΠΈ Π±ΡΠ΄Π΅ΠΌ ΠΏΠΎΠ½ΠΈΠΌΠ°ΡΡ ΡΠ»ΠΎΠ²Π°ΡΡ, ΡΠΎΡΡΠΎΡΡΠΈΠΉ ΠΈΠ· ΡΡΠ΅Ρ ΠΏΠΎΠ»Π΅ΠΉ:
- Branch β Π½Π°ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠΎΡΠΊΠΈ ΠΏΡΠΎΠ΄Π°ΠΆ ΠΊΡΠ΅Π΄ΠΈΡΠ½ΠΎΠΉ ΠΎΡΠ³Π°Π½ΠΈΠ·Π°ΡΠΈΠΈ;
- Currency β Π²Π°Π»ΡΡΠ° ΡΠ΄Π΅Π»ΠΊΠΈ;
- Amount β ΡΡΠΌΠΌΠ° ΡΠ΄Π΅Π»ΠΊΠΈ. Π‘ΡΠΌΠΌΠ° Π±ΡΠ΄Π΅Ρ ΠΏΠΎΠ»ΠΎΠΆΠΈΡΠ΅Π»ΡΠ½ΡΠΌ ΡΠΈΡΠ»ΠΎΠΌ, Π΅ΡΠ»ΠΈ ΡΡΠΎ ΠΏΠΎΠΊΡΠΏΠΊΠ° Π²Π°Π»ΡΡΡ ΠΠ°Π½ΠΊΠΎΠΌ, ΠΈ ΠΎΡΡΠΈΡΠ°ΡΠ΅Π»ΡΠ½ΡΠΌ β Π΅ΡΠ»ΠΈ ΠΏΡΠΎΠ΄Π°ΠΆΠ°.
ΠΠΎΠ΄ Π΄Π»Ρ ΠΏΡΠΎΠ΄ΡΡΠ΅ΡΠ° Π²ΡΠ³Π»ΡΠ΄ΠΈΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ:
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
ΠΠ°Π»Π΅Π΅, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΠΌΠ΅ΡΠΎΠ΄ send, ΠΎΡΠΏΡΠ°Π²Π»ΡΠ΅ΠΌ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ Π½Π° ΡΠ΅ΡΠ²Π΅Ρ, Π² Π½ΡΠΆΠ½ΡΠΉ Π½Π°ΠΌ ΡΠΎΠΏΠΈΠΊ, Π² ΡΠΎΡΠΌΠ°ΡΠ΅ 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 —> Databases —> Create database:
ΠΡΠ±ΠΈΡΠ°Π΅ΠΌ PostgreSQL ΠΈ Π½Π°ΠΆΠΈΠΌΠ°Π΅ΠΌ ΠΊΠ½ΠΎΠΏΠΊΡ Next:
Π’.ΠΊ. Π΄Π°Π½Π½ΡΠΉ ΠΏΡΠΈΠΌΠ΅Ρ ΡΠ°Π·Π±ΠΈΡΠ°Π΅ΡΡΡ ΠΈΡΠΊΠ»ΡΡΠΈΡΠ΅Π»ΡΠ½ΠΎ Π² ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΡΡ
ΡΠ΅Π»ΡΡ
, Π±ΡΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π±Π΅ΡΠΏΠ»Π°ΡΠ½ΡΠΉ ΡΠ΅ΡΠ²Π΅Ρ Β«Π½Π° ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΠΊΠ°Ρ
Β» (Free Tier):
ΠΠ°Π»Π΅Π΅, ΡΡΠ°Π²ΠΈΠΌ Π³Π°Π»ΠΎΡΠΊΡ Π² Π±Π»ΠΎΠΊΠ΅ Free Tier, ΠΈ ΠΏΠΎΡΠ»Π΅ ΡΡΠΎΠ³ΠΎ Π½Π°ΠΌ Π°Π²ΡΠΎΠΌΠ°ΡΠΎΠΌ Π±ΡΠ΄Π΅Ρ ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠ΅Π½ ΠΈΠ½ΡΡΠ°Π½Ρ ΠΊΠ»Π°ΡΡΠ° t2.micro β Ρ
ΠΎΡΡ ΠΈ ΡΠ»Π°Π±Π΅Π½ΡΠΊΠΈΠΉ, Π½ΠΎ Π±Π΅ΡΠΏΠ»Π°ΡΠ½ΡΠΉ ΠΈ Π²ΠΏΠΎΠ»Π½Π΅ ΠΏΠΎΠ΄ΠΎΠΉΠ΄Π΅Ρ Π΄Π»Ρ Π½Π°ΡΠ΅ΠΉ Π·Π°Π΄Π°ΡΠΈ:
Π‘Π»Π΅Π΄ΠΎΠΌ ΠΈΠ΄ΡΡ ΠΎΡΠ΅Π½Ρ Π²Π°ΠΆΠ½ΡΠ΅ Π²Π΅ΡΠΈ: Π½Π°ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈΠ½ΡΡΠ°Π½ΡΠ° ΠΠ, ΠΈΠΌΡ ΠΌΠ°ΡΡΠ΅Ρ-ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΈ Π΅Π³ΠΎ ΠΏΠ°ΡΠΎΠ»Ρ. ΠΠ°Π·ΠΎΠ²Π΅ΠΌ ΠΈΠ½ΡΡΠ°Π½ΡΡ: myHabrTest, ΠΌΠ°ΡΡΠ΅Ρ-ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ: habr, ΠΏΠ°ΡΠΎΠ»Ρ: habr12345 ΠΈ Π½Π°ΠΆΠΈΠΌΠ°Π΅ΠΌ Π½Π° ΠΊΠ½ΠΎΠΏΠΊΡ Next:
ΠΠ° ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΉ ΡΡΡΠ°Π½ΠΈΡΠ΅ Π½Π°Ρ ΠΎΠ΄ΡΡΡΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ, ΠΎΡΠ²Π΅ΡΠ°ΡΡΠΈΠ΅ Π·Π° Π΄ΠΎΡΡΡΠΏΠ½ΠΎΡΡΡ Π½Π°ΡΠ΅Π³ΠΎ ΡΠ΅ΡΠ²Π΅ΡΠ° ΠΠ ΠΈΠ·Π²Π½Π΅ (Public accessibility) ΠΈ Π΄ΠΎΡΡΡΠΏΠ½ΠΎΡΡΡ ΠΏΠΎΡΡΠΎΠ²:
ΠΠ°Π²Π°ΠΉΡΠ΅ ΡΠΎΠ·Π΄Π°Π΄ΠΈΠΌ Π½ΠΎΠ²ΡΡ Π½Π°ΡΡΡΠΎΠΉΠΊΡ Π΄Π»Ρ VPC security group, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ ΠΈΠ·Π²Π½Π΅ ΠΎΠ±ΡΠ°ΡΠ°ΡΡΡΡ ΠΊ Π½Π°ΡΠ΅ΠΌΡ ΡΠ΅ΡΠ²Π΅ΡΡ ΠΠ ΡΠ΅ΡΠ΅Π· ΠΏΠΎΡΡ 5432 (PostgreSQL).
ΠΠ΅ΡΠ΅ΠΉΠ΄Π΅ΠΌ Π² ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎΠΌ ΠΎΠΊΠ½Π΅ Π±ΡΠ°ΡΠ·Π΅ΡΠ° ΠΊ ΠΊΠΎΠ½ΡΠΎΠ»ΠΈ AWS Π² ΡΠ°Π·Π΄Π΅Π» VPC Dashboard —> Security Groups —> Create security group:
ΠΠ°Π΄Π°Π΅ΠΌ ΠΈΠΌΡ Π΄Π»Ρ Security group β PostgreSQL, ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅, ΡΠΊΠ°Π·ΡΠ²Π°Π΅ΠΌ ΠΊ ΠΊΠ°ΠΊΠΎΠΉ VPC Π΄Π°Π½Π½Π°Ρ Π³ΡΡΠΏΠΏΠ° Π΄ΠΎΠ»ΠΆΠ½Π° Π±ΡΡΡ Π°ΡΡΠΎΡΠΈΠΈΡΠΎΠ²Π°Π½Π° ΠΈ Π½Π°ΠΆΠΈΠΌΠ°Π΅ΠΌ ΠΊΠ½ΠΎΠΏΠΊΡ Create:
ΠΠ°ΠΏΠΎΠ»Π½ΡΠ΅ΠΌ Π΄Π»Ρ ΡΠ²Π΅ΠΆΠ΅ΡΠΎΠ·Π΄Π°Π½Π½ΠΎΠΉ Π³ΡΡΠΏΠΏΡ Inbound rules Π΄Π»Ρ ΠΏΠΎΡΡΠ° 5432, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½Π° ΠΊΠ°ΡΡΠΈΠ½ΠΊΠ΅ Π½ΠΈΠΆΠ΅. ΠΡΡΡΠ½ΡΡ ΠΏΠΎΡΡ ΠΌΠΎΠΆΠ½ΠΎ Π½Π΅ ΡΠΊΠ°Π·ΡΠ²Π°ΡΡ, Π° Π²ΡΠ±ΡΠ°ΡΡ PostgreSQL ΠΈΠ· ΡΠ°ΡΠΊΡΡΠ²Π°ΡΡΠ΅Π³ΠΎΡΡ ΡΠΏΠΈΡΠΊΠ° Type.
Π‘ΡΡΠΎΠ³ΠΎ Π³ΠΎΠ²ΠΎΡΡ, Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ::/0 ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ Π΄ΠΎΡΡΡΠΏΠ½ΠΎΡΡΡ Π²Ρ
ΠΎΠ΄ΡΡΠ΅Π³ΠΎ ΡΡΠ°ΡΡΠΈΠΊΠ° Π΄Π»Ρ ΡΠ΅ΡΠ²Π΅ΡΠ° ΡΠΎ Π²ΡΠ΅Π³ΠΎ ΠΌΠΈΡΠ°, ΡΡΠΎ ΠΊΠ°Π½ΠΎΠ½ΠΈΡΠ΅ΡΠΊΠΈ Π½Π΅ ΡΠΎΠ²ΡΠ΅ΠΌ Π²Π΅ΡΠ½ΠΎ, Π½ΠΎ Π΄Π»Ρ ΡΠ°Π·Π±ΠΎΡΠ° ΠΏΡΠΈΠΌΠ΅ΡΠ° ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΠΌ ΡΠ΅Π±Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΠ°ΠΊΠΎΠΉ ΠΏΠΎΠ΄Ρ
ΠΎΠ΄:
ΠΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌΡΡ ΠΊ ΡΡΡΠ°Π½ΠΈΡΠ΅ Π±ΡΠ°ΡΠ·Π΅ΡΠ°, Π³Π΄Π΅ Ρ Π½Π°Ρ ΠΎΡΠΊΡΡΡΠΎ Β«Configure advanced settingsΒ» ΠΈ Π²ΡΠ±ΠΈΡΠ°Π΅ΠΌ Π² ΡΠ°Π·Π΄Π΅Π»Π΅ VPC security groups —> Choose existing VPC security groups —> PostgreSQL:
ΠΠ°Π»Π΅Π΅, Π² ΡΠ°Π·Π΄Π΅Π»Π΅ Database options —> Database name —> Π·Π°Π΄Π°Π΅ΠΌ ΠΈΠΌΡ β habrDB.
ΠΡΡΠ°Π»ΡΠ½ΡΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ, Π·Π° ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ΠΌ ΡΠ°Π·Π²Π΅ ΡΡΠΎ ΠΎΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ Π±ΡΠΊΠ°ΠΏΠΈΡΠΎΠ²Π°Π½ΠΈΡ (backup retention period β 0 days), ΠΌΠΎΠ½ΠΈΡΠΎΡΠΈΠ½Π³Π° ΠΈ Performance Insights, ΠΌΠΎΠΆΠ΅ΠΌ ΠΎΡΡΠ°Π²ΠΈΡΡ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ. ΠΠ°ΠΆΠΈΠΌΠ°Π΅ΠΌ Π½Π° ΠΊΠ½ΠΎΠΏΠΊΡ Create database:
ΠΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ ΠΏΠΎΡΠΎΠΊΠΎΠ²
ΠΠ°Π²Π΅ΡΡΠ°ΡΡΠΈΠΌ ΡΡΠ°ΠΏΠΎΠΌ Π±ΡΠ΄Π΅Ρ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ° Spark-Π΄ΠΆΠΎΠ±Ρ, ΠΊΠΎΡΠΎΡΠ°Ρ Π±ΡΠ΄Π΅Ρ ΠΊΠ°ΠΆΠ΄ΡΠ΅ Π΄Π²Π΅ ΡΠ΅ΠΊΡΠ½Π΄Ρ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡ Π½ΠΎΠ²ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅, ΠΏΡΠΈΡΠ΅Π΄ΡΠΈΠ΅ ΠΎΡ Kafka ΠΈ Π·Π°Π½ΠΎΡΠΈΡΡ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ Π² Π±Π°Π·Ρ Π΄Π°Π½Π½ΡΡ .
ΠΠ°ΠΊ Π±ΡΠ»ΠΎ ΠΎΡΠΌΠ΅ΡΠ΅Π½ΠΎ Π²ΡΡΠ΅, ΠΊΠΎΠ½ΡΡΠΎΠ»ΡΠ½ΡΠ΅ ΡΠΎΡΠΊΠΈ (Ρheckpoints) β ΡΡΠΎ ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΉ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌ Π² SparkStreaming, ΠΊΠΎΡΠΎΡΡΠΉ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡΡΡ Π½Π°ΡΡΡΠΎΠ΅Π½ Π΄Π»Ρ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠ΅Π½ΠΈΡ ΠΎΡΠΊΠ°Π·ΠΎΡΡΡΠΎΠΉΡΠΈΠ²ΠΎΡΡΠΈ. ΠΡΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΊΠΎΠ½ΡΡΠΎΠ»ΡΠ½ΡΠ΅ ΡΠΎΡΠΊΠΈ ΠΈ, Π² ΡΠ»ΡΡΠ°Π΅ ΠΏΠ°Π΄Π΅Π½ΠΈΡ ΠΏΡΠΎΡΠ΅Π΄ΡΡΡ, ΠΌΠΎΠ΄ΡΠ»Ρ Spark Streaming Π΄Π»Ρ Π²ΠΎΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ ΡΡΡΠ°ΡΠ΅Π½Π½ΡΡ Π΄Π°Π½Π½ΡΡ Π½ΡΠΆΠ½ΠΎ Π±ΡΠ΄Π΅Ρ ΡΠΎΠ»ΡΠΊΠΎ Π²Π΅ΡΠ½ΡΡΡΡΡ ΠΊ ΠΏΠΎΡΠ»Π΅Π΄Π½Π΅ΠΉ ΠΊΠΎΠ½ΡΡΠΎΠ»ΡΠ½ΠΎΠΉ ΡΠΎΡΠΊΠ΅ ΠΈ Π²ΠΎΠ·ΠΎΠ±Π½ΠΎΠ²ΠΈΡΡ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΡ ΠΎΡ Π½Π΅Π΅.
ΠΠΎΠ½ΡΡΠΎΠ»ΡΠ½ΡΡ ΡΠΎΡΠΊΡ ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΊΠ»ΡΡΠΈΡΡ, ΡΡΡΠ°Π½ΠΎΠ²ΠΈΠ² ΠΊΠ°ΡΠ°Π»ΠΎΠ³ Π² ΠΎΡΠΊΠ°Π·ΠΎΡΡΡΠΎΠΉΡΠΈΠ²ΠΎΠΉ, Π½Π°Π΄Π΅ΠΆΠ½ΠΎΠΉ ΡΠ°ΠΉΠ»ΠΎΠ²ΠΎΠΉ ΡΠΈΡΡΠ΅ΠΌΠ΅ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, HDFS, S3 ΠΈ Ρ. Π.), Π² ΠΊΠΎΡΠΎΡΠΎΠΉ Π±ΡΠ΄Π΅Ρ ΡΠΎΡ ΡΠ°Π½Π΅Π½Π° ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΊΠΎΠ½ΡΡΠΎΠ»ΡΠ½ΠΎΠΉ ΡΠΎΡΠΊΠΈ. ΠΡΠΎ Π΄Π΅Π»Π°Π΅ΡΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ:
streamingContext.checkpoint(checkpointDirectory)
Π Π½Π°ΡΠ΅ΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅ Π±ΡΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ ΠΏΠΎΠ΄Ρ ΠΎΠ΄, Π° ΠΈΠΌΠ΅Π½Π½ΠΎ, Π΅ΡΠ»ΠΈ checkpointDirectory ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ, ΡΠΎ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡ Π±ΡΠ΄Π΅Ρ Π²ΠΎΡΡΠΎΠ·Π΄Π°Π½ ΠΈΠ· Π΄Π°Π½Π½ΡΡ ΠΊΠΎΠ½ΡΡΠΎΠ»ΡΠ½ΠΎΠΉ ΡΠΎΡΠΊΠΈ. ΠΡΠ»ΠΈ ΠΊΠ°ΡΠ°Π»ΠΎΠ³ Π½Π΅ ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ (Ρ.Π΅. Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ Π² ΠΏΠ΅ΡΠ²ΡΠΉ ΡΠ°Π·), ΡΠΎ Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ ΡΡΠ½ΠΊΡΠΈΡ functionToCreateContext Π΄Π»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ° ΠΈ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ DStreams:
from pyspark.streaming import StreamingContext
context = StreamingContext.getOrCreate(checkpointDirectory, functionToCreateContext)
Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ ΠΎΠ±ΡΠ΅ΠΊΡ DirectStream Ρ ΡΠ΅Π»ΡΡ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΡ ΠΊ ΡΠΎΠΏΠΈΠΊΡ Β«transactionΒ» ΠΏΡΠΈ ΠΏΠΎΠΌΠΎΡΠΈ ΠΌΠ΅ΡΠΎΠ΄Π° 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. Π§ΡΠΎΠ±Ρ ΡΠΎΡ ΡΠ°Π½ΠΈΡΡ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΡ Π°Π³ΡΠ΅Π³Π°ΡΠΈΠΈ Π² ΡΠ°Π±Π»ΠΈΡΡ Π±Π°Π·Ρ Π΄Π°Π½Π½ΡΡ , Π±ΡΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΌΠ΅ΡΠΎΠ΄ write ΠΎΠ±ΡΠ΅ΠΊΡΠ° 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, ΠΊΠΎΡΠΎΡΡΠΉ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°Π΅ΡΡΡ Π² ΡΠ°Π·Π΄Π΅Π»Π΅ Connectivity & security:
Π ΡΠ΅Π»ΡΡ ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΠΎΠΉ ΡΠ²ΡΠ·ΠΊΠΈ Spark ΠΈ Kafka, ΡΠ»Π΅Π΄ΡΠ΅Ρ Π·Π°ΠΏΡΡΠΊΠ°ΡΡ Π΄ΠΆΠΎΠ±Ρ ΡΠ΅ΡΠ΅Π· 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 ΡΠ΅ΠΊΡΠ½Π΄Ρ, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ ΠΌΡ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΠ»ΠΈ ΠΈΠ½ΡΠ΅ΡΠ²Π°Π» ΠΏΠ°ΠΊΠ΅ΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΡΠ°Π²Π½ΡΠΌ 2 ΡΠ΅ΠΊΡΠ½Π΄Π°ΠΌ, ΠΊΠΎΠ³Π΄Π° ΡΠΎΠ·Π΄Π°Π²Π°Π»ΠΈ ΠΎΠ±ΡΠ΅ΠΊΡ StreamingContext:
ΠΠ°Π»Π΅Π΅, Π΄Π΅Π»Π°Π΅ΠΌ Π½Π΅Ρ ΠΈΡΡΡΠΉ Π·Π°ΠΏΡΠΎΡ ΠΊ Π±Π°Π·Π΅ Π΄Π°Π½Π½ΡΡ , ΡΡΠΎΠ±Ρ ΠΏΡΠΎΠ²Π΅ΡΠΈΡΡ Π½Π°Π»ΠΈΡΠΈΠ΅ Π·Π°ΠΏΠΈΡΠ΅ΠΉ Π² ΡΠ°Π±Π»ΠΈΡΠ΅ transaction_flow:
ΠΠ°ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅
Π Π΄Π°Π½Π½ΠΎΠΉ ΡΡΠ°ΡΡΠ΅ Π±ΡΠ» ΡΠ°ΡΡΠΌΠΎΡΡΠ΅Π½ ΠΏΡΠΈΠΌΠ΅Ρ ΠΏΠΎΡΠΎΡΠ½ΠΎΠΉ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ Spark Streaming Π² ΡΠ²ΡΠ·ΠΊΠ΅ Ρ Apache Kafka ΠΈ PostgreSQL. Π‘ ΡΠΎΡΡΠΎΠΌ ΠΎΠ±ΡΠ΅ΠΌΠΎΠ² Π΄Π°Π½Π½ΡΡ ΠΈΠ· ΡΠ°Π·Π»ΠΈΡΠ½ΡΡ ΠΈΡΡΠΎΡΠ½ΠΈΠΊΠΎΠ², ΡΠ»ΠΎΠΆΠ½ΠΎ ΠΏΠ΅ΡΠ΅ΠΎΡΠ΅Π½ΠΈΡΡ ΠΏΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΡΡ ΡΠ΅Π½Π½ΠΎΡΡΡ Spark Streaming Π΄Π»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΠΏΠΎΡΠΎΠΊΠΎΠ²ΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ ΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, Π΄Π΅ΠΉΡΡΠ²ΡΡΡΠΈΡ Π² ΠΌΠ°ΡΡΡΠ°Π±Π΅ ΡΠ΅Π°Π»ΡΠ½ΠΎΠ³ΠΎ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ.
ΠΠΎΠ»Π½ΡΠΉ ΠΈΡΡ
ΠΎΠ΄Π½ΡΠΉ ΠΊΠΎΠ΄ Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π½Π°ΠΉΡΠΈ Π² ΠΌΠΎΠ΅ΠΌ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΈ Π½Π°
Π‘ ΡΠ΄ΠΎΠ²ΠΎΠ»ΡΡΡΠ²ΠΈΠ΅ΠΌ Π³ΠΎΡΠΎΠ² ΠΎΠ±ΡΡΠ΄ΠΈΡΡ Π΄Π°Π½Π½ΡΡ ΡΡΠ°ΡΡΡ, ΠΆΠ΄Ρ ΠΠ°ΡΠΈΡ ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠ΅Π², Π° ΡΠ°ΠΊΠΆΠ΅, Π½Π°Π΄Π΅ΡΡΡ Π½Π° ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΈΠ²Π½ΡΡ ΠΊΡΠΈΡΠΈΠΊΡ Π²ΡΠ΅Ρ Π½Π΅ΡΠ°Π²Π½ΠΎΠ΄ΡΡΠ½ΡΡ ΡΠΈΡΠ°ΡΠ΅Π»Π΅ΠΉ.
ΠΠ΅Π»Π°Ρ ΡΡΠΏΠ΅Ρ ΠΎΠ²!
Ps. ΠΠ΅ΡΠ²ΠΎΠ½Π°ΡΠ°Π»ΡΠ½ΠΎ ΠΏΠ»Π°Π½ΠΈΡΠΎΠ²Π°Π»ΠΎΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π»ΠΎΠΊΠ°Π»ΡΠ½ΡΡ ΠΠ PostgreSQL, Π½ΠΎ ΡΡΠΈΡΡΠ²Π°Ρ ΠΌΠΎΡ Π»ΡΠ±ΠΎΠ²Ρ ΠΊ AWS, Ρ ΡΠ΅ΡΠΈΠ» Π²ΡΠ½Π΅ΡΡΠΈ Π±Π°Π·Ρ Π΄Π°Π½Π½ΡΡ
Π² ΠΎΠ±Π»Π°ΠΊΠΎ. Π ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΉ ΡΡΠ°ΡΡΠ΅ ΠΏΠΎ ΡΡΠΎΠΉ ΡΠ΅ΠΌΠ΅ Ρ ΠΏΠΎΠΊΠ°ΠΆΡ, ΠΊΠ°ΠΊ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°ΡΡ ΡΠ΅Π»ΠΈΠΊΠΎΠΌ Π²ΡΡΠ΅ΠΎΠΏΠΈΡΠ°Π½Π½ΡΡ ΡΠΈΡΡΠ΅ΠΌΡ Π² AWS ΠΏΡΠΈ ΠΏΠΎΠΌΠΎΡΠΈ AWS Kinesis ΠΈ AWS EMR. Π‘Π»Π΅Π΄ΠΈΡΠ΅ Π·Π° Π½ΠΎΠ²ΠΎΡΡΡΠΌΠΈ!
ΠΡΡΠΎΡΠ½ΠΈΠΊ: habr.com