簡體   English   中英

Spark:在本地模式下廣播使用情況

[英]Spark: Broadcast usage on local mode

我知道廣播允許將只讀副本保留在每台計算機上,而不是隨任務一起發送副本。 但是,我想知道廣播在本地模式下使用時是否會產生巨大影響,因為我沒有節點集群。 還是可以在本地模式下不進行廣播就可以使用? 我只是想了解它的用法。

Spark版本#2.0,Scala版本#2.10本地模式-8Cores CPU 64GB RAM

我有類似以下內容:

case class EmpDim(name: String,age: Int)

empDF
+-----+-------+------+
|EmpId|EmpName|EmpAge|
+-----+-------+------+
|    1|   John|    32|
|    2|  David|    45|
+-----+-------+------+

deptDF
+------+--------+-----+
|DeptID|DeptName|EmpID|
+------+--------+-----+
|     1|   Admin|    1|
|     2|      HR|    2|
|     3| Finance|    4|
+------+--------+-----+

val empRDD = empDF.rdd.map(x => (x.getInt(0), EmpDim(x.getString(1), x.getInt(2))))

val lookupMap = empRDD.collectAsMap() //Without Broadcast
val broadCastLookupMap: Broadcast[Map[Int,EmpDim]] = sc.broadcast(empRDD.collectAsMap()) //With Broadcast

def lookup(lookupMap:Map[Int,EmpDim]) = udf[Option[EmpDim],Int]((empID:Int) => lookupMap.lift(empID))

val combinedDF = deptDF.withColumn("lookupEmp",lookup(lookupMap)($"EmpID")) //Without Broadcast
                       .withColumn("broadCastLookupEmp",lookup(broadCastLookupMap.value)($"EmpID")) //With Broadcast
                       .withColumn("EmpName",coalesce($"lookupEmp.name",lit("Unknown - No Name to Lookup")))
                       .withColumn("EmpAge",coalesce($"lookupEmp.age",lit("Unknown - No Age to Lookup")))
                       .drop("lookupEmp")
                       .drop("broadCastLookupEmp")

+------+--------+-----+---------------------------+--------------------------+
|DeptID|DeptName|EmpID|EmpName                    |EmpAge                    |
+------+--------+-----+---------------------------+--------------------------+
|1     |Admin   |1    |John                       |32                        |
|2     |HR      |2    |David                      |45                        |
|3     |Finance |4    |Unknown - No Name to Lookup|Unknown - No Age to Lookup|
+------+--------+-----+---------------------------+--------------------------+

在上述情況下,建議使用廣播還是過分的? 請指教

像這樣使用時,廣播根本沒有任何價值。

你打電話時:

lookup(broadCastLookupMap.value)($"EmpID")

broadCastLookupMap.value將根據Scala替換模型在本地進行評估。

正確的實現將是:

def lookup(lookupMap: Broadcast[Map[Int, EmpDim]]) = udf[Option[EmpDim],Int](
  (empID:Int) => lookupMap.value.lift(empID)
)

並稱為:

lookup(broadCastLookupMap)($"EmpID")

根據實際執行計划,這可能會產生一些積極影響。 本地或非本地模式-適用相同規則

  • 如果在階段之間(顯式或隱式)重用數據,廣播將很有用。
  • 如果數據在管道中僅使用一次,則標准的閉包/參數處理機制就足夠了。

這里沒有什么可以建議第一種情況,因此廣播應該過時了,但是如果您想確定的話,請使用實時環境測試兩種解決方案並比較結果。

通過名稱調用也應該起作用:

def lookup(lookupMap: => Map[Int,EmpDim]) = udf[Option[EmpDim],Int](
  (empID:Int) => lookupMap.lift(empID)
)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM