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 āļ™āļģāļ‚āđ‰āļ­āļĄāļđāļĨāļˆāļēāļāđāļŦāļĨāđˆāļ‡āļ•āđˆāļēāļ‡āđ† āđāļĨāļ°āļĢāļ§āļĄāđ€āļ›āđ‡āļ™āđāļžāđ‡āļ„āđ€āļāļˆāļ‚āļ™āļēāļ”āđ€āļĨāđ‡āļ āđāļžāđ‡āļ„āđ€āļāļˆāđƒāļŦāļĄāđˆāļˆāļ°āļ–āļđāļāļŠāļĢāđ‰āļēāļ‡āļ‚āļķāđ‰āļ™āļ•āļēāļĄāļŠāđˆāļ§āļ‡āđ€āļ§āļĨāļēāļ›āļāļ•āļī āđ€āļĄāļ·āđˆāļ­āđ€āļĢāļīāđˆāļĄāļ•āđ‰āļ™āđāļ•āđˆāļĨāļ°āļŠāđˆāļ§āļ‡āđ€āļ§āļĨāļē āļˆāļ°āļĄāļĩāļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āđāļžāđ‡āļāđ€āļāđ‡āļ•āđƒāļŦāļĄāđˆ āđāļĨāļ°āļ‚āđ‰āļ­āļĄāļđāļĨāđƒāļ”āđ† āļ—āļĩāđˆāđ„āļ”āđ‰āļĢāļąāļšāļĢāļ°āļŦāļ§āđˆāļēāļ‡āļŠāđˆāļ§āļ‡āđ€āļ§āļĨāļēāļ™āļąāđ‰āļ™āļˆāļ°āļĢāļ§āļĄāļ­āļĒāļđāđˆāđƒāļ™āđāļžāđ‡āļāđ€āļāđ‡āļ• āđ€āļĄāļ·āđˆāļ­āļŠāļīāđ‰āļ™āļŠāļļāļ”āļŠāđˆāļ§āļ‡āđ€āļ§āļĨāļē āļāļēāļĢāđ€āļ•āļīāļšāđ‚āļ•āļ‚āļ­āļ‡āđāļžāđ‡āļāđ€āļāđ‡āļ•āļˆāļ°āļŦāļĒāļļāļ”āļĨāļ‡ āļ‚āļ™āļēāļ”āļ‚āļ­āļ‡āļŠāđˆāļ§āļ‡āđ€āļ§āļĨāļēāļ–āļđāļāļāļģāļŦāļ™āļ”āđ‚āļ”āļĒāļžāļēāļĢāļēāļĄāļīāđ€āļ•āļ­āļĢāđŒāļ—āļĩāđˆāđ€āļĢāļĩāļĒāļāļ§āđˆāļēāļŠāđˆāļ§āļ‡āđāļšāļ—āļŠāđŒ
  • āļ­āļēāļ›āļēāđ€āļŠāđˆ āļŠāļ›āļēāļĢāđŒāļ„ SQL - āļĢāļ§āļĄāļāļēāļĢāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāđ€āļŠāļīāļ‡āļŠāļąāļĄāļžāļąāļ™āļ˜āđŒāđ€āļ‚āđ‰āļēāļāļąāļšāļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļŸāļąāļ‡āļāđŒāļŠāļąāļ™ Spark āļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļĩāđˆāļĄāļĩāđ‚āļ„āļĢāļ‡āļŠāļĢāđ‰āļēāļ‡āļŦāļĄāļēāļĒāļ–āļķāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļĩāđˆāļĄāļĩāļŠāļ„āļĩāļĄāļē āļ‹āļķāđˆāļ‡āļāđ‡āļ„āļ·āļ­āļŠāļļāļ”āļŠāđˆāļ­āļ‡āđ€āļ”āļĩāļĒāļ§āļŠāļģāļŦāļĢāļąāļšāļĢāļ°āđ€āļšāļĩāļĒāļ™āļ—āļąāđ‰āļ‡āļŦāļĄāļ” Spark SQL āļĢāļ­āļ‡āļĢāļąāļšāļ­āļīāļ™āļžāļļāļ•āļˆāļēāļāđāļŦāļĨāđˆāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļĩāđˆāļĄāļĩāđ‚āļ„āļĢāļ‡āļŠāļĢāđ‰āļēāļ‡āļ—āļĩāđˆāļŦāļĨāļēāļāļŦāļĨāļēāļĒ āđāļĨāļ°āļ”āđ‰āļ§āļĒāļ„āļ§āļēāļĄāļžāļĢāđ‰āļ­āļĄāđƒāļŠāđ‰āļ‡āļēāļ™āļ‚āļ­āļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāļŠāļ„āļĩāļĄāļē āļ—āļģāđƒāļŦāđ‰āļŠāļēāļĄāļēāļĢāļ–āļ”āļķāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāđ€āļ‰āļžāļēāļ°āļŸāļīāļĨāļ”āđŒāļšāļąāļ™āļ—āļķāļāļ—āļĩāđˆāļˆāļģāđ€āļ›āđ‡āļ™āđ„āļ”āđ‰āļ­āļĒāđˆāļēāļ‡āļĄāļĩāļ›āļĢāļ°āļŠāļīāļ—āļ˜āļīāļ āļēāļž āđāļĨāļ°āļĒāļąāļ‡āļĄāļĩ DataFrame API āļ­āļĩāļāļ”āđ‰āļ§āļĒ
  • 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

āļĄāļēāļŠāļĢāđ‰āļēāļ‡āļŦāļąāļ§āļ‚āđ‰āļ­āđƒāļŦāļĄāđˆāļ—āļĩāđˆāđ€āļĢāļĩāļĒāļāļ§āđˆāļē Transaction:

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 āđāļĨāđ‰āļ§āļ„āļĨāļīāļāļ–āļąāļ”āđ„āļ›:
Apache Kafka āđāļĨāļ°āļāļēāļĢāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāļ‚āđ‰āļ­āļĄāļđāļĨāđāļšāļšāļŠāļ•āļĢāļĩāļĄāļĄāļīāđˆāļ‡āļ”āđ‰āļ§āļĒ Spark Streaming

āđ€āļžāļĢāļēāļ° āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ™āļĩāđ‰āļĄāļĩāļ§āļąāļ•āļ–āļļāļ›āļĢāļ°āļŠāļ‡āļ„āđŒāđ€āļžāļ·āđˆāļ­āļāļēāļĢāļĻāļķāļāļĐāļēāđ€āļ—āđˆāļēāļ™āļąāđ‰āļ™ āđ€āļĢāļēāļˆāļ°āđƒāļŠāđ‰āđ€āļ‹āļīāļĢāđŒāļŸāđ€āļ§āļ­āļĢāđŒāļŸāļĢāļĩ "āļ‚āļąāđ‰āļ™āļ•āđˆāļģ" (Free Tier):
Apache Kafka āđāļĨāļ°āļāļēāļĢāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāļ‚āđ‰āļ­āļĄāļđāļĨāđāļšāļšāļŠāļ•āļĢāļĩāļĄāļĄāļīāđˆāļ‡āļ”āđ‰āļ§āļĒ Spark Streaming

āļ•āđˆāļ­āđ„āļ› āđ€āļĢāļēāļ—āļģāđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļŦāļĄāļēāļĒāđƒāļ™āļšāļĨāđ‡āļ­āļ Free Tier āđāļĨāļ°āļŦāļĨāļąāļ‡āļˆāļēāļāļ™āļąāđ‰āļ™āđ€āļĢāļēāļˆāļ°āđ„āļ”āđ‰āļĢāļąāļšāļ­āļīāļ™āļŠāđāļ•āļ™āļ‹āđŒāļ‚āļ­āļ‡āļ„āļĨāļēāļŠ t2.micro āđ‚āļ”āļĒāļ­āļąāļ•āđ‚āļ™āļĄāļąāļ•āļī - āđāļĄāđ‰āļ§āđˆāļēāļˆāļ°āļ­āđˆāļ­āļ™āđāļ­ āđāļ•āđˆāļāđ‡āļŸāļĢāļĩāđāļĨāļ°āļ„āđˆāļ­āļ™āļ‚āđ‰āļēāļ‡āđ€āļŦāļĄāļēāļ°āļŠāļĄāļāļąāļšāļ‡āļēāļ™āļ‚āļ­āļ‡āđ€āļĢāļē:
Apache Kafka āđāļĨāļ°āļāļēāļĢāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāļ‚āđ‰āļ­āļĄāļđāļĨāđāļšāļšāļŠāļ•āļĢāļĩāļĄāļĄāļīāđˆāļ‡āļ”āđ‰āļ§āļĒ Spark Streaming

