spark學習(四):共享變量及一些優化

目錄

1.Spark中的共享變量

1.1 廣播變量

1.2 累計器

2. Spark WEBUI

3. 搭建HistoryServer

4.Master HA


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()
     
注意:

  1. 能不能將一個RDD使用廣播變量廣播出去?不能,因爲RDD是不存儲數據的。可以將RDD的結果廣播出去。
  2. 廣播變量只能在Driver端定義,不能在Executor端定義。
  3. 在Driver端可以修改廣播變量的值,在Executor端無法修改廣播變量的值。
  4. 如果executor端用到了Driver的變量,如果不使用廣播變量在Executor有多少task就有多少Driver端的變量副本。
  5. 如果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

  1. FileSystem  保存元數據,需要手動切換備用Master
  2. 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申請資源。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章