Apache Kafka αž“αž·αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž‘αž·αž“αŸ’αž“αž“αŸαž™αžŸαŸ’αž‘αŸ’αžšαžΈαž˜αž‡αžΆαž˜αž½αž™ Spark Streaming

αžŸαž½αžŸαŸ’αžαžΈ αž αžΆαž”! αžαŸ’αž„αŸƒαž“αŸαŸ‡αž™αžΎαž„αž“αžΉαž„αž”αž„αŸ’αž€αžΎαžαž”αŸ’αžšαž–αŸαž“αŸ’αž’αž˜αž½αž™αžŠαŸ‚αž›αž“αžΉαž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŸαŸ’αž‘αŸ’αžšαžΈαž˜αžŸαžΆαžš Apache Kafka αžŠαŸ„αž™αž”αŸ’αžšαžΎ Spark Streaming αž αžΎαž™αžŸαžšαžŸαŸαžšαž›αž‘αŸ’αž’αž•αž›αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž‘αŸ…αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αž–αž–αž€ AWS RDS αŸ”

αž…αžΌαžšαž™αžΎαž„αžŸαŸ’αžšαž˜αŸƒαžαžΆαžŸαŸ’αžαžΆαž”αŸαž“αž₯αžŽαž‘αžΆαž“αž‡αžΆαž€αŸ‹αž›αžΆαž€αŸ‹αž˜αž½αž™αž€αŸ†αžŽαžαŸ‹αž±αŸ’αž™αž™αžΎαž„αž“αžΌαžœαž—αžΆαžšαž€αž·αž…αŸ’αž…αž“αŸƒαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαž…αžΌαž› "αž—αŸ’αž›αžΆαž˜αŸ—" αž“αŸ…αž‘αžΌαž‘αžΆαŸ†αž„αžŸαžΆαžαžΆαž‘αžΆαŸ†αž„αž’αžŸαŸ‹αžšαž”αžŸαŸ‹αžœαžΆαŸ” αž“αŸαŸ‡αž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αŸ’αžœαžΎαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž‚αŸ„αž›αž”αŸ†αžŽαž„αž“αŸƒαž€αžΆαžšαž‚αžŽαž“αžΆαž—αŸ’αž›αžΆαž˜αŸ—αž“αžΌαžœαž‘αžΈαžαžΆαŸ†αž„αžšαžΌαž”αž·αž™αž”αŸαžŽαŸ’αžŽαž”αžΎαž€αž…αŸ†αž αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžšαžαž“αžΆαž‚αžΆαžš αžŠαŸ‚αž“αž€αŸ†αžŽαžαŸ‹ αž¬αž›αž‘αŸ’αž’αž•αž›αž αž·αžšαž‰αŸ’αž‰αžœαžαŸ’αžαž»αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαŸ”αž›αŸ”

αžαžΎαž’αŸ’αžœαžΎαžŠαžΌαž…αž˜αŸ’αžαŸαž…αžŠαžΎαž˜αŸ’αž”αžΈαž’αž“αž»αžœαžαŸ’αžαž€αžšαžŽαžΈαž“αŸαŸ‡αžŠαŸ„αž™αž˜αž·αž“αž”αŸ’αžšαžΎαžœαŸαž‘αž˜αž“αŸ’αžαž“αž·αž„αž’αž€αŸ’αžαžšαžΆαžœαž·αžšαž»αž‘αŸ’αž’ - αž’αžΆαž“αž“αŸ…αž€αŸ’αžšαŸ„αž˜αž€αžΆαžšαž€αžΆαžαŸ‹! αž‘αŸ…!

Apache Kafka αž“αž·αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž‘αž·αž“αŸ’αž“αž“αŸαž™αžŸαŸ’αž‘αŸ’αžšαžΈαž˜αž‡αžΆαž˜αž½αž™ Spark Streaming
(αž”αŸ’αžšαž—αž–αžšαžΌαž”αž—αžΆαž–)

αžŸαŸαž…αž€αŸ’αžαžΈαžŽαŸ‚αž“αžΆαŸ†

αž‡αžΆαž€αžΆαžšαž–αž·αžαžŽαžΆαžŸαŸ‹ αž€αžΆαžšαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž‘αž·αž“αŸ’αž“αž“αŸαž™αž˜αž½αž™αž…αŸ†αž“αž½αž“αž’αŸ†αž€αŸ’αž“αž»αž„αž–αŸαž›αžœαŸαž›αžΆαž–αž·αžαž•αŸ’αžαž›αŸ‹αž“αžΌαžœαž±αž€αžΆαžŸαž…αŸ’αžšαžΎαž“αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž€αŸ’αž“αž»αž„αž”αŸ’αžšαž–αŸαž“αŸ’αž’αž‘αŸ†αž“αžΎαž”αŸ” αž€αžΆαžšαžšαž½αž˜αž”αž‰αŸ’αž…αžΌαž›αž‚αŸ’αž“αžΆαžŠαŸαž–αŸαž‰αž“αž·αž™αž˜αž”αŸ†αž•αž»αžαž˜αž½αž™αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž“αŸαŸ‡αž‚αžΊαž€αžΆαžšαž—αŸ’αž‡αžΆαž”αŸ‹αž‚αŸ’αž“αžΆαž“αŸƒ Apache Kafka αž“αž·αž„ Spark Streaming αžŠαŸ‚αž› Kafka αž”αž„αŸ’αž€αžΎαžαžŸαŸ’αž‘αŸ’αžšαžΈαž˜αž“αŸƒαž€αž‰αŸ’αž…αž”αŸ‹αžŸαžΆαžšαž…αžΌαž› αž αžΎαž™ Spark Streaming αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž€αž‰αŸ’αž…αž”αŸ‹αž–αŸαžαŸŒαž˜αžΆαž“αž‘αžΆαŸ†αž„αž“αŸαŸ‡αž“αŸ…αž…αž“αŸ’αž›αŸ„αŸ‡αž–αŸαž›αž‡αžΆαž€αŸ‹αž›αžΆαž€αŸ‹αž˜αž½αž™αŸ”

