/scylla-and-spark/streaming-into-scylla/src/main/scala/com/scylladb/streaming/Streaming.scala

https://github.com/scylladb/scylla-code-samples · Scala · 70 lines · 57 code · 13 blank · 0 comment · 0 complexity · 0ef70ded8d8245581c6415db4045bb46 MD5 · raw file

  1. package com.scylladb.streaming
  2. import akka.actor.ActorSystem
  3. import akka.http.scaladsl.Http
  4. import akka.stream.ActorMaterializer
  5. import com.datastax.spark.connector._
  6. import com.datastax.spark.connector.cql.CassandraConnectorConf
  7. import java.util.Properties
  8. import org.apache.kafka.clients.producer.KafkaProducer
  9. import org.apache.kafka.common.serialization.StringSerializer
  10. import org.apache.spark.sql.SparkSession
  11. import org.apache.spark.sql.cassandra._
  12. import scala.concurrent.{Await, Promise}
  13. import scala.concurrent.duration._
  14. import scala.util.Failure
  15. object Streaming {
  16. def main(args: Array[String]): Unit = {
  17. implicit val system = ActorSystem("ScyllaStreaming")
  18. implicit val ec = system.dispatcher
  19. implicit val mat = ActorMaterializer()
  20. implicit val session = SparkSession.builder
  21. .appName("ScyllaStreaming")
  22. .getOrCreate()
  23. .setCassandraConf(
  24. "scylla",
  25. Map(CassandraConnectorConf.ConnectionHostParam.name -> "scylla"))
  26. val producer = {
  27. val props = new Properties
  28. props.put("bootstrap.servers", "kafka:9092")
  29. props.put("retries", "20")
  30. new KafkaProducer(props, new StringSerializer, new StringSerializer)
  31. }
  32. val quotesToRetrieve = session.conf
  33. .get("spark.scylla.quotes", "aapl,fb,snap")
  34. .split(",")
  35. .toList
  36. val poller =
  37. IEXPoller(Http(), producer, "quotes", quotesToRetrieve)
  38. .run()
  39. val quoteReader = QuoteReader("quotes")
  40. val bindFuture =
  41. Http().bindAndHandle(Routes(session), "0.0.0.0", 3000).andThen {
  42. case Failure(e) => println("Failed to bind: ${e}")
  43. }
  44. val shutdownSignal = Promise[Unit]()
  45. addShutdownHook(shutdownSignal)
  46. Await.result(shutdownSignal.future, Duration.Inf)
  47. poller.shutdown()
  48. producer.close()
  49. quoteReader.stop()
  50. system.terminate()
  51. session.stop()
  52. }
  53. def addShutdownHook(signal: Promise[Unit]): Unit =
  54. sys.addShutdownHook {
  55. signal.success(())
  56. }
  57. }