我是Spark Streaming的新手,我的群集中有5个工作节点。目标是使用Kafka主题并将其直接保存到NoSql数据库(如HBase或DynamoDB)中。 我试图理解Spark如何处理Kafka Consumer实例并将它们分发到Workers (Spark 0.9.0和Kafka 0.8)。
如果我通过
创建Kafka流 val topicMap = Map("myTopic" -> 1)
val kafkaDStream = KafkaUtils.createStream(ssc, zookeeper, group, topicMap).map(_._2)
并运行像
这样的流操作 val valueStream = kafkaDStream.map(
s => {
val json = new JsonWrapper
val js = json.parse(s)
val a = (js \ "a").toString
val b = (js \ "b").toString
val c = (js \ "c").toString
(a, b, c)
}
)
valueStream.foreachRDD(
rdd => {
rdd.foreach(
row => // put (a,b,c) into DB (HBase or DynamoDB)
)
}
)
ssc.start()
ssc.awaitTermination()
Kafka消费者究竟在哪里创建?驱动程序是否构建了Consumer实例并将它们发送给了worker,或者worker是否根据需要创建了Consumer?
以下是JsonWrapper的更多详细信息,以备不时之需:
import play.api.libs.json.Json
class JsonWrapper extends Serializable {
lazy val jsObj = Json
def parse(s: String) = jsObj.parse(s)
}
此类懒惰引用Json单例(通过Play),并在程序启动时发送给每个worker。