如何在同一个Spark Streaming上运行多个操作

时间:2016-08-31 09:48:18

标签: apache-spark rabbitmq spark-streaming apache-spark-mllib

我正在使用Spark-streaming和RabbitMQ。因此,流工作从RabbitMQ获取数据并应用一些转换和操作。所以,我想知道如何在同一个流上应用多个动作(即计算两个不同的特征集)。可能吗?如果是,如何将流对象传递给代码中提到的多个类?

factor

如何从这里处理流:

factor(cond, labels = c("Profile 1", NA))

1 个答案:

答案 0 :(得分:5)

您可以在同一个dstream上运行多个操作,如下所示:

import net.minidev.json.JSONValue
import net.minidev.json.JSONObject

val config = ConfigFactory.parseFile(new File("SparkStreaming.conf"))
val conf = new SparkConf(true).setAppName(config.getString("AppName"))
conf.set("spark.cleaner.ttl", "120000")         

val sparkConf = new SparkContext(conf)
val ssc = new StreamingContext(sparkConf, Seconds(config.getLong("SparkBatchInterval")))

val rabbitParams =  Map("storageLevel" -> "MEMORY_AND_DISK_SER_2","queueName" -> config.getString("RealTimeQueueName"),"host" -> config.getString("QueueHost"), "exchangeName" -> config.getString("QueueExchangeName"), "routingKeys" -> config.getString("QueueRoutingKey"))
val receiverStream = RabbitMQUtils.createStream(ssc, rabbitParams)

val jsonStream = receiverStream.map(byteData => {
    JSONValue.parse(byteData)
})
jsonStream.filter(json => {
    var customerType = json.get("customerType")
    if(customerType.equals("consumer")) 
        true
    else 
        false
}).foreachRDD(rdd => {
    rdd.foreach(json => {
        println("json " + json)
    })
})

jsonStream.filter(json => {
    var customerType = json.get("customerType")
    if(customerType.equals("non-consumer")) 
              true
        else 
              false
}).foreachRDD(rdd => {
     rdd.foreach(json => {
            println("json " + json)
     })
})
ssc.start()
ssc.awaitTermination()  

在上面的代码片段中,我首先根据收到的流创建jsonStream,然后根据客户类型从中创建两个不同的流,然后对它们应用(foreachRDD)操作以打印结果

以类似的方式,您可以将相同的dstream传递给两个不同的类,并在其中应用转换和操作来计算不同的功能集。

我希望以上解释可以帮助您解决问题。

谢谢,
Hokam