āļ–āļąāļ”āļĄāļēāļ„āļ·āļ­āļŠāļīāđˆāļ‡āļ—āļĩāđˆāļŠāļģāļ„āļąāļāļĄāļēāļ: āļŠāļ·āđˆāļ­āļ‚āļ­āļ‡āļ­āļīāļ™āļŠāđāļ•āļ™āļ‹āđŒāļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨ āļŠāļ·āđˆāļ­āļœāļđāđ‰āđƒāļŠāđ‰āļŦāļĨāļąāļ āđāļĨāļ°āļĢāļŦāļąāļŠāļœāđˆāļēāļ™āļ‚āļ­āļ‡āđ€āļ‚āļē āļ•āļąāđ‰āļ‡āļŠāļ·āđˆāļ­āļ­āļīāļ™āļŠāđāļ•āļ™āļ‹āđŒ: myHabrTest āļœāļđāđ‰āđƒāļŠāđ‰āļŦāļĨāļąāļ: āđāļŪāļš, āļĢāļŦāļąāļŠāļœāđˆāļēāļ™: āļŪāļēāđ€āļšāļ­āļĢāđŒ12345 āđāļĨāļ°āļ„āļĨāļīāļāļ—āļĩāđˆāļ›āļļāđˆāļĄāļ–āļąāļ”āđ„āļ›:
Apache Kafka āđāļĨāļ°āļāļēāļĢāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāļ‚āđ‰āļ­āļĄāļđāļĨāđāļšāļšāļŠāļ•āļĢāļĩāļĄāļĄāļīāđˆāļ‡āļ”āđ‰āļ§āļĒ Spark Streaming

āđƒāļ™āļŦāļ™āđ‰āļēāļ–āļąāļ”āđ„āļ› āļĄāļĩāļžāļēāļĢāļēāļĄāļīāđ€āļ•āļ­āļĢāđŒāļ—āļĩāđˆāļĢāļąāļšāļœāļīāļ”āļŠāļ­āļšāđƒāļ™āļāļēāļĢāđ€āļ‚āđ‰āļēāļ–āļķāļ‡āđ€āļ‹āļīāļĢāđŒāļŸāđ€āļ§āļ­āļĢāđŒāļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨāļ‚āļ­āļ‡āđ€āļĢāļēāļˆāļēāļāļ āļēāļĒāļ™āļ­āļ (āļāļēāļĢāđ€āļ‚āđ‰āļēāļ–āļķāļ‡āđāļšāļšāļŠāļēāļ˜āļēāļĢāļ“āļ°) āđāļĨāļ°āļ„āļ§āļēāļĄāļžāļĢāđ‰āļ­āļĄāđƒāļŠāđ‰āļ‡āļēāļ™āļ‚āļ­āļ‡āļžāļ­āļĢāđŒāļ•:

Apache Kafka āđāļĨāļ°āļāļēāļĢāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāļ‚āđ‰āļ­āļĄāļđāļĨāđāļšāļšāļŠāļ•āļĢāļĩāļĄāļĄāļīāđˆāļ‡āļ”āđ‰āļ§āļĒ Spark Streaming

āļĄāļēāļŠāļĢāđ‰āļēāļ‡āļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāđƒāļŦāļĄāđˆāļŠāļģāļŦāļĢāļąāļšāļāļĨāļļāđˆāļĄāļ„āļ§āļēāļĄāļ›āļĨāļ­āļ”āļ āļąāļĒ VPC āļ‹āļķāđˆāļ‡āļˆāļ°āļ­āļ™āļļāļāļēāļ•āđƒāļŦāđ‰āļ āļēāļĒāļ™āļ­āļāđ€āļ‚āđ‰āļēāļ–āļķāļ‡āđ€āļ‹āļīāļĢāđŒāļŸāđ€āļ§āļ­āļĢāđŒāļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨāļ‚āļ­āļ‡āđ€āļĢāļēāļœāđˆāļēāļ™āļžāļ­āļĢāđŒāļ• 5432 (PostgreSQL)
āđ„āļ›āļ—āļĩāđˆāļ„āļ­āļ™āđ‚āļ‹āļĨ AWS āđƒāļ™āļŦāļ™āđ‰āļēāļ•āđˆāļēāļ‡āđ€āļšāļĢāļēāļ§āđŒāđ€āļ‹āļ­āļĢāđŒāđāļĒāļāļ•āđˆāļēāļ‡āļŦāļēāļāđ„āļ›āļ—āļĩāđˆ VPC Dashboard -> āļāļĨāļļāđˆāļĄāļ„āļ§āļēāļĄāļ›āļĨāļ­āļ”āļ āļąāļĒ -> āļŠāļĢāđ‰āļēāļ‡āļāļĨāļļāđˆāļĄāļ„āļ§āļēāļĄāļ›āļĨāļ­āļ”āļ āļąāļĒ:
Apache Kafka āđāļĨāļ°āļāļēāļĢāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāļ‚āđ‰āļ­āļĄāļđāļĨāđāļšāļšāļŠāļ•āļĢāļĩāļĄāļĄāļīāđˆāļ‡āļ”āđ‰āļ§āļĒ Spark Streaming

āđ€āļĢāļēāļ•āļąāđ‰āļ‡āļŠāļ·āđˆāļ­āđƒāļŦāđ‰āļāļąāļšāļāļĨāļļāđˆāļĄāļ„āļ§āļēāļĄāļ›āļĨāļ­āļ”āļ āļąāļĒ - PostgreSQL āļ‹āļķāđˆāļ‡āđ€āļ›āđ‡āļ™āļ„āļģāļ­āļ˜āļīāļšāļēāļĒāļĢāļ°āļšāļļāļ§āđˆāļē VPC āđƒāļ”āļ—āļĩāđˆāļāļĨāļļāđˆāļĄāļ™āļĩāđ‰āļ„āļ§āļĢāđ€āļŠāļ·āđˆāļ­āļĄāđ‚āļĒāļ‡āļāļąāļšāđāļĨāļ°āļ„āļĨāļīāļāļ›āļļāđˆāļĄāļŠāļĢāđ‰āļēāļ‡:
Apache Kafka āđāļĨāļ°āļāļēāļĢāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāļ‚āđ‰āļ­āļĄāļđāļĨāđāļšāļšāļŠāļ•āļĢāļĩāļĄāļĄāļīāđˆāļ‡āļ”āđ‰āļ§āļĒ Spark Streaming

āļāļĢāļ­āļāļāļŽāļ‚āļēāđ€āļ‚āđ‰āļēāļŠāļģāļŦāļĢāļąāļšāļžāļ­āļĢāđŒāļ• 5432 āļŠāļģāļŦāļĢāļąāļšāļāļĨāļļāđˆāļĄāļ—āļĩāđˆāļŠāļĢāđ‰āļēāļ‡āļ‚āļķāđ‰āļ™āđƒāļŦāļĄāđˆ āļ”āļąāļ‡āļ āļēāļžāļ”āđ‰āļēāļ™āļĨāđˆāļēāļ‡ āļ„āļļāļ“āđ„āļĄāđˆāļŠāļēāļĄāļēāļĢāļ–āļĢāļ°āļšāļļāļžāļ­āļĢāđŒāļ•āļ”āđ‰āļ§āļĒāļ•āļ™āđ€āļ­āļ‡āđ„āļ”āđ‰ āđāļ•āđˆāđ€āļĨāļ·āļ­āļ PostgreSQL āļˆāļēāļāļĢāļēāļĒāļāļēāļĢāđāļšāļšāđ€āļĨāļ·āđˆāļ­āļ™āļĨāļ‡āļ›āļĢāļ°āđ€āļ āļ—

āļžāļđāļ”āļ­āļĒāđˆāļēāļ‡āđ€āļ„āļĢāđˆāļ‡āļ„āļĢāļąāļ” āļ„āđˆāļē ::/0 āļŦāļĄāļēāļĒāļ–āļķāļ‡āļ„āļ§āļēāļĄāļžāļĢāđ‰āļ­āļĄāđƒāļŠāđ‰āļ‡āļēāļ™āļ‚āļ­āļ‡āļāļēāļĢāļĢāļąāļšāļŠāđˆāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāļ‚āļēāđ€āļ‚āđ‰āļēāđ„āļ›āļĒāļąāļ‡āđ€āļ‹āļīāļĢāđŒāļŸāđ€āļ§āļ­āļĢāđŒāļˆāļēāļāļ—āļąāđˆāļ§āļ—āļļāļāļĄāļļāļĄāđ‚āļĨāļ āļ‹āļķāđˆāļ‡āļ•āļēāļĄāļŦāļĨāļąāļāļšāļąāļāļāļąāļ•āļīāļ™āļąāđ‰āļ™āđ„āļĄāđˆāđ€āļ›āđ‡āļ™āļ„āļ§āļēāļĄāļˆāļĢāļīāļ‡āļ—āļąāđ‰āļ‡āļŦāļĄāļ” āđāļ•āđˆāđ€āļžāļ·āđˆāļ­āļ§āļīāđ€āļ„āļĢāļēāļ°āļŦāđŒāļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡ āđƒāļŦāđ‰āđ€āļĢāļēāļ­āļ™āļļāļāļēāļ•āđƒāļŦāđ‰āđ€āļĢāļēāđƒāļŠāđ‰āđāļ™āļ§āļ—āļēāļ‡āļ™āļĩāđ‰:
Apache Kafka āđāļĨāļ°āļāļēāļĢāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāļ‚āđ‰āļ­āļĄāļđāļĨāđāļšāļšāļŠāļ•āļĢāļĩāļĄāļĄāļīāđˆāļ‡āļ”āđ‰āļ§āļĒ Spark Streaming

