目錄
1.Spark中的共享變量
在spark程序中,當一個傳遞給Spark操作(例如map和reduce)的函數在遠程節點上面運行時,Spark操作實際上操作的是這個函數所用變量的一個獨立副本。這些變量會被複制到每臺機器上,並且這些變量在遠程機器上的所有更新都不會傳遞迴驅動程序。通常跨任務的讀寫變量是低效的,但是,Spark還是爲兩種常見的使用模式提供了兩種有限的共享變量:廣播變(broadcast variable)和累加器(accumulator)
1.1 廣播變量
爲什麼使用廣播變量
當在Executor端用到了Driver變量,不使用廣播變量,在每個Executor中有多少個task就有多少個Driver端變量副本,當task數很多時,Driver端的帶寬就會成爲系統的瓶頸,並且會消耗大量task服務器的資源。
如果使用廣播變量在每個Executor端中只有一份Driver端的變量副本。
廣播變量圖解
不使用廣播變量
使用廣播變量
使用廣播變量
定義一個廣播變量
val a = 3
val broadcast = sc.broadCast(3)
獲取變量的值
val value = broadcast.value()
注意:
- 能不能將一個RDD使用廣播變量廣播出去?不能,因爲RDD是不存儲數據的。可以將RDD的結果廣播出去。
- 廣播變量只能在Driver端定義,不能在Executor端定義。
- 在Driver端可以修改廣播變量的值,在Executor端無法修改廣播變量的值。
- 如果executor端用到了Driver的變量,如果不使用廣播變量在Executor有多少task就有多少Driver端的變量副本。
- 如果Executor端用到了Driver的變量,如果使用廣播變量在每個Executor中只有一份Driver端的變量副本。
規則庫,中間庫,知識庫數據等,穩定,會被數據分析被頻繁的使用到。數據量不會太大。 這些數據,就優先考慮把這些數據進行廣播。
1.2 累計器
爲什麼要使用累加器?
在spark應用程序中,我們經常會有這樣的需求,如異常監控,調試,記錄符合某特性的數據的數目,這種需求都需要用到計數器,如果一個變量不被聲明爲一個累加器,那麼它將在被改變時不會再driver端進行全局彙總,即在分佈式運行時每個task運行的只是原始變量的一個副本,並不能改變原始變量的值,但是當這個變量被聲明爲累加器後,該變量就會有分佈式計數的功能。
例如
// 計數器
var counts = 0 // Driver端定義的
val rdd1 = sc.makeRDD(List(1, 3, 4, 5, 6, 7, 9), 2)
// 統計 數據的條數 executor端執行的
rdd1.foreach(t => {
counts += 1
println(s"---+${counts}")
})
// 期望:7 實際:0 // Driver端的數據沒有變
println(counts)
累加器圖解
不是用累加器,
使用累加器
使用累加器
定義一個累加器
val accumulator = sc.accumulator(0)
獲取累加器的值
val value = accumulator.value
自定義累計器 ,實現AccumulatorParam<xxx> 實現三個方法zero,addAccumulator,addInPlace
val accumulator = sc.accumulator(xxx,new AccumulatorParam...)
accumulator.add(xxxx)
注意事項
累計器只能在Driver定義初始化,在Executor端更新,在Executor不能accumulator.value獲取值。
2. Spark WEBUI
4040端口可以看到當前application中的所有的job,點擊job可以看到當前job下對應的stage,點擊stage出現stage下的task。
3. 搭建歷史服務器HistoryServer
1).在客戶端中../conf/spark-defaults.conf文件中配置:
- 開啓記錄事件日誌的功能
spark.eventLog.enabled true
- 設置事件日誌存儲的目錄
spark.eventLog.dir hdfs://hadoop101:9000/spark/log
- 設置HistoryServer加載事件日誌的位置(恢復時加載歷史文件的路徑,就是你存儲事件日誌的路徑)
spark.history.fs.logDirectory hdfs://node1:9000/spark/log
- 日誌優化選項,壓縮日誌(記錄的歷史事件日誌沒有壓縮)
spark.eventLog.compress true
2).啓動HistoryServer:
在../conf/sbin/start-history-server.sh
3).訪問:node4:18080
搭建了歷史服務器HistoryServer後,就算是application推出之後,也可以查看歷史事件日誌記錄
4.Master HA
Master是JVM進程有可能掛掉,當Master掛掉之後,不能提交Driver,我們需要搭建Master HA
- FileSystem 保存元數據,需要手動切換備用Master
- Zookeeper 分佈式協調服務,保存元數據,自動切換
- 在集羣的每臺節點../conf/spark-env.sh 中配置:
export SPARK_DAEMON_JAVA_OPTS="
-Dspark.deploy.recoveryMode=ZOOKEEPER
-Dspark.deploy.zookeeper.url=hadoop101:2181,hadoop102:2181,hadoop103:2181
-Dspark.deploy.zookeeper.dir=/MasterHA"
- 在StandBy-Master(hadoop102)節點中修改../conf/spark-env.sh:SPARK_MASTER_IP = hadoop102
- 啓動Zookeeper
- 在Alive-Master節點上啓動集羣:../sbin/start-all.sh
- 在StandBy-Master節點上啓動StandBy-Master ../sbin/start-master.sh
- 測試。
注意:
a).這裏的Master HA是針對的standAlone集羣
b).主備切換過程中,不影響已經在集羣中運行的程序
c).主備切換過程中,影響向Master申請資源。