为了账号安全,请及时绑定邮箱和手机立即绑定

Spark累加器和广播变量

在 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
点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消