![](/img/trans.png)
[英]Why does Spark fail with “Failed to get broadcast_0_piece0 of broadcast_0” in local mode?
[英]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.