Spark共享變量-累加器和廣播變量

通常情況下裹刮,當(dāng)向Spark操作(如map,reduce)傳遞一個函數(shù)時,它會在一個遠程集群節(jié)點上執(zhí)行斗埂,它會使用函數(shù)中所有變量的副本端衰。這些變量被復(fù)制到所有的機器上叠洗,遠程機器上并沒有被更新的變量會向驅(qū)動程序回傳。在任務(wù)之間使用通用的旅东,支持讀寫的共享變量是低效的灭抑。盡管如此,Spark提供了兩種有限類型的共享變量抵代,廣播變量和累加器腾节。

1.累加器

提供了將工作節(jié)點中的值聚合到驅(qū)動器程序中的簡單語法。累加器的一個常見的用途是在調(diào)試時對作業(yè)的執(zhí)行過程中事件進行計數(shù)。

一個計算空行的例子

import org.apache.spark.{SparkContext, SparkConf}

/**
  * Created by chh on 2016/5/22.
  */
object Counter {
  def main(args :Array[String]): Unit = {
    //創(chuàng)建一個scala版本的SparkContext
    val conf = new SparkConf().setAppName("Counter").setMaster("local")
    val sc = new SparkContext(conf)
    val file=sc.textFile("file.txt")
    val blankLines =sc.accumulator(0)//創(chuàng)建Accumulator[Int]并初始化為0
    val callSigns =file.flatMap(line => {
        if(line == ""){
          blankLines += 1 //累加器加一
        }
        line.split(" ")
      })
    callSigns.saveAsTextFile("output.txt")
    println(blankLines.value)
  }
}

注:
1.累加器的值只有在驅(qū)動器程序中訪問案腺,所以檢查也應(yīng)當(dāng)在驅(qū)動器程序中完成庆冕。
2.對于行動操作中使用的累加器,Spark只會把每個任務(wù)對各累加器的修改應(yīng)用一次劈榨。因此如果想要一個無論在失敗還是在重新計算時候都絕對可靠的累加器访递,必須把它放在foreach()這樣的行動操作中。
而轉(zhuǎn)化操作最好在調(diào)試中使用

2.廣播變量

廣播變量允許程序員將一個只讀的變量緩存在每臺機器上同辣,而不用在任務(wù)之間傳遞變量拷姿。廣播變量可被用于有效地給每個節(jié)點一個大輸入數(shù)據(jù)集的副本。
一個Executor只需要在第一個Task啟動時邑闺,獲得一份Broadcast數(shù)據(jù)跌前,之后的Task都從本節(jié)點的BlockManager中獲取相關(guān)數(shù)據(jù)。
步驟

1.調(diào)用SparkContext.broadcast方法創(chuàng)建一個Broadcast[T]對象陡舅。
  任何序列化的類型都可以這么實現(xiàn)。
2.通過value屬性訪問改對象的值(Java之中為value()方法)
3.變量只會被發(fā)送到各個節(jié)點一次伴挚,應(yīng)作為只讀值處理(修改這個值不會影響到別的節(jié)點)
Paste_Image.png

修改為:.廣播變量方式


Paste_Image.png

3.分區(qū)操作

(1)mapPartitions
def mapPartitions[U](f: (Iterator[T]) => Iterator[U], preservesPartitioning: Boolean = false)(implicit arg0: ClassTag[U]): RDD[U]
該函數(shù)和map函數(shù)類似靶衍,只不過映射函數(shù)的參數(shù)由RDD中的每一個元素變成了RDD中每一個分區(qū)的迭代器。如果在映射的過程中需要頻繁創(chuàng)建額外的對象(如數(shù)據(jù)庫連接對象)茎芋,使用mapPartitions要比map高效的多颅眶。
比如,將RDD中的所有數(shù)據(jù)通過JDBC連接寫入數(shù)據(jù)庫田弥,如果使用map函數(shù)涛酗,可能要為每一個元素都創(chuàng)建一個connection,這樣開銷很大偷厦,如果使用mapPartitions商叹,那么只需要針對每一個分區(qū)建立一個connection。

