Spark流:使用参考数据丰富流

bot*_*kop 4 streaming apache-spark

我有火花流设置,以便它从套接字读取,在将数据发布到兔子队列之前对数据进行一些丰富.在通过在设置流上下文之前读取常规文本文件(Source.fromFile ...)来实例化的Map中,富集查找信息.

我有一种感觉,这不是应该做的事情.另一方面,当使用StreamingContext时,我只能读取流,而不能读取静态文件,因为我可以使用SparkContext.

我可以尝试允许多个上下文,但我不确定这是否也是正确的方法.

任何建议将不胜感激.

maa*_*asg 7

假设用于丰富的地图在内存中保存得相当小,在Spark作业中使用该数据的推荐方法是通过广播变量.此变量的内容将一次发送给每个执行程序,从而避免了序列化在闭包中捕获的数据集的开销.

广播变量是在驱动程序中实例化的包装器,并且使用broadcastVar.value闭包中的方法"解包"数据.

这将是如何将广播变量与DStream一起使用的示例:

// could replace with Source.from File as well. This is just more practical
val data = sc.textFile("loopup.txt").map(toKeyValue).collectAsMap() 
// declare the broadcast variable
val bcastData = sc.broadcast(data)

... initialize streams ...

socketDStream.map{ elem => 
    // doing every step here explicitly for illustrative purposes. Usually, one would typically just chain these calls
    // get the map within the broadcast wrapper
    val lookupMap = bcastData.value
    // use the map to lookup some data
    val lookupValue = lookupMap.getOrElse(elem, "not found")
    // create the desired result
    (elem, lookupValue)
}
socketDStream.saveTo...
Run Code Online (Sandbox Code Playgroud)