āđ€āļĢāļēāļāļĨāļąāļšāđ„āļ›āļ—āļĩāđˆāļŦāļ™āđ‰āļēāđ€āļšāļĢāļēāļ§āđŒāđ€āļ‹āļ­āļĢāđŒ āđ‚āļ”āļĒāļ—āļĩāđˆāđ€āļĢāļēāđ€āļ›āļīāļ” â€œāļāļģāļŦāļ™āļ”āļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāļ‚āļąāđ‰āļ™āļŠāļđāļ‡â€ āđ„āļ§āđ‰ āđāļĨāļ°āđ€āļĨāļ·āļ­āļāđƒāļ™āļŠāđˆāļ§āļ™āļāļĨāļļāđˆāļĄāļ„āļ§āļēāļĄāļ›āļĨāļ­āļ”āļ āļąāļĒ VPC -> āđ€āļĨāļ·āļ­āļāļāļĨāļļāđˆāļĄāļ„āļ§āļēāļĄāļ›āļĨāļ­āļ”āļ āļąāļĒ VPC āļ—āļĩāđˆāļĄāļĩāļ­āļĒāļđāđˆ -> PostgreSQL:
Apache Kafka āđāļĨāļ°āļāļēāļĢāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāļ‚āđ‰āļ­āļĄāļđāļĨāđāļšāļšāļŠāļ•āļĢāļĩāļĄāļĄāļīāđˆāļ‡āļ”āđ‰āļ§āļĒ Spark Streaming

āļ–āļąāļ”āđ„āļ›āđƒāļ™āļ•āļąāļ§āđ€āļĨāļ·āļ­āļāļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨ -> āļŠāļ·āđˆāļ­āļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨ -> āļ•āļąāđ‰āļ‡āļŠāļ·āđˆāļ­ - āļŪāļēāđ€āļšāļ­āļĢāđŒāļ”āļĩāļšāļĩ.