αžŠαžΎαž˜αŸ’αž”αžΈαž”αž„αŸ’αž€αžΎαž“αž—αžΆαž–αž’αžαŸ‹αž’αŸ’αž˜αžαŸ‹αž“αŸƒαž€αŸ†αž αž»αžŸαž“αŸƒαž€αž˜αŸ’αž˜αžœαž·αž’αžΈ αž™αžΎαž„αž“αžΉαž„αž”αŸ’αžšαžΎαž…αŸ†αžŽαž»αž…αžαŸ’αžšαž½αžαž–αž·αž“αž·αžαŸ’αž™αŸ” αž‡αžΆαž˜αž½αž™αž“αžΉαž„αž™αž“αŸ’αžαž€αžΆαžšαž“αŸαŸ‡ αž“αŸ…αž–αŸαž›αžŠαŸ‚αž›αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“ Spark Streaming αžαŸ’αžšαžΌαžœαž€αžΆαžšαžŸαž„αŸ’αž‚αŸ’αžšαŸ„αŸ‡αž‘αž·αž“αŸ’αž“αž“αŸαž™αžŠαŸ‚αž›αž”αžΆαžαŸ‹αž“αŸ„αŸ‡ αžœαžΆαž‚αŸ’αžšαžΆαž“αŸ‹αžαŸ‚αžαŸ’αžšαžΌαžœαžαŸ’αžšαž›αž”αŸ‹αž‘αŸ…αž€αž“αŸ’αž›αŸ‚αž„αžαŸ’αžšαž½αžαž–αž·αž“αž·αžαŸ’αž™αž…αž»αž„αž€αŸ’αžšαŸ„αž™ αž αžΎαž™αž”αž“αŸ’αžαž€αžΆαžšαž‚αžŽαž“αžΆαž‘αžΎαž„αžœαž·αž‰αž–αžΈαž‘αžΈαž“αŸ„αŸ‡αŸ”

αžŸαŸ’αžαžΆαž”αžαŸ’αž™αž€αž˜αŸ’αž˜αž“αŸƒαž”αŸ’αžšαž–αŸαž“αŸ’αž’αž’αž—αž·αžœαžŒαŸ’αžαž“αŸ

Apache Kafka αž“αž·αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž‘αž·αž“αŸ’αž“αž“αŸαž™αžŸαŸ’αž‘αŸ’αžšαžΈαž˜αž‡αžΆαž˜αž½αž™ Spark Streaming

αžŸαž˜αžΆαžŸαž’αžΆαžαž»αžŠαŸ‚αž›αž”αžΆαž“αž”αŸ’αžšαžΎαŸ–

  • Apache Kafka αž‚αžΊβ€‹αž‡αžΆβ€‹αž”αŸ’αžšαž–αŸαž“αŸ’αž’β€‹αž•αŸ’αž‰αžΎβ€‹αžŸαžΆαžšβ€‹αžŠαŸ‚αž›β€‹αž”αžΆαž“β€‹αž…αŸ‚αž€β€‹αž…αžΆαž™β€‹αž•αŸ’αžŸαžΆαž™β€‹αž‡αžΆαžœαŸ” αžŸαŸαž€αŸ’αžαž·αžŸαž˜αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αžŸαžΆαžšαž€αŸ’αžšαŸ…αž”αžŽαŸ’αžαžΆαž‰ αž“αž·αž„αž’αŸŠαžΈαž“αž’αžΊαžŽαž·αžαŸ” αžŠαžΎαž˜αŸ’αž”αžΈαž‘αž”αŸ‹αžŸαŸ’αž€αžΆαžαŸ‹αž€αžΆαžšαž”αžΆαžαŸ‹αž”αž„αŸ‹αž‘αž·αž“αŸ’αž“αž“αŸαž™ សអរ Kafka αžαŸ’αžšαžΌαžœαž”αžΆαž“αžšαž€αŸ’αžŸαžΆαž‘αž»αž€αž“αŸ…αž›αžΎαžαžΆαžŸ αž“αž·αž„αž…αž˜αŸ’αž›αž„αž“αŸ…αž€αŸ’αž“αž»αž„αž…αž„αŸ’αž€αŸ„αž˜αŸ” αž”αŸ’αžšαž–αŸαž“αŸ’αž’ Kafka αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž„αŸ’αž€αžΎαžαž‘αžΎαž„αž“αŸ…αž›αžΎαž€αŸ†αž–αžΌαž›αž“αŸƒαžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αž’αŸ’αžœαžΎαžŸαž˜αž€αžΆαž›αž€αž˜αŸ’αž˜ ZooKeeper αŸ”
  • αžŸαŸ’αž‘αŸ’αžšαžΈαž˜ Apache Spark - αžŸαž˜αžΆαžŸαž’αžΆαžαž» Spark αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž‘αž·αž“αŸ’αž“αž“αŸαž™αžŸαŸ’αž‘αŸ’αžšαžΈαž˜αŸ” αž˜αŸ‰αžΌαžŒαž»αž› Spark Streaming αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž„αŸ’αž€αžΎαžαž‘αžΎαž„αžŠαŸ„αž™αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αžŸαŸ’αžαžΆαž”αžαŸ’αž™αž€αž˜αŸ’αž˜αžαŸ’αž“αžΆαžαžαžΌαž…αžŠαŸ‚αž›αžŸαŸ’αž‘αŸ’αžšαžΈαž˜αž‘αž·αž“αŸ’αž“αž“αŸαž™αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž€αžŸαŸ’αžšαžΆαž™αžαžΆαž‡αžΆαž”αžŽαŸ’αžαž»αŸ†αž”αž“αŸ’αžαž“αŸƒαž€αž‰αŸ’αž…αž”αŸ‹αž‘αž·αž“αŸ’αž“αž“αŸαž™αžαžΌαž…αŸ—αŸ” Spark Streaming αž™αž€αž‘αž·αž“αŸ’αž“αž“αŸαž™αž–αžΈαž”αŸ’αžšαž—αž–αž•αŸ’αžŸαŸαž„αŸ—αž‚αŸ’αž“αžΆ αž αžΎαž™αž”αž‰αŸ’αž…αžΌαž›αžœαžΆαž‘αŸ…αž€αŸ’αž“αž»αž„αž€αž‰αŸ’αž…αž”αŸ‹αžαžΌαž…αŸ—αŸ” αž€αž‰αŸ’αž…αž”αŸ‹αžαŸ’αž˜αžΈαžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž„αŸ’αž€αžΎαžαž“αŸ…αž…αž“αŸ’αž›αŸ„αŸ‡αž–αŸαž›αž‘αŸ€αž„αž‘αžΆαžαŸ‹αŸ” αž“αŸ…αžŠαžΎαž˜αž“αŸƒαž…αž“αŸ’αž›αŸ„αŸ‡αž–αŸαž›αž“αžΈαž˜αž½αž™αŸ— αž€αž‰αŸ’αž…αž”αŸ‹αž–αŸαžαŸŒαž˜αžΆαž“αžαŸ’αž˜αžΈαžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž„αŸ’αž€αžΎαž αž αžΎαž™αž‘αž·αž“αŸ’αž“αž“αŸαž™αžŽαžΆαž˜αž½αž™αžŠαŸ‚αž›αž‘αž‘αž½αž›αž”αžΆαž“αž€αŸ’αž“αž»αž„αž…αž“αŸ’αž›αŸ„αŸ‡αž–αŸαž›αž“αŸ„αŸ‡αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž‰αŸ’αž…αžΌαž›αž€αŸ’αž“αž»αž„αž€αž‰αŸ’αž…αž”αŸ‹αž–αŸαžαŸŒαž˜αžΆαž“αŸ” αž“αŸ…αž…αž»αž„αž”αž‰αŸ’αž…αž”αŸ‹αž“αŸƒαž…αž“αŸ’αž›αŸ„αŸ‡αž–αŸαž› αž€αžΆαžšαž›αžΌαžαž›αžΆαžŸαŸ‹αž€αž‰αŸ’αž…αž”αŸ‹αž–αŸαžαŸŒαž˜αžΆαž“αžˆαž”αŸ‹αŸ” αž‘αŸ†αž αŸ†αž“αŸƒαž…αž“αŸ’αž›αŸ„αŸ‡αž–αŸαž›αžαŸ’αžšαžΌαžœαž”αžΆαž“αž€αŸ†αžŽαžαŸ‹αžŠαŸ„αž™αž”αŸ‰αžΆαžšαŸ‰αžΆαž˜αŸ‰αŸ‚αžαŸ’αžšαžŠαŸ‚αž›αž αŸ…αžαžΆαž…αž“αŸ’αž›αŸ„αŸ‡αž–αŸαž›αž”αžΆαž…αŸ‹;
  • αž€αž˜αŸ’αž˜αžœαž·αž’αžΈ Apache Spark SQL - αžšαž½αž˜αž”αž‰αŸ’αž…αžΌαž›αž‚αŸ’αž“αžΆαž“αžΌαžœαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž‘αŸ†αž“αžΆαž€αŸ‹αž‘αŸ†αž“αž„αž‡αžΆαž˜αž½αž™αž“αžΉαž„αž€αžΆαžšαžŸαžšαžŸαŸαžšαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž˜αž»αžαž„αžΆαžš Spark αŸ” αž‘αž·αž“αŸ’αž“αž“αŸαž™αžŠαŸ‚αž›αž˜αžΆαž“αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž˜αžΆαž“αž“αŸαž™αžαžΆαž‘αž·αž“αŸ’αž“αž“αŸαž™αžŠαŸ‚αž›αž˜αžΆαž“αž‚αŸ’αžšαŸ„αž„αž€αžΆαžšαžŽαŸ αž–αŸ„αž›αž‚αžΊαžŸαŸ†αžŽαž»αŸ†αžœαžΆαž›αžαŸ‚αž˜αž½αž™αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αŸ†αžŽαžαŸ‹αžαŸ’αžšαžΆαž‘αžΆαŸ†αž„αž’αžŸαŸ‹αŸ” Spark SQL αž‚αžΆαŸ†αž‘αŸ’αžšαž€αžΆαžšαž”αž‰αŸ’αž…αžΌαž›αž–αžΈαž”αŸ’αžšαž—αž–αž‘αž·αž“αŸ’αž“αž“αŸαž™αžŠαŸ‚αž›αž˜αžΆαž“αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž•αŸ’αžŸαŸαž„αŸ—αž‚αŸ’αž“αžΆ αž αžΎαž™αžŠαŸ„αž™αžŸαžΆαžšαž—αžΆαž–αž’αžΆαž…αžšαž€αž”αžΆαž“αž“αŸƒαž–αŸαžαŸŒαž˜αžΆαž“αž‚αŸ’αžšαŸ„αž„αž€αžΆαžšαžŽαŸ αžœαžΆαž’αžΆαž…αž‘αžΆαž‰αž™αž€αž”αžΆαž“αž™αŸ‰αžΆαž„αž˜αžΆαž“αž”αŸ’αžšαžŸαž·αž‘αŸ’αž’αž—αžΆαž–αžαŸ’αžšαžΉαž˜αžαŸ‚αžœαžΆαž›αžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž€αžΆαžšαž“αŸƒαž€αŸ†αžŽαžαŸ‹αžαŸ’αžšαžΆαž”αŸ‰αž»αžŽαŸ’αžŽαŸ„αŸ‡ αž αžΎαž™αž€αŸαž•αŸ’αžαž›αŸ‹αž“αžΌαžœ DataFrame APIs αž•αž„αžŠαŸ‚αžšαŸ”
  • AWS RDS αž‚αžΊαž‡αžΆαž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αž‘αŸ†αž“αžΆαž€αŸ‹αž‘αŸ†αž“αž„αžŠαŸ‚αž›αž˜αžΆαž“αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž›αžΎαž–αž–αž€αžŠαŸ‚αž›αž˜αžΆαž“αžαŸ†αž›αŸƒαžαŸ„αž€ αžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αž‚αŸαž αž‘αŸ†αž–αŸαžšαžŠαŸ‚αž›αžŸαž˜αŸ’αžšαž½αž›αž€αžΆαžšαžŠαŸ†αž‘αžΎαž„ αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžš αž“αž·αž„αž€αžΆαžšαž’αŸ’αžœαžΎαž˜αžΆαžαŸ’αžšαžŠαŸ’αž‹αžΆαž“ αž αžΎαž™αžαŸ’αžšαžΌαžœαž”αžΆαž“αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„αžŠαŸ„αž™αž•αŸ’αž‘αžΆαž›αŸ‹αžŠαŸ„αž™ 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

αžαŸ„αŸ‡αž”αž„αŸ’αž€αžΎαžαž”αŸ’αžšαž’αžΆαž“αž”αž‘αžαŸ’αž˜αžΈαž˜αž½αž™αžŠαŸ‚αž›αž˜αžΆαž“αžˆαŸ’αž˜αŸ„αŸ‡αžαžΆ αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαŸ–

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

αž…αžΌαžšαž”αŸ’αžšαžΆαž€αžŠαžαžΆαž”αŸ’αžšαž’αžΆαž“αž”αž‘αžŠαŸ‚αž›αž˜αžΆαž“αž…αŸ†αž“αž½αž“αž—αžΆαž‚αžαžΆαžŸαžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž€αžΆαžš αž“αž·αž„αž€αžΆαžšαž…αž˜αŸ’αž›αž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž„αŸ’αž€αžΎαžαž‘αžΎαž„αŸ–

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

Apache Kafka αž“αž·αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž‘αž·αž“αŸ’αž“αž“αŸαž™αžŸαŸ’αž‘αŸ’αžšαžΈαž˜αž‡αžΆαž˜αž½αž™ Spark Streaming

