【发布时间】:2021-08-22 14:59:09
【问题描述】:
据我了解,Spark 的工作方式如下:
- 对于标准变量,驱动程序将它们与 lambda(或更好的闭包)一起发送给使用它们的每个任务的执行程序。
- 对于广播变量,驱动程序仅将它们发送给执行程序一次,即第一次使用它们。
当我们知道广播变量只使用一次时,使用广播变量而不是标准变量有什么好处,所以即使在标准变量的情况下也只有一次传输?
示例(Java):
public class SparkDriver {
public static void main(String[] args) {
String inputPath = args[0];
String outputPath = args[1];
Map<String,String> dictionary = new HashMap<>();
dictionary.put("J", "Java");
dictionary.put("S", "Spark");
SparkConf conf = new SparkConf()
.setAppName("Try BV")
.setMaster("local");
try (JavaSparkContext context = new JavaSparkContext(conf)) {
final Broadcast<Map<String,String>> dictionaryBroadcast = context.broadcast(dictionary);
context.textFile(inputPath)
.map(line -> { // just one transformation using BV
Map<String,String> d = dictionaryBroadcast.value();
String[] words = line.split(" ");
StringBuffer sb = new StringBuffer();
for (String w : words)
sb.append(d.get(w)).append(" ");
return sb.toString();
})
.saveAsTextFile(outputPath); // just one action!
}
}
}
【问题讨论】:
标签: apache-spark