var rdd1 = sc.makeRDD(1 to 5,2)
//rdd1有兩個分區(qū)
scala> var rdd3 = rdd1.mapPartitions{ x => {
     | var result = List[Int]()
     |     var i = 0
     |     while(x.hasNext){
     |       i += x.next()
     |     }
     |     result.::(i).iterator
     | }}
rdd3: org.apache.spark.rdd.RDD[Int] = MapPartitionsRDD[84] at mapPartitions at :23
 
//rdd3將rdd1中每個分區(qū)中的數(shù)值累加
scala> rdd3.collect
res65: Array[Int] = Array(3, 12)
scala> rdd3.partitions.size
res66: Int = 2

(2)mapPartitionsWithIndex
def mapPartitionsWithIndex[U](f: (Int, Iterator[T]) => Iterator[U], preservesPartitioning: Boolean = false)(implicit arg0: ClassTag[U]): RDD[U]
函數(shù)作用同mapPartitions只泼,不過提供了兩個參數(shù)剖笙,第一個參數(shù)為分區(qū)的索引。

<template>
    <div>
        <div class="type-item">
            <div class="type-image">
            </div>
            <div class="content">
                <h3>個人</h3>
                <p>
                    適合垂直領(lǐng)域?qū)<仪氤⒁庖婎I(lǐng)袖等自媒體人士申請
                </p>
            </div>
            <div class="enter" @click="nextStage('個人')">
                <span>入駐</span>
            </div>
        </div>
        <div class="type-item">
            <div class="type-image">
            </div>
            <div class="content">
                <h3>媒體</h3>
                <p>
                    面向報紙弥咪、雜志、電視十绑、廣播等其他以內(nèi)容生產(chǎn)為主的組織機構(gòu)
                </p>
            </div>
            <div class="enter"  @click="nextStage('媒體')">
                <span>入駐</span>
            </div>
        </div>
        <div class="type-item">
            <div class="type-image">
            </div>
            <div class="content">
                <h3>企業(yè)/機構(gòu)</h3>
                <p>
                    面向企業(yè)聚至、公司、分支機構(gòu)本橙、社團扳躬、民間組織等機構(gòu)團體
                </p>
            </div>
            <div class="enter" @click="nextStage('企業(yè)/機構(gòu)')">
                <span>入駐</span>
            </div>
        </div>
        <div class="type-item">
            <div class="type-image">
            </div>
            <div class="content">
                <h3>政府</h3>
                <p>
                    面向國內(nèi)各省市區(qū)的各級黨政機關(guān)
                </p>
            </div>
            <div class="enter" @click="nextStage('政府')">
                <span>入駐</span>
            </div>
        </div>
    </div>
</template>
<script>
    export default {
        data : function(){
            return {
              
            }
        },
        methods: {
            nextStage: function(type) {
                console.log(type);
                window.location.href="#/registor/fill"
            }
        }
    }
</script>
<style scoped>
   .type-item {
        position: relative;
        box-sizing: border-box;
        padding: 40px 140px 30px 150px;
        border-bottom: 1px solid #cdcdcd;/*no*/
   }
    .type-item:nth-of-type(1) {
        margin-top: 40px;
    }
    .type-item:nth-of-type(1) .type-image{
        background-image: url('../../assets/images/registor/geren.png');
    }
    .type-item:nth-of-type(2) .type-image{
        background-image: url('../../assets/images/registor/meiti.png');
    }
    .type-item:nth-of-type(3) .type-image{
        background-image: url('../../assets/images/registor/qiye.png');
    }
    .type-item:nth-of-type(4) .type-image{
        background-image: url('../../assets/images/registor/zhengfu.png');
    }

   .type-item:nth-last-of-type(1) {
        border-bottom: 0px;
        margin-bottom: 80px;
   }
   .type-item  .type-image {
        position: absolute;
        left: 0px; 
        width: 118px;
        height: 118px;
        border-radius: 50%;
        background-color: #fdb300;
        background-repeat: no-repeat;
        background-size: 55px 50px;
        background-position: center;
        border-bottom: 1px solid #cdcdcd;
   }
   .type-item .content h3 {
        font-size: 34px;
        line-height: 45px;
        color: #666666;
        margin-top: -5px;
   }
   .type-item .content p {
        font-size:26px;
        color: #999999;
        margin-top: 16px;
   }
   .type-item .enter {
        position: absolute;
        box-sizing: border-box;
        top: 50%;
        -webkit-transform: translate(0, -50%);
        transform: translate(0, -50%);
        right: 0px;
        width: 120px;
        font-size: 26px;
        color: #666666;
        border-radius: 10px;
        border: 2px solid #fdb300;
        text-align: center;
        vertical-align: center;
        padding: 15px 0px;
   }
   