αž…αžΌαžšαž™αžΎαž„αž“αžΉαž€αž–αŸαž›αžœαŸαž›αžΆαž“αŸƒαž€αžΆαžšαžŸαžΆαž€αž›αŸ’αž”αž„αž•αž›αž·αžαž€αžš αž“αž·αž„αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž”αŸ’αžšαž’αžΆαž“αž”αž‘αžŠαŸ‚αž›αž”αžΆαž“αž”αž„αŸ’αž€αžΎαžαžαŸ’αž˜αžΈαŸ” αž–αŸαžαŸŒαž˜αžΆαž“αž›αž˜αŸ’αž’αž·αžαž”αž“αŸ’αžαŸ‚αž˜αž’αŸ†αž–αžΈαžšαž”αŸ€αž”αžŠαŸ‚αž›αž’αŸ’αž“αž€αž’αžΆαž…αžŸαžΆαž€αž›αŸ’αž”αž„αž€αžΆαžšαž•αŸ’αž‰αžΎ αž“αž·αž„αž‘αž‘αž½αž›αžŸαžΆαžšαžαŸ’αžšαžΌαžœαž”αžΆαž“αžŸαžšαžŸαŸαžšαž“αŸ…αž€αŸ’αž“αž»αž„αž―αž€αžŸαžΆαžšαž•αŸ’αž›αžΌαžœαž€αžΆαžš - αž•αŸ’αž‰αžΎαžŸαžΆαžšαž˜αž½αž™αž…αŸ†αž“αž½αž“. αž‡αžΆαž€αžΆαžšαž”αŸ’αžšαžŸαžΎαžšαžŽαžΆαžŸαŸ‹, αž™αžΎαž„αž”αž“αŸ’αžαž‘αŸ…αž€αžΆαžšαžŸαžšαžŸαŸαžšαž’αŸ’αž“αž€αž•αž›αž·αžαž“αŸ…αž€αŸ’αž“αž»αž„ 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()

αž“αŸ…αž–αŸαž›αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŸαŸ’αž‚αŸ’αžšαžΈαž” αž™αžΎαž„αž‘αž‘αž½αž›αž”αžΆαž“αžŸαžΆαžšαžŠαžΌαž…αžαžΆαž„αž€αŸ’αžšαŸ„αž˜αž“αŸ…αž€αŸ’αž“αž»αž„αžŸαŸ’αžαžΆαž“αžΈαž™αŸ–

Apache Kafka αž“αž·αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž‘αž·αž“αŸ’αž“αž“αŸαž™αžŸαŸ’αž‘αŸ’αžšαžΈαž˜αž‡αžΆαž˜αž½αž™ Spark Streaming

αž“αŸαŸ‡αž˜αžΆαž“αž“αŸαž™αžαžΆαž’αŸ’αžœαžΈαž‚αŸ’αžšαž”αŸ‹αž™αŸ‰αžΆαž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŠαžΌαž…αžŠαŸ‚αž›αž™αžΎαž„αž…αž„αŸ‹αž”αžΆαž“ - αž’αŸ’αž“αž€αž•αž›αž·αžαž”αž„αŸ’αž€αžΎαž αž“αž·αž„αž•αŸ’αž‰αžΎαžŸαžΆαžšαž‘αŸ…αž€αžΆαž“αŸ‹αž”αŸ’αžšαž’αžΆαž“αž”αž‘αžŠαŸ‚αž›αž™αžΎαž„αžαŸ’αžšαžΌαžœαž€αžΆαžšαŸ”
αž‡αŸ†αž αžΆαž“αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž‚αžΊαžαŸ’αžšαžΌαžœαžŠαŸ†αž‘αžΎαž„ 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 -> αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™ -> αž”αž„αŸ’αž€αžΎαžαž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αŸ–
Apache Kafka αž“αž·αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž‘αž·αž“αŸ’αž“αž“αŸαž™αžŸαŸ’αž‘αŸ’αžšαžΈαž˜αž‡αžΆαž˜αž½αž™ Spark Streaming

αž‡αŸ’αžšαžΎαžŸαžšαžΎαžŸ PostgreSQL αž αžΎαž™αž…αž»αž… Next:
Apache Kafka αž“αž·αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž‘αž·αž“αŸ’αž“αž“αŸαž™αžŸαŸ’αž‘αŸ’αžšαžΈαž˜αž‡αžΆαž˜αž½αž™ Spark Streaming

αžŠαŸ„αž™αžŸαžΆαžšαžαŸ‚ αž§αž‘αžΆαž αžšαžŽαŸαž“αŸαŸ‡αž‚αžΊαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž‚αŸ„αž›αž”αŸ†αžŽαž„αž’αž”αŸ‹αžšαŸ†αžαŸ‚αž”αŸ‰αž»αžŽαŸ’αžŽαŸ„αŸ‡ αž™αžΎαž„αž“αžΉαž„αž”αŸ’αžšαžΎαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαž₯αžαž‚αž·αžαžαŸ’αž›αŸƒ β€œαž™αŸ‰αžΆαž„αž αŸ„αž…αžŽαžΆαžŸαŸ‹β€ (αžαŸ’αž“αžΆαž€αŸ‹αž₯αžαž‚αž·αžαžαŸ’αž›αŸƒ)αŸ–
Apache Kafka αž“αž·αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž‘αž·αž“αŸ’αž“αž“αŸαž™αžŸαŸ’αž‘αŸ’αžšαžΈαž˜αž‡αžΆαž˜αž½αž™ Spark Streaming

αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž˜αž€ αž™αžΎαž„αžŠαžΆαž€αŸ‹αžŸαž‰αŸ’αž‰αžΆαž’αžΈαž€αž“αŸ…αž€αŸ’αž“αž»αž„αž”αŸ’αž›αž»αž€ Free Tier αž αžΎαž™αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαž“αŸ„αŸ‡ αž™αžΎαž„αž“αžΉαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αž•αŸ’αžαž›αŸ‹αž‡αžΌαž“αžŠαŸ„αž™αžŸαŸ’αžœαŸαž™αž”αŸ’αžšαžœαžαŸ’αžαž·αž“αžΌαžœαž§αž‘αžΆαž αžšαžŽαŸαž“αŸƒαžαŸ’αž“αžΆαž€αŸ‹ t2.micro - αž‘αŸ„αŸ‡αž”αžΈαž‡αžΆαžαŸ’αžŸαŸ„αž™αž€αŸαžŠαŸ„αž™ αžœαžΆαž‚αžΊαž₯αžαž‚αž·αžαžαŸ’αž›αŸƒ αž“αž·αž„αžŸαž˜αžšαž˜αŸ’αž™αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αž·αž…αŸ’αž…αž€αžΆαžšαžšαž”αžŸαŸ‹αž™αžΎαž„αŸ–
Apache Kafka αž“αž·αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž‘αž·αž“αŸ’αž“αž“αŸαž™αžŸαŸ’αž‘αŸ’αžšαžΈαž˜αž‡αžΆαž˜αž½αž™ Spark Streaming

