第 8 章 RDD 编程进阶

共享变量问题

看下面的代码:

package day04

import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}

object AccDemo1 {
    def main(args: Array[String]): Unit = {
        val conf = new SparkConf().setAppName("Practice").setMaster("local[2]")
        val sc = new SparkContext(conf)
        val p1 = Person(10)
        // 将来会把对象序列化之后传递到每个节点上
        val rdd1 = sc.parallelize(Array(p1))
        val rdd2: RDD[Person] = rdd1.map(p => {p.age = 100; p})

        rdd2.count()
        // 仍然是 10
        println(p1.age)
    }
}

case class Person(var age:Int)

正常情况下, 传递给 Spark 算子(比如: map, reduce 等)的函数都是在远程的集群节点上执行, 函数中用到的所有变量都是独立的拷贝.

这些变量被拷贝到集群上的每个节点上, 都这些变量的更改不会传递回驱动程序.

支持跨 task 之间共享变量通常是低效的, 但是 Spark 对共享变量也提供了两种支持:

  1. 累加器

  2. 广播变量

Copyright © 尚硅谷大数据 2019 all right reserved,powered by Gitbook
该文件最后修订时间: 2019-08-09 00:21:43

results matching ""

    No results matching ""