在Apache Spark中,同样存在类似于DistributedCache的功能,称为“广播变量”(Broadcast variable)。其实现原理与DistributedCache非常类似,但提供了更多的数据/文件广播算法,包括高效的P2P算法,该算法在节点数目非常多的场景下,效率远远好于DistributedCache这种基于HDFS共享存储的方式,具体比较可参考“Performance and Scalability of Broadcast in Spark”。使用MapReduce DistributedCache时,用户需要显示地使用File API编写程序从本地读取小表数据,而Spark则不用,它借助Scala语言强大的函数闭包特性,可以隐藏数据/文件广播过程,让用户编写程序更加简单。
假设两个文件,一小一大,且格式类似为:
Key,value,value
Key,value,value
复制代码
则利用Spark实现map-side的算法如下:
var table1 = sc.textFile(args(1))
var table2 = sc.textFile(args(2))
// table1 is smaller, so broadcast it as a map<String, String>
var pairs = table1.map { x =>
var pos = x.indexOf(',')
(x.substring(0, pos), x.substring(pos + 1))
}.collectAsMap
var broadCastMap = sc.broadcast(pairs) //save table1 as map, and broadcast it
// table2 join table1 in map side
var result = table2.map { x =>
var pos = x.indexOf(',')
(x.substring(0, pos), x.substring(pos + 1))
}.mapPartitions({ iter =>
var m = broadCastMap.value
for{
(key, value) <- iter
if(m.contains(key))
} yield (key, (value, m.get(key).getOrElse("")))
})
result.saveAsTextFile(args(3)) //save result to local file or HDFS