ΠΠ΄ΡΠ°Π²ΠΎ, Π₯Π°Π±Ρ! ΠΠ΅Π½Π΅ΡΠΊΠ° ΡΠ΅ ΠΈΠ·Π³ΡΠ°Π΄ΠΈΠΌΠ΅ ΡΠΈΡΡΠ΅ΠΌ ΠΊΠΎΡ ΡΠ΅ Π³ΠΈ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠ²Π° ΠΏΡΠ΅Π½ΠΎΡΠΈΡΠ΅ Π½Π° ΠΏΠΎΡΠ°ΠΊΠΈΡΠ΅ Π½Π° 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
ΠΠ° Π³ΠΈ ΠΏΡΠΎΠΏΡΡΡΠΈΠΌΠ΅ ΠΌΠΎΠΌΠ΅Π½ΡΠΈΡΠ΅ Π½Π° ΡΠ΅ΡΡΠΈΡΠ°ΡΠ΅ Π½Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΠΎΡ ΠΈ ΠΏΠΎΡΡΠΎΡΡΠ²Π°ΡΠΎΡ Π·Π° Π½ΠΎΠ²ΠΎΡΠΎΠ·Π΄Π°Π΄Π΅Π½Π°ΡΠ° ΡΠ΅ΠΌΠ°. ΠΠΎΠ²Π΅ΡΠ΅ Π΄Π΅ΡΠ°Π»ΠΈ Π·Π° ΡΠΎΠ° ΠΊΠ°ΠΊΠΎ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΡΠ΅ΡΡΠΈΡΠ°ΡΠ΅ ΠΈΡΠΏΡΠ°ΡΠ°ΡΠ΅ ΠΈ ΠΏΡΠΈΠΌΠ°ΡΠ΅ ΠΏΠΎΡΠ°ΠΊΠΈ ΡΠ΅ Π½Π°ΠΏΠΈΡΠ°Π½ΠΈ Π²ΠΎ ΠΎΡΠΈΡΠΈΡΠ°Π»Π½Π°ΡΠ° Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡΠ° -
ΠΠΈΡΡΠ²Π°ΡΠ΅ Π½Π° ΠΏΡΠΎΠ΄ΡΡΠ΅Π½ΡΠΎΡ
ΠΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΠΎΡ ΡΠ΅ Π³Π΅Π½Π΅ΡΠΈΡΠ° ΡΠ»ΡΡΠ°ΡΠ½ΠΈ ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ - 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 Π·Π° ΠΊΡΠ΅ΠΈΡΠ°ΡΠ΅ ΡΡΡΠΈΠΌΠΈΠ½Π³ ΠΈ Π°ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΠΈ Π²ΠΎ ΡΠ΅Π°Π»Π½ΠΎ Π²ΡΠ΅ΠΌΠ΅.
Π¦Π΅Π»ΠΎΡΠ½ΠΈΠΎΡ ΠΈΠ·Π²ΠΎΡΠ΅Π½ ΠΊΠΎΠ΄ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π³ΠΎ Π½Π°ΡΠ΄Π΅ΡΠ΅ Π²ΠΎ ΠΌΠΎΠ΅ΡΠΎ ΡΠΊΠ»Π°Π΄ΠΈΡΡΠ΅ Π½Π°
Π‘ΡΠ΅ΡΠ΅Π½ ΡΡΠΌ ΡΡΠΎ ΡΠ°Π·Π³ΠΎΠ²Π°ΡΠ°ΠΌ Π·Π° ΠΎΠ²Π°Π° ΡΡΠ°ΡΠΈΡΠ°, ΡΠΎ Π½Π΅ΡΡΠΏΠ΅Π½ΠΈΠ΅ Π³ΠΈ ΠΎΡΠ΅ΠΊΡΠ²Π°ΠΌ Π²Π°ΡΠΈΡΠ΅ ΠΊΠΎΠΌΠ΅Π½ΡΠ°ΡΠΈ, Π° ΠΈΡΡΠΎ ΡΠ°ΠΊΠ° ΡΠ΅ Π½Π°Π΄Π΅Π²Π°ΠΌ Π½Π° ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΈΠ²Π½Π° ΠΊΡΠΈΡΠΈΠΊΠ° ΠΎΠ΄ ΡΠΈΡΠ΅ Π³ΡΠΈΠΆΠ»ΠΈΠ²ΠΈ ΡΠΈΡΠ°ΡΠ΅Π»ΠΈ.
ΠΠΈ ΠΏΠΎΡΠ°ΠΊΡΠ²Π°ΠΌ ΡΡΠΏΠ΅Ρ !
Π.Ρ. ΠΡΠ²ΠΈΡΠ½ΠΎ Π±Π΅ΡΠ΅ ΠΏΠ»Π°Π½ΠΈΡΠ°Π½ΠΎ Π΄Π° ΡΠ΅ ΠΊΠΎΡΠΈΡΡΠΈ Π»ΠΎΠΊΠ°Π»Π½Π° Π±Π°Π·Π° Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ PostgreSQL, Π½ΠΎ ΡΠΎ ΠΎΠ³Π»Π΅Π΄ Π½Π° ΠΌΠΎΡΠ°ΡΠ° ΡΡΠ±ΠΎΠ² ΠΊΠΎΠ½ AWS, ΡΠ΅ΡΠΈΠ² Π΄Π° ΡΠ° ΠΏΡΠ΅ΠΌΠ΅ΡΡΠ°ΠΌ Π±Π°Π·Π°ΡΠ° Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ Π²ΠΎ ΠΎΠ±Π»Π°ΠΊΠΎΡ. ΠΠΎ ΡΠ»Π΅Π΄Π½Π°ΡΠ° ΡΡΠ°ΡΠΈΡΠ° Π½Π° ΠΎΠ²Π°Π° ΡΠ΅ΠΌΠ°, ΡΠ΅ ΠΏΠΎΠΊΠ°ΠΆΠ°ΠΌ ΠΊΠ°ΠΊΠΎ Π΄Π° Π³ΠΎ ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠΈΡΠ°ΠΌ ΡΠ΅Π»ΠΈΠΎΡ ΡΠΈΡΡΠ΅ΠΌ ΠΎΠΏΠΈΡΠ°Π½ ΠΏΠΎΠ³ΠΎΡΠ΅ Π²ΠΎ AWS ΠΊΠΎΡΠΈΡΡΠ΅ΡΡΠΈ AWS Kinesis ΠΈ AWS EMR. Π‘Π»Π΅Π΄Π΅ΡΠ΅ Π³ΠΈ Π²Π΅ΡΡΠΈΡΠ΅!
ΠΠ·Π²ΠΎΡ: www.habr.com