</style>

var rdd1 = sc.makeRDD(1 to 5,2)
//rdd1有兩個分區(qū)
var rdd2 = rdd1.mapPartitionsWithIndex{
        (x,iter) => {
          var result = List[String]()
            var i = 0
            while(iter.hasNext){
              i += iter.next()
            }
            result.::(x + "|" + i).iterator
           
        }
      }
//rdd2將rdd1中每個分區(qū)的數(shù)字累加,并在每個分區(qū)的累加結(jié)果前面加了分區(qū)索引
scala> rdd2.collect
res13: Array[String] = Array(0|3, 1|12)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市坦报,隨后出現(xiàn)的幾起案子库说,更是在濱河造成了極大的恐慌,老刑警劉巖片择,帶你破解...
    沈念sama閱讀 217,907評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件潜的,死亡現(xiàn)場離奇詭異,居然都是意外死亡字管,警方通過查閱死者的電腦和手機啰挪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來嘲叔,“玉大人亡呵,你說我怎么就攤上這事×蚋辏” “怎么了锰什?”我有些...
    開封第一講書人閱讀 164,298評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長丁逝。 經(jīng)常有香客問我汁胆,道長,這世上最難降的妖魔是什么霜幼? 我笑而不...
    開封第一講書人閱讀 58,586評論 1 293
  • 正文 為了忘掉前任嫩码,我火速辦了婚禮,結(jié)果婚禮上罪既,老公的妹妹穿的比我還像新娘铸题。我一直安慰自己,他們只是感情好琢感,可當(dāng)我...
    茶點故事閱讀 67,633評論 6 392
  • 文/花漫 我一把揭開白布丢间。 她就那樣靜靜地躺著,像睡著了一般猩谊。 火紅的嫁衣襯著肌膚如雪千劈。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,488評論 1 302
  • 那天牌捷,我揣著相機與錄音墙牌,去河邊找鬼。 笑死暗甥,一個胖子當(dāng)著我的面吹牛喜滨,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播撤防,決...
    沈念sama閱讀 40,275評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼虽风,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起辜膝,我...
    開封第一講書人閱讀 39,176評論 0 276
  • 序言:老撾萬榮一對情侶失蹤无牵,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后厂抖,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體茎毁,經(jīng)...
    沈念sama閱讀 45,619評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,819評論 3 336
  • 正文 我和宋清朗相戀三年忱辅,在試婚紗的時候發(fā)現(xiàn)自己被綠了七蜘。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,932評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡墙懂,死狀恐怖橡卤,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情损搬,我是刑警寧澤碧库,帶...
    沈念sama閱讀 35,655評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站场躯,受9級特大地震影響谈为,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜踢关,卻給世界環(huán)境...
    茶點故事閱讀 41,265評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望粘茄。 院中可真熱鬧签舞,春花似錦、人聲如沸柒瓣。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,871評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽芙贫。三九已至搂鲫,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間磺平,已是汗流浹背魂仍。 一陣腳步聲響...
    開封第一講書人閱讀 32,994評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留拣挪,地道東北人擦酌。 一個月前我還...
    沈念sama閱讀 48,095評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像菠劝,于是被迫代替她去往敵國和親赊舶。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,884評論 2 354

推薦閱讀更多精彩內(nèi)容