āđ€āļĢāļēāļŠāļēāļĄāļēāļĢāļ–āļ„āļ‡āļžāļēāļĢāļēāļĄāļīāđ€āļ•āļ­āļĢāđŒāļ—āļĩāđˆāđ€āļŦāļĨāļ·āļ­āđ„āļ§āđ‰āđ„āļ”āđ‰ āļĒāļāđ€āļ§āđ‰āļ™āļāļēāļĢāļ›āļīāļ”āđƒāļŠāđ‰āļ‡āļēāļ™āļāļēāļĢāļŠāļģāļĢāļ­āļ‡āļ‚āđ‰āļ­āļĄāļđāļĨ (āļĢāļ°āļĒāļ°āđ€āļ§āļĨāļēāđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨāļŠāļģāļĢāļ­āļ‡ - 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 āđ‚āļ”āļĒāđƒāļŠāđ‰āļŠāļīāđˆāļ‡āļ›āļĢāļ°āļ”āļīāļĐāļāđŒ āļˆāļļāļ”āļ›āļĢāļ°āļāļēāļĒāļŠāļ•āļĢāļĩāļĄāļĄāļīāđˆāļ‡-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.

āļ‰āļąāļ™āļĒāļīāļ™āļ”āļĩāļ—āļĩāđˆāļˆāļ°āļŦāļēāļĢāļ·āļ­āđ€āļāļĩāđˆāļĒāļ§āļāļąāļšāļšāļ—āļ„āļ§āļēāļĄāļ™āļĩāđ‰ āļ‰āļąāļ™āļŦāļ§āļąāļ‡āļ§āđˆāļēāļˆāļ°āđ„āļ”āđ‰āļĢāļąāļšāļ„āļ§āļēāļĄāļ„āļīāļ”āđ€āļŦāđ‡āļ™āļ‚āļ­āļ‡āļ„āļļāļ“ āđāļĨāļ°āļ‰āļąāļ™āļāđ‡āļŦāļ§āļąāļ‡āļ§āđˆāļēāļˆāļ°āđ„āļ”āđ‰āļĢāļąāļšāļ„āļģāļ§āļīāļˆāļēāļĢāļ“āđŒāļ—āļĩāđˆāļŠāļĢāđ‰āļēāļ‡āļŠāļĢāļĢāļ„āđŒāļˆāļēāļāļœāļđāđ‰āļ­āđˆāļēāļ™āļ—āļĩāđˆāļŦāđˆāļ§āļ‡āđƒāļĒāļ—āļļāļāļ„āļ™

āļ‰āļąāļ™āļ‚āļ­āđƒāļŦāđ‰āļ„āļļāļ“āļ›āļĢāļ°āļŠāļšāļ„āļ§āļēāļĄāļŠāļģāđ€āļĢāđ‡āļˆ!

ps āđƒāļ™āļ•āļ­āļ™āđāļĢāļāļĄāļĩāđāļœāļ™āļˆāļ°āđƒāļŠāđ‰āļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨ PostgreSQL āđƒāļ™āđ€āļ„āļĢāļ·āđˆāļ­āļ‡ āđāļ•āđˆāđ€āļ™āļ·āđˆāļ­āļ‡āļˆāļēāļāļ‰āļąāļ™āļŠāļ­āļš AWS āļ‰āļąāļ™āļˆāļķāļ‡āļ•āļąāļ”āļŠāļīāļ™āđƒāļˆāļĒāđ‰āļēāļĒāļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨāđ„āļ›āļĒāļąāļ‡āļ„āļĨāļēāļ§āļ”āđŒ āđƒāļ™āļšāļ—āļ„āļ§āļēāļĄāļ–āļąāļ”āđ„āļ›āđƒāļ™āļŦāļąāļ§āļ‚āđ‰āļ­āļ™āļĩāđ‰ āļ‰āļąāļ™āļˆāļ°āđāļŠāļ”āļ‡āļ§āļīāļ˜āļĩāđƒāļŠāđ‰āļ‡āļēāļ™āļĢāļ°āļšāļšāļ—āļąāđ‰āļ‡āļŦāļĄāļ”āļ—āļĩāđˆāļ­āļ˜āļīāļšāļēāļĒāđ„āļ§āđ‰āļ‚āđ‰āļēāļ‡āļ•āđ‰āļ™āđƒāļ™ AWS āđ‚āļ”āļĒāđƒāļŠāđ‰ AWS Kinesis āđāļĨāļ° AWS EMR āļ•āļīāļ”āļ•āļēāļĄāļ‚āđˆāļēāļ§!

āļ—āļĩāđˆāļĄāļē: will.com

āļ‹āļ·āđ‰āļ­āđ‚āļŪāļŠāļ•āļīāđ‰āļ‡āļ—āļĩāđˆāđ€āļŠāļ·āđˆāļ­āļ–āļ·āļ­āđ„āļ”āđ‰āļŠāļģāļŦāļĢāļąāļšāđ„āļ‹āļ•āđŒāļ—āļĩāđˆāļĄāļĩāļāļēāļĢāļ›āđ‰āļ­āļ‡āļāļąāļ™ DDoS āđ€āļ‹āļīāļĢāđŒāļŸāđ€āļ§āļ­āļĢāđŒ VPS VDS ðŸ”Ĩ āļ‹āļ·āđ‰āļ­āļšāļĢāļīāļāļēāļĢāđ€āļ§āđ‡āļšāđ‚āļŪāļŠāļ•āļīāđ‰āļ‡āļ—āļĩāđˆāđ€āļŠāļ·āđˆāļ­āļ–āļ·āļ­āđ„āļ”āđ‰ āļžāļĢāđ‰āļ­āļĄāļĢāļ°āļšāļšāļ›āđ‰āļ­āļ‡āļāļąāļ™ DDoS āđāļĨāļ°āđ€āļ‹āļīāļĢāđŒāļŸāđ€āļ§āļ­āļĢāđŒ VPS/VDS | ProHoster