继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

Spark累加器和广播变量

拉莫斯之舞
关注TA
已关注
手记 306
粉丝 24
获赞 108

在 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
打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP