来自演员的Spark-Streaming

时间:2017-02-21 08:44:10

标签: scala apache-kafka spark-streaming actor

我希望让消费者演员订阅Kafka主题并流式传输数据,以便在消费者之外使用Spark Streaming进行进一步处理。为什么演员呢?因为我读到它的主管策略是处理Kafka失败的好方法(例如,重启失败)。

我找到了两个选项:

  • Java KafkaConsumer类:其poll()方法返回Map[String, Object]。我想像DStream一样返回KafkaUtils.createDirectStream,而且我不知道如何从演员外部获取流。
  • 扩展ActorHelper特征并使用此example中显示的actorStream()。后一个选项不显示与主题的连接,而是显示与套接字的连接。

有人能指出我正确的方向吗?

1 个答案:

答案 0 :(得分:2)

为了处理Kafka失败,我使用了Apache Curator框架和以下解决方法:

val client: CuratorFramework = ... // see docs
val zk: CuratorZookeeperClient = client.getZookeeperClient

/**
  * This method returns false if kafka or zookeeper is down.
  */ 
def isKafkaAvailable:Boolean = 
   Try {
      if (zk.isConnected) {
        val xs = client.getChildren.forPath("/brokers/ids")
        xs.size() > 0
      }
      else false
    }.getOrElse(false)

为了使用Kafka主题,我使用了com.softwaremill.reactivekafka库。例如:

class KafkaConsumerActor extends Actor {
   val kafka = new ReactiveKafka()
   val config: ConsumerProperties[Array[Byte], Any] = ... // see docs

   override def preStart(): Unit = {
      super.preStart()

      val publisher = kafka.consume(config)
      Source.fromPublisher(publisher)
            .map(handleKafkaRecord)
            .to(Sink.ignore).run()
   }

   /**
     * This method will be invoked when any kafka records will happen.
     */
   def handleKafkaRecord(r: ConsumerRecord[Array[Byte], Any]) = {
      // handle record
   }
}