在 Apache Spark 中,累加器(accumulators)和广播变量(broadcast variables)这两种工具用于在分布式处理环境中共享数据,但它们各自有不同的用途和特点。
蓄能器聚合:累加器用于将工作节点收集到的信息聚合回驱动程序。它们通常用于收集统计数据或调试信息。
只允许工作节点写入:工作节点只能向累加器中添加数据,而不能读取其值。
更新:只有程序才能读取累加器的值,而工作进程只能执行结合性更新(例如,递增计数器)。
容错性:累加器具有容错性,Spark会自动管理以确保避免在任务由于故障而重新执行时出现重复计算。
使用时机:统计处理的记录数及处理中遇到的错误数。
from pyspark import SparkContext, SparkConf
conf = SparkConf().setAppName("AccumulatorExample")
sc = SparkContext(conf=conf)
# 创建一个累加器
accum = sc.accumulator(0)
def count_elements(x):
global accum
accum += 1
rdd = sc.parallelize([1, 2, 3, 4, 5])
rdd.foreach(count_elements)
print(f"元素总数: {accum.value}")
广播变量
广播变量能帮助我们将大数据集或值存放在内存中,这样所有节点就能高效共享,也不用多次发送数据了。
不可变:广播变量是不可变的。一旦创建,它们不能被进程或驱动程序修改。
高效的分发:Spark 仅向每个进程广播一次广播变量,从而减少通信量。
使用时机: 分享一个大型查找表或所有任务都需要的配置。
from pyspark import SparkContext, SparkConf
conf = SparkConf().setAppName("BroadcastExample") # 设置应用名称
sc = SparkContext(conf=conf)
# 创建广播变量
broadcast_var = sc.broadcast([1, 2, 3, 4, 5])
def process_element(x):
# 在处理元素时使用该广播变量
return x + sum(broadcast_var.value) # 返回元素加上广播变量的和
rdd = sc.parallelize([10, 20, 30, 40, 50]) # 并行化处理数据
result = rdd.map(process_element).collect() # 收集结果
print(result)
☑相似之处。
在工作节点之间共享:累加器(accumulators)和广播变量(broadcast variables)在Spark应用程序中共享。
均由驱动程序控制:两者均在驱动程序中初始化。
使用累加器来聚合整个集群的数据,使用广播变量来高效地将大型只读数据共享给所有节点。
数据工程奥德赛:数据工程师面试指南《数据工程奥德赛:数据工程师面试指南》电子书,Deepa Vasanthkumar Vadasserychalil…www.amazon.in