αž”αž“αŸ’αž‘αžΆαž”αŸ‹β€‹αž˜αž€β€‹αžšαžΏαž„β€‹αžŸαŸ†αžαžΆαž“αŸ‹β€‹αžαŸ’αž›αžΆαŸ†αž„β€‹αžŽαžΆαžŸαŸ‹αŸ– αžˆαŸ’αž˜αŸ„αŸ‡β€‹αž“αŸƒβ€‹αž§αž‘αžΆαž αžšαžŽαŸβ€‹αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“β€‹αž‘αž·αž“αŸ’αž“αž“αŸαž™ αžˆαŸ’αž˜αŸ„αŸ‡β€‹αž’αŸ’αž“αž€β€‹αž”αŸ’αžšαžΎβ€‹αž˜αŸ αž“αž·αž„β€‹αž–αžΆαž€αŸ’αž™β€‹αžŸαž˜αŸ’αž„αžΆαžαŸ‹β€‹αžšαž”αžŸαŸ‹β€‹αž‚αžΆαžαŸ‹αŸ” αžαŸ„αŸ‡αžŠαžΆαž€αŸ‹αžˆαŸ’αž˜αŸ„αŸ‡αž§αž‘αžΆαž αžšαžŽαŸαŸ– myHabrTest αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž˜αŸαŸ– αž αžΆαž”αŸ‹, αž–αžΆαž€αŸ’αž™αžŸαž˜αŸ’αž„αžΆαžαŸ‹αŸ– habr12345 αž αžΎαž™αž…αž»αž…αž›αžΎαž”αŸŠαžΌαžαž»αž„αž”αž“αŸ’αž‘αžΆαž”αŸ‹αŸ–
Apache Kafka αž“αž·αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž‘αž·αž“αŸ’αž“αž“αŸαž™αžŸαŸ’αž‘αŸ’αžšαžΈαž˜αž‡αžΆαž˜αž½αž™ Spark Streaming

αž“αŸ…αž‘αŸ†αž–αŸαžšαž”αž“αŸ’αž‘αžΆαž”αŸ‹αž˜αžΆαž“αž”αŸ‰αžΆαžšαŸ‰αžΆαž˜αŸ‰αŸ‚αžαŸ’αžšαžŠαŸ‚αž›αž‘αž‘αž½αž›αžαž»αžŸαžαŸ’αžšαžΌαžœαž…αŸ†αž–αŸ„αŸ‡αž—αžΆαž–αž„αžΆαž™αžŸαŸ’αžšαž½αž›αž“αŸƒαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αžšαž”αžŸαŸ‹αž™αžΎαž„αž–αžΈαžαžΆαž„αž€αŸ’αžšαŸ… (αž›αž‘αŸ’αž’αž—αžΆαž–αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αžŸαžΆαž’αžΆαžšαžŽαŸˆ) αž“αž·αž„αž›αž‘αŸ’αž’αž—αžΆαž–αž…αŸ’αžšαž€αŸ–

Apache Kafka αž“αž·αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž‘αž·αž“αŸ’αž“αž“αŸαž™αžŸαŸ’αž‘αŸ’αžšαžΈαž˜αž‡αžΆαž˜αž½αž™ Spark Streaming

αžαŸ„αŸ‡αž”αž„αŸ’αž€αžΎαžαž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžαŸ’αž˜αžΈαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αŸ’αžšαž»αž˜αžŸαž»αžœαžαŸ’αžαž·αž—αžΆαž– VPC αžŠαŸ‚αž›αž“αžΉαž„αž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αž…αžΌαž›αž”αŸ’αžšαžΎαžαžΆαž„αž€αŸ’αžšαŸ…αž‘αŸ…αž€αžΆαž“αŸ‹αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αžšαž”αžŸαŸ‹αž™αžΎαž„αžαžΆαž˜αžšαž™αŸˆαž…αŸ’αžšαž€ 5432 (PostgreSQL)αŸ”
αžαŸ„αŸ‡αž‘αŸ…αž€αž»αž„αžŸαžΌαž› AWS αž“αŸ…αž€αŸ’αž“αž»αž„αž”αž„αŸ’αž’αž½αž…αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžšαž»αž€αžšαž€αžŠαžΆαž…αŸ‹αžŠαŸ„αž™αž‘αŸ‚αž€αž‘αŸ…αž€αžΆαž“αŸ‹ VPC Dashboard -> αž€αŸ’αžšαž»αž˜αžŸαž»αžœαžαŸ’αžαž·αž—αžΆαž– -> αž”αž„αŸ’αž€αžΎαžαž•αŸ’αž“αŸ‚αž€αž€αŸ’αžšαž»αž˜αžŸαž»αžœαžαŸ’αžαž·αž—αžΆαž–αŸ–
Apache Kafka αž“αž·αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž‘αž·αž“αŸ’αž“αž“αŸαž™αžŸαŸ’αž‘αŸ’αžšαžΈαž˜αž‡αžΆαž˜αž½αž™ Spark Streaming

αž™αžΎαž„αž€αŸ†αžŽαžαŸ‹αžˆαŸ’αž˜αŸ„αŸ‡αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αŸ’αžšαž»αž˜αžŸαž“αŸ’αžαž·αžŸαž»αž - PostgreSQL αžŠαŸ‚αž›αž‡αžΆαž€αžΆαžšαž–αž·αž–αžŽαŸŒαž“αžΆαž”αž„αŸ’αž αžΆαž‰αžαžΆ VPC αž€αŸ’αžšαž»αž˜αž“αŸαŸ‡αž‚αž½αžšαžαŸ’αžšαžΌαžœαž”αžΆαž“αž—αŸ’αž‡αžΆαž”αŸ‹αž‡αžΆαž˜αž½αž™ αž αžΎαž™αž…αž»αž…αž”αŸŠαžΌαžαž»αž„αž”αž„αŸ’αž€αžΎαžαŸ–
Apache Kafka αž“αž·αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž‘αž·αž“αŸ’αž“αž“αŸαž™αžŸαŸ’αž‘αŸ’αžšαžΈαž˜αž‡αžΆαž˜αž½αž™ Spark Streaming

αž”αŸ†αž–αŸαž‰αž…αŸ’αž”αžΆαž”αŸ‹ Inbound αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž…αŸ’αžšαž€ 5432 αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αŸ’αžšαž»αž˜αžŠαŸ‚αž›αž‘αžΎαž”αž”αž„αŸ’αž€αžΎαžαžαŸ’αž˜αžΈ αžŠαžΌαž…αž”αž„αŸ’αž αžΆαž‰αž€αŸ’αž“αž»αž„αžšαžΌαž”αž—αžΆαž–αžαžΆαž„αž€αŸ’αžšαŸ„αž˜αŸ” αž’αŸ’αž“αž€αž˜αž·αž“αž’αžΆαž…αž”αž‰αŸ’αž‡αžΆαž€αŸ‹αž…αŸ’αžšαž€αžŠαŸ„αž™αžŠαŸƒαž”αžΆαž“αž‘αŸ αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž‡αŸ’αžšαžΎαžŸαžšαžΎαžŸ PostgreSQL αž–αžΈαž”αž‰αŸ’αž‡αžΈαž‘αž˜αŸ’αž›αžΆαž€αŸ‹αž…αž»αŸ‡ αž”αŸ’αžšαž—αŸαž‘αŸ”

αž“αž·αž™αžΆαž™αž™αŸ‰αžΆαž„αžαžΉαž„αžšαžΉαž„ αžαž˜αŸ’αž›αŸƒ ::/0 αž˜αžΆαž“αž“αŸαž™αžαžΆαž›αž‘αŸ’αž’αž—αžΆαž–αž“αŸƒαž…αžšαžΆαž…αžšαž…αžΌαž›αž‘αŸ…αž€αžΆαž“αŸ‹αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαž–αžΈαž‚αŸ’αžšαž”αŸ‹αž‘αž·αžŸαž‘αžΈ αžŠαŸ‚αž›αž˜αž·αž“αž–αž·αžαž‘αžΆαŸ†αž„αžŸαŸ’αžšαž»αž„ αž”αŸ‰αž»αž“αŸ’αžαŸ‚αžŠαžΎαž˜αŸ’αž”αžΈαžœαž·αž—αžΆαž‚αž§αž‘αžΆαž αžšαžŽαŸ αžŸαžΌαž˜αž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αžαŸ’αž›αž½αž“αž™αžΎαž„αž”αŸ’αžšαžΎαžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžšαŸ’αžαž“αŸαŸ‡αŸ–
Apache Kafka αž“αž·αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž‘αž·αž“αŸ’αž“αž“αŸαž™αžŸαŸ’αž‘αŸ’αžšαžΈαž˜αž‡αžΆαž˜αž½αž™ Spark Streaming

αž™αžΎαž„αžαŸ’αžšαž‘αž”αŸ‹αž‘αŸ…αž‘αŸ†αž–αŸαžšαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžšαž»αž€αžšαž€αžœαž·αž‰ αžŠαŸ‚αž›αž™αžΎαž„αž”αžΎαž€ "αž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž€αž˜αŸ’αžšαž·αžαžαŸ’αž–αžŸαŸ‹" αž αžΎαž™αž‡αŸ’αžšαžΎαžŸαžšαžΎαžŸαž“αŸ…αž€αŸ’αž“αž»αž„αž•αŸ’αž“αŸ‚αž€αž€αŸ’αžšαž»αž˜αžŸαž»αžœαžαŸ’αžαž·αž—αžΆαž– VPC -> αž‡αŸ’αžšαžΎαžŸαžšαžΎαžŸαž€αŸ’αžšαž»αž˜αžŸαž»αžœαžαŸ’αžαž·αž—αžΆαž– VPC αžŠαŸ‚αž›αž˜αžΆαž“αžŸαŸ’αžšαžΆαž”αŸ‹ -> PostgreSQL:
Apache Kafka αž“αž·αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž‘αž·αž“αŸ’αž“αž“αŸαž™αžŸαŸ’αž‘αŸ’αžšαžΈαž˜αž‡αžΆαž˜αž½αž™ Spark Streaming

αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž“αŸ…αž€αŸ’αž“αž»αž„αž‡αž˜αŸ’αžšαžΎαžŸαž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™ -> αžˆαŸ’αž˜αŸ„αŸ‡αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™ -> αž€αŸ†αžŽαžαŸ‹αžˆαŸ’αž˜αŸ„αŸ‡ - habrDB.

αž™αžΎαž„αž’αžΆαž…αž‘αž»αž€αž”αŸ‰αžΆαžšαŸ‰αžΆαž˜αŸ‰αŸ‚αžαŸ’αžšαžŠαŸ‚αž›αž“αŸ…αžŸαž›αŸ‹ αž›αžΎαž€αž›αŸ‚αž„αžαŸ‚αž€αžΆαžšαž”αž·αž‘αž€αžΆαžšαž”αž˜αŸ’αžšαž»αž„αž‘αž»αž€ (αžšαž™αŸˆαž–αŸαž›αžšαž€αŸ’αžŸαžΆαž‘αž»αž€αž€αžΆαžšαž”αž˜αŸ’αžšαž»αž„αž‘αž»αž€ - 0 αžαŸ’αž„αŸƒ) αž€αžΆαžšαžαŸ’αžšαž½αžαž–αž·αž“αž·αžαŸ’αž™ αž“αž·αž„αž€αžΆαžšαž’αž“αž»αžœαžαŸ’αžαž€αžΆαžšαž™αž›αŸ‹αžŠαžΉαž„αžαžΆαž˜αž›αŸ†αž“αžΆαŸ†αžŠαžΎαž˜αŸ” αž…αž»αž…αž›αžΎαž”αŸŠαžΌαžαž»αž„ αž”αž„αŸ’αž€αžΎαžαž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™:
Apache Kafka αž“αž·αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž‘αž·αž“αŸ’αž“αž“αŸαž™αžŸαŸ’αž‘αŸ’αžšαžΈαž˜αž‡αžΆαž˜αž½αž™ Spark Streaming

αž’αŸ’αž“αž€αžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αžαŸ’αžŸαŸ‚αžŸαŸ’αžšαž‘αžΆαž™

αžŠαŸ†αžŽαžΆαž€αŸ‹αž€αžΆαž›αž…αž»αž„αž€αŸ’αžšαŸ„αž™αž“αžΉαž„αž‡αžΆαž€αžΆαžšαž’αž—αž·αžœαžŒαŸ’αžαž“αŸαž€αžΆαžšαž„αžΆαžš Spark αžŠαŸ‚αž›αž“αžΉαž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž‘αž·αž“αŸ’αž“αž“αŸαž™αžαŸ’αž˜αžΈαžŠαŸ‚αž›αž˜αž€αž–αžΈ Kafka αžšαŸ€αž„αžšαžΆαž›αŸ‹αž–αžΈαžšαžœαž·αž“αžΆαž‘αžΈαž˜αŸ’αžαž„ αž αžΎαž™αž”αž‰αŸ’αž…αžΌαž›αž›αž‘αŸ’αž’αž•αž›αž‘αŸ…αž€αŸ’αž“αž»αž„αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αŸ”

