Apache Spark Broadcast变量是Broadcast类型吗?不是RDD?

时间:2016-01-18 21:54:41

标签: java python scala apache-spark

只是试图澄清某些东西,一些悬而未决的成果,通过在另一个问题中观察用户尝试在广播变量上调用RDD操作而产生的问题?那是对的,对吧?

问题是: Spark广播变量不是RDD,对吗?它是Scala的一个集合,我看到了吗?

查看Scala文档:http://spark.apache.org/docs/latest/api/scala/index.html#org.apache.spark.broadcast.Broadcast

所以它在创建时分配了什么子类型,传递给它的子类型是什么?就像这是一个Java ArrayList一样,它将是一个整数的ArrayList?所以

sc.broadcast([0,1,2])会用scala-notation创建一个Broadcast [Array [Int]]吗?

scala> val broadcastVar = sc.broadcast(Array(1, 2, 3))
broadcastVar: org.apache.spark.broadcast.Broadcast[Array[Int]] = Broadcast(0)

scala> broadcastVar.value
res0: Array[Int] = Array(1, 2, 3)

(我确实为了一个明确的直接回答而进行了相当多的搜索,但它必须是一个基本的问题,但是理解起来非常重要,谢谢。)

很好,但没有必要获得有关Python对广播做什么的一些信息,我假设它调用底层的Scala类,并将它作为Scala Broadcast类型存储在引擎盖下?

1 个答案:

答案 0 :(得分:1)

广播变量不是RDD,但它也不一定是scala集合。基本上你应该把广播变量看作是每个机器本地的局部变量。每个工作人员都会收到您所播放的任何内容的副本,因此您不必担心将其分配给特定的RDD值。

使用和RDD的最佳时间是当你有一个相当大的对象时,你需要对RDD中的大多数值。

一个例子是

val zipCodeHash:HashMap[(Int, List[Resident])] //potentially a very large hashmap
val BVZipHash = sc.broadcast(zipCodeHash)

val zipcodes:Rdd[String] = sc.textFile("../zipcodes.txt")

val allUsers = zipcodes.flatMap(a => BVZipHash.value((a.parseInt)))

在这种情况下,由于hashmap可能非常大,因此为map函数中的每个值创建一个新副本将非常浪费。

我希望这有帮助!

编辑:我的代码中的一些小错误

EDIT2:

稍微了解一下Broadcast变量的实际内容:

广播变量实际上是Broadcast类型的变量,它可以包含任何类(从Int到您创建的任何对象的任何类型)。它绝不是一个scala集合。所有广播类实际上都提供了两种方法之一,即有效地将数据传输给所有工作人员以重新创建值(内部火花有一个类似于P2P的广播系统,尽管它也允许http传输,尽管我是不确定它是什么时候。)

有关广播变量是什么以及使用方式的更多信息,我建议您查看以下链接:

http://spark.apache.org/docs/latest/programming-guide.html#broadcast-variables

我也强烈建议您阅读本书,因为它对我很有帮助:

http://shop.oreilly.com/product/0636920028512.do