αžŠαžΌαž…αžŠαŸ‚αž›αž”αžΆαž“αž€αžαŸ‹αžŸαž˜αŸ’αž‚αžΆαž›αŸ‹αžαžΆαž„αž›αžΎ αž…αŸ†αžŽαž»αž…αžαŸ’αžšαž½αžαž–αž·αž“αž·αžαŸ’αž™αž‚αžΊαž‡αžΆαž™αž“αŸ’αžαž€αžΆαžšαžŸαŸ’αž“αžΌαž›αž˜αž½αž™αž“αŸ…αž€αŸ’αž“αž»αž„ SparkStreaming αžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαžαŸ‚αž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αžŠαžΎαž˜αŸ’αž”αžΈαž’αžΆαž“αžΆαž”αžΆαž“αž“αžΌαžœαž€αžΆαžšαž’αžαŸ‹αž±αž“αž…αŸ†αž–αŸ„αŸ‡αž€αŸ†αž αž»αžŸαŸ” αž™αžΎαž„αž“αžΉαž„αž”αŸ’αžšαžΎαž”αŸ‰αž»αžŸαŸ’αžαž·αŸαžαŸ’αžšαž½αžαž–αž·αž“αž·αžαŸ’αž™ αž αžΎαž™αž”αŸ’αžšαžŸαž·αž“αž”αžΎαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž”αžšαžΆαž‡αŸαž™ αž˜αŸ‰αžΌαžŒαž»αž› Spark Streaming αž“αžΉαž„αž‚αŸ’αžšαžΆαž“αŸ‹αžαŸ‚αžαŸ’αžšαžΌαžœαžαŸ’αžšαž›αž”αŸ‹αž‘αŸ…αž…αŸ†αžŽαž»αž…αžαŸ’αžšαž½αžαž–αž·αž“αž·αžαŸ’αž™αž…αž»αž„αž€αŸ’αžšαŸ„αž™ αž αžΎαž™αž”αž“αŸ’αžαž€αžΆαžšαž‚αžŽαž“αžΆαž‘αžΎαž„αžœαž·αž‰αž–αžΈαžœαžΆαžŠαžΎαž˜αŸ’αž”αžΈαžŸαž„αŸ’αž‚αŸ’αžšαŸ„αŸ‡αž‘αž·αž“αŸ’αž“αž“αŸαž™αžŠαŸ‚αž›αž”αžΆαžαŸ‹αž”αž„αŸ‹αŸ”

αž€αžΆαžšαžαŸ’αžšαž½αžαž–αž·αž“αž·αžαŸ’αž™αž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αžΎαž€αžŠαŸ„αž™αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžαžαž“αŸ…αž›αžΎαž”αŸ’αžšαž–αŸαž“αŸ’αž’αž―αž€αžŸαžΆαžšαžŠαŸ‚αž›αž’αžΆαž…αž‘αž»αž€αž…αž·αžαŸ’αžαž”αžΆαž“αž“αž·αž„αž’αžαŸ‹αž±αž“αž€αŸ†αž αž»αžŸ (αžŠαžΌαž…αž‡αžΆ HDFS, S3 αŸ”αž›αŸ”) αžŠαŸ‚αž›αž–αŸαžαŸŒαž˜αžΆαž“αž…αŸ†αžŽαž»αž…αžαŸ’αžšαž½αžαž–αž·αž“αž·αžαŸ’αž™αž“αžΉαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αžšαž€αŸ’αžŸαžΆαž‘αž»αž€αŸ” αž“αŸαŸ‡αžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αŸ’αžœαžΎαžŠαŸ„αž™αž”αŸ’αžšαžΎαž§αž‘αžΆαž αžšαžŽαŸαŸ–

streamingContext.checkpoint(checkpointDirectory)

αž€αŸ’αž“αž»αž„αž§αž‘αžΆαž αžšαžŽαŸαžšαž”αžŸαŸ‹αž™αžΎαž„ αž™αžΎαž„αž“αžΉαž„αž”αŸ’αžšαžΎαžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžšαŸ’αžαžαžΆαž„αž€αŸ’αžšαŸ„αž˜ αž–αŸ„αž›αž‚αžΊαž”αŸ’αžšαžŸαž·αž“αž”αžΎ checkpointDirectory αž˜αžΆαž“ αž“αŸ„αŸ‡αž”αžšαž·αž”αž‘αž“αžΉαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž„αŸ’αž€αžΎαžαž‘αžΎαž„αžœαž·αž‰αž–αžΈαž‘αž·αž“αŸ’αž“αž“αŸαž™αž…αŸ†αžŽαž»αž…αžαŸ’αžšαž½αžαž–αž·αž“αž·αžαŸ’αž™αŸ” αž”αŸ’αžšαžŸαž·αž“αž”αžΎαžαžαž˜αž·αž“αž˜αžΆαž“αž‘αŸ (ឧ. αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž‡αžΆαž›αžΎαž€αžŠαŸ†αž”αžΌαž„) αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž˜αž€ functionToCreateContext αžαŸ’αžšαžΌαžœαž”αžΆαž“αž αŸ…αžŠαžΎαž˜αŸ’αž”αžΈαž”αž„αŸ’αž€αžΎαžαž”αžšαž·αž”αž‘αžαŸ’αž˜αžΈ αž“αž·αž„αž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’ DStreamsαŸ–

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 αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™ αžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž„αŸ’αž αžΆαž‰αž“αŸ…αž€αŸ’αž“αž»αž„αž•αŸ’αž“αŸ‚αž€ αž€αžΆαžšαžαž—αŸ’αž‡αžΆαž”αŸ‹ αž“αž·αž„αžŸαž»αžœαžαŸ’αžαž·αž—αžΆαž–αŸ–

Apache Kafka αž“αž·αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž‘αž·αž“αŸ’αž“αž“αŸαž™αžŸαŸ’αž‘αŸ’αžšαžΈαž˜αž‡αžΆαž˜αž½αž™ Spark Streaming

αžŠαžΎαž˜αŸ’αž”αžΈαž—αŸ’αž‡αžΆαž”αŸ‹ 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αŸ–

Apache Kafka αž“αž·αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž‘αž·αž“αŸ’αž“αž“αŸαž™αžŸαŸ’αž‘αŸ’αžšαžΈαž˜αž‡αžΆαž˜αž½αž™ Spark Streaming

αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž˜αž€ αž™αžΎαž„αž’αŸ’αžœαžΎαžŸαŸ†αžŽαž½αžšαžŸαžΆαž˜αž‰αŸ’αž‰αž˜αž½αž™αž‘αŸ…αž€αžΆαž“αŸ‹αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™ αžŠαžΎαž˜αŸ’αž”αžΈαž–αž·αž“αž·αžαŸ’αž™αž˜αžΎαž›αžœαžαŸ’αžαž˜αžΆαž“αž“αŸƒαž€αŸ†αžŽαžαŸ‹αžαŸ’αžšαžΆαž“αŸ…αž€αŸ’αž“αž»αž„αžαžΆαžšαžΆαž„ αž›αŸ†αž αžΌαžšαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžš:

Apache Kafka αž“αž·αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž‘αž·αž“αŸ’αž“αž“αŸαž™αžŸαŸ’αž‘αŸ’αžšαžΈαž˜αž‡αžΆαž˜αž½αž™ Spark Streaming

αžŸαŸαž…αž€αŸ’αžαžΈαžŸαž“αŸ’αž“αž·αžŠαŸ’αž‹αžΆαž“

αž’αžαŸ’αžαž”αž‘αž“αŸαŸ‡αž”αžΆαž“αž€αŸ’αžšαž‘αŸαž€αž˜αžΎαž›αž§αž‘αžΆαž αžšαžŽαŸαž“αŸƒαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŸαŸ’αž‘αŸ’αžšαžΈαž˜αž–αŸαžαŸŒαž˜αžΆαž“αžŠαŸ„αž™αž”αŸ’αžšαžΎ Spark Streaming αžŠαŸ„αž™αž—αŸ’αž‡αžΆαž”αŸ‹αž‡αžΆαž˜αž½αž™ Apache Kafka αž“αž·αž„ PostgreSQL αŸ” αž‡αžΆαž˜αž½αž™αž“αžΉαž„αž€αžΆαžšαž€αžΎαž“αž‘αžΎαž„αž“αŸƒαž‘αž·αž“αŸ’αž“αž“αŸαž™αž–αžΈαž”αŸ’αžšαž—αž–αž•αŸ’αžŸαŸαž„αŸ— αžœαžΆαž–αž·αž”αžΆαž€αž€αŸ’αž“αž»αž„αž€αžΆαžšαž”αŸ‰αžΆαž“αŸ‹αžŸαŸ’αž˜αžΆαž“αžαž˜αŸ’αž›αŸƒαž‡αžΆαž€αŸ‹αžŸαŸ’αžαŸ‚αž„αž“αŸƒ Spark Streaming αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž”αž„αŸ’αž€αžΎαžαž€αžΆαžšαž•αŸ’αžŸαžΆαž™ αž“αž·αž„αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž€αŸ’αž“αž»αž„αž–αŸαž›αž‡αžΆαž€αŸ‹αžŸαŸ’αžαŸ‚αž„αŸ”

αž’αŸ’αž“αž€αž’αžΆαž…αžŸαŸ’αžœαŸ‚αž„αžšαž€αž€αžΌαžŠαž”αŸ’αžšαž—αž–αž–αŸαž‰αž›αŸαž‰αž“αŸ…αž€αŸ’αž“αž»αž„αžƒαŸ’αž›αžΆαŸ†αž„αžšαž”αžŸαŸ‹αžαŸ’αž‰αž»αŸ†αž“αŸ… GitHub.

αžαŸ’αž‰αž»αŸ†αžšαžΈαž€αžšαžΆαž™αž€αŸ’αž“αž»αž„αž€αžΆαžšαž–αž·αž—αžΆαž€αŸ’αžŸαžΆαž’αžαŸ’αžαž”αž‘αž“αŸαŸ‡ αžαŸ’αž‰αž»αŸ†αž‘αž“αŸ’αž‘αžΉαž„αžšαž„αŸ‹αž…αžΆαŸ†αž™αŸ„αž”αž›αŸ‹αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€ αž αžΎαž™αžαŸ’αž‰αž»αŸ†αž€αŸαžŸαž„αŸ’αžƒαžΉαž˜αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαžšαž·αŸ‡αž‚αž“αŸ‹αž€αŸ’αž“αž»αž„αž“αŸαž™αžŸαŸ’αžαžΆαž”αž“αžΆαž–αžΈαž’αŸ’αž“αž€αž’αžΆαž“αžŠαŸ‚αž›αž™αž€αž…αž·αžαŸ’αžαž‘αž»αž€αžŠαžΆαž€αŸ‹αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αŸ”

αžαŸ’αž‰αž»αŸ†αžŸαžΌαž˜αž‡αžΌαž“αž–αžšαž±αŸ’αž™αž’αŸ’αž“αž€αž‘αž‘αž½αž›αž”αžΆαž“αž‡αŸ„αž‚αž‡αŸαž™!

αž‘αŸ†αž“αž»αž€αŸ” αžŠαŸ†αž”αžΌαž„αžœαžΆαžαŸ’αžšαžΌαžœαž”αžΆαž“αž‚αŸ’αžšαŸ„αž„αž“αžΉαž„αž”αŸ’αžšαžΎαž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™ PostgreSQL αž€αŸ’αž“αž»αž„αžŸαŸ’αžšαž»αž€ αž”αŸ‰αž»αž“αŸ’αžαŸ‚αžŠαŸ„αž™αžŸαžΆαžšαž€αžΆαžšαžŸαŸ’αžšαž›αžΆαž‰αŸ‹αžšαž”αžŸαŸ‹αžαŸ’αž‰αž»αŸ†αž…αŸ†αž–αŸ„αŸ‡ AWS αžαŸ’αž‰αž»αŸ†αž”αžΆαž“αžŸαž˜αŸ’αžšαŸαž…αž…αž·αžαŸ’αžαž•αŸ’αž›αžΆαžŸαŸ‹αž‘αžΈαž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αž‘αŸ…αž–αž–αž€αŸ” αž“αŸ…αž€αŸ’αž“αž»αž„αž’αžαŸ’αžαž”αž‘αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž›αžΎαž”αŸ’αžšαž’αžΆαž“αž”αž‘αž“αŸαŸ‡ αžαŸ’αž‰αž»αŸ†αž“αžΉαž„αž”αž„αŸ’αž αžΆαž‰αž–αžΈαžšαž”αŸ€αž”αž’αž“αž»αžœαžαŸ’αžαž”αŸ’αžšαž–αŸαž“αŸ’αž’αž‘αžΆαŸ†αž„αž˜αžΌαž›αžŠαŸ‚αž›αž”αžΆαž“αž–αž·αž–αžŽαŸŒαž“αžΆαžαžΆαž„αž›αžΎαž“αŸ…αž€αŸ’αž“αž»αž„ AWS αžŠαŸ„αž™αž”αŸ’αžšαžΎ AWS Kinesis αž“αž·αž„ AWS EMR αŸ” αžαžΆαž˜αžŠαžΆαž“αž–αŸαžαŸŒαž˜αžΆαž“!

αž”αŸ’αžšαž—αž–: www.habr.com

αž”αž“αŸ’αžαŸ‚αž˜αž˜αžαž·αž™αŸ„αž”αž›αŸ‹