Spark學習筆記(1)RDD

RDD

RDD(Resilient Distributed Dataset)叫做彈性分布式數(shù)據(jù)集,是Spark中最基本的數(shù)據(jù)抽象,它代表一個不可變昵济、可分區(qū)、里面的元素可并行計算的集合野揪。RDD具有數(shù)據(jù)流模型的特點:自動容錯访忿、位置感知性調(diào)度和可伸縮性。RDD允許用戶在執(zhí)行多個查詢時顯式地將工作集緩存在內(nèi)存中斯稳,后續(xù)的查詢能夠重用工作集海铆,這極大地提升了查詢速度。


RDD內(nèi)部結(jié)構(gòu).png

RDD5大特型

A list of partitions 一個分區(qū)列表
A function for computing each split 對每個切片的計算函數(shù)
A list of dependencies on other RDDs RDD內(nèi)部存放一個依賴列表(怎么變換來的)
Optionally, a Partitioner for key-value RDDs (e.g. to say that the RDD is hash-partitioned) 分區(qū)器 可選的
Optionally, a list of preferred locations to compute each split on (e.g. block locations for an HDFS file) 數(shù)據(jù)本地化 可選的

特性一

-- A list of partitions:
每個RDD分區(qū)都分布在集群節(jié)點上挣惰,分區(qū)的多少涉及到RDD Computing 并行效率卧斟。其實,分區(qū)只是一個邏輯概念憎茂,前后變換的分區(qū)珍语,可能是物理機器上同一塊內(nèi)存或者存儲,用戶可以指定分區(qū)數(shù)竖幔,默認是CPU核數(shù)板乙。如果從HDFS文件創(chuàng)建時數(shù)據(jù)塊數(shù)。
Spark中的io也是不可避免的拳氢,但是網(wǎng)絡(luò)傳輸Spark進行了優(yōu)化募逞,Spark把Rdd進行分區(qū),放在集群上并行計算馋评。同一個RDD分片100個放接,10個節(jié)點,平均每個節(jié)點10個分區(qū)留特,當進行sum時纠脾,網(wǎng)絡(luò)傳輸非常小,各自節(jié)點將計算好的sum值shuffle到主程序進行全局sum磕秤。所以會很快乳乌,但是進行join時候需要把數(shù)據(jù)本身進行shuffle捧韵,網(wǎng)絡(luò)開銷很大市咆。如果時做了分區(qū),就會將相同key在同一個分區(qū)中再来,按key進行聚合的時就不需要再shuffle了蒙兰。
RDD 分區(qū)的一個分配原則是:盡可能使得分區(qū)的個數(shù)磷瘤,等于集群核心數(shù)目。

  /**
   * Implemented by subclasses to return the set of partitions in this RDD. This method will only
   * be called once, so it is safe to implement a time-consuming computation in it.
   *
   * The partitions in this array must satisfy the following property:
   *   `rdd.partitions.zipWithIndex.forall { case (partition, index) => partition.index == index }`
   */
  protected def getPartitions: Array[Partition]

特性二

--A function for computing each split:
一個函數(shù)作用在一個分區(qū)上搜变。比如說一個分區(qū)有1采缚,2,3 在rdd1.map(_*10),把RDD里面的每一個元素取出來乘以10,每個分片都應(yīng)用這個map的函數(shù)挠他。

 @DeveloperApi 
 def compute(split: Partition, context: TaskContext): Iterator[T]

兩個參數(shù):1.分區(qū)對象 2.TaskContext對象
compute函數(shù)會對迭代器進行復合扳抽,不需要保存每次計算的結(jié)果
Spark支持兩個類型(算子)操作:Transformation和Action
主要做的是就是將一個已有的RDD生成另外一個RDD。Transformation具有l(wèi)azy特性(延遲加載)殖侵。Transformation算子的代碼不會真正被執(zhí)行贸呢。只有當我們的程序里面遇到一個action算子的時候,代碼才會真正的被執(zhí)行拢军。這種設(shè)計讓Spark更加有效率地運行楞陷。

特性三

--A list of dependencies on other RDDs RDD:


RDD依賴.png

窄依賴:是指每個父RDD的一個Partition最多被子RDD的一個Partition所使用,例如map,filter,union茉唉。(獨生子女)

寬依賴:是指一個父RDD的Partition會被多個子RDD的Partition所使用固蛾,例如groupBykey,reduceBykey,sortBykey等操作都會產(chǎn)生寬依賴。(超生)

在這里我們是從父RDD的partition被使用的個數(shù)來定義窄依賴和寬依賴度陆,因此可以用一句話概括下:如果父RDD的一個Partition被子RDD的一個Partition所使用就是窄依賴艾凯,否則的話就是寬依賴。因為是確定的partition數(shù)量的依賴關(guān)系坚芜,所以RDD之間的依賴關(guān)系就是窄依賴览芳;由此我們可以得出一個推論:即窄依賴不僅包含一對一的窄依賴,還包含一對固定個數(shù)的窄依賴鸿竖。

一對固定個數(shù)的窄依賴的理解:即子RDD的partition對父RDD依賴的Partition的數(shù)量不會隨著RDD數(shù)據(jù)規(guī)模的改變而改變沧竟;換句話說,無論是有100T的數(shù)據(jù)量還是1P的數(shù)據(jù)量缚忧,在窄依賴中悟泵,子RDD所依賴的父RDD的partition的個數(shù)是確定的,而寬依賴是shuffle級別的闪水,數(shù)據(jù)量越大糕非,那么子RDD所依賴的父RDD的個數(shù)就越多,從而子RDD所依賴的父RDD的partition的個數(shù)也會變得越來越多球榆。
從后往前推朽肥,遇到寬依賴就斷開,劃分為一個stage持钉;遇到窄依賴就將這個RDD加入該stage中

特性四

-- Optionally, a Partitioner for key-value RDDs (e.g. to say that the RDD is hash-partitioned) :
可選:key-value型的RDD是根據(jù)哈希來分區(qū)的衡招,類似于mapreduce當中的paritioner接口,控制Key分到哪個reduce每强。
一個partitioner始腾,即RDD的分片函數(shù)州刽。當前Spark中實現(xiàn)了兩種類型的分片函數(shù),一個是基于哈希的HashPartitioner浪箭,另外一個基于范圍的RangePartitioner穗椅。只有對于key-value的RDD,才會有Partitioner奶栖,非key-value的RDD的Partitioner的值是None匹表。Partitioner函數(shù)不但決定了RDD本身的分片數(shù)量,也決定了parent RDD Shuffle輸出時的分片數(shù)量宣鄙。類似hadoop的預分區(qū)桑孩。

特性五

Optionally, a list of preferred locations to compute each split on (e.g. block locations for an HDFS file) :
可選:每一分片的優(yōu)先計算位置,比如HDFS的block的所在位置應(yīng)該是優(yōu)先計算的位置框冀。
一個列表流椒,存儲存取每個Partition的優(yōu)先位置(preferred location)。對于一個HDFS文件來說明也,這個列表保存的就是每個Partition所在的塊的位置宣虾。按照“移動數(shù)據(jù)不如移動計算”的理念,Spark在進行任務(wù)調(diào)度的時候温数,會盡可能地將計算任務(wù)分配到其所要處理數(shù)據(jù)塊的存儲位置绣硝。

 /**
   * Implemented by subclasses to return the set of partitions in this RDD. This method will only
   * be called once, so it is safe to implement a time-consuming computation in it.
   *
   * The partitions in this array must satisfy the following property:
   *   `rdd.partitions.zipWithIndex.forall { case (partition, index) => partition.index == index }`
   */
  protected def getPartitions: Array[Partition]
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市撑刺,隨后出現(xiàn)的幾起案子鹉胖,更是在濱河造成了極大的恐慌,老刑警劉巖够傍,帶你破解...
    沈念sama閱讀 219,039評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件甫菠,死亡現(xiàn)場離奇詭異,居然都是意外死亡冕屯,警方通過查閱死者的電腦和手機寂诱,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來安聘,“玉大人痰洒,你說我怎么就攤上這事≡【拢” “怎么了丘喻?”我有些...
    開封第一講書人閱讀 165,417評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長念颈。 經(jīng)常有香客問我泉粉,道長,這世上最難降的妖魔是什么舍肠? 我笑而不...
    開封第一講書人閱讀 58,868評論 1 295
  • 正文 為了忘掉前任搀继,我火速辦了婚禮,結(jié)果婚禮上翠语,老公的妹妹穿的比我還像新娘叽躯。我一直安慰自己,他們只是感情好肌括,可當我...
    茶點故事閱讀 67,892評論 6 392
  • 文/花漫 我一把揭開白布点骑。 她就那樣靜靜地躺著,像睡著了一般谍夭。 火紅的嫁衣襯著肌膚如雪黑滴。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,692評論 1 305
  • 那天紧索,我揣著相機與錄音袁辈,去河邊找鬼。 笑死珠漂,一個胖子當著我的面吹牛晚缩,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播媳危,決...
    沈念sama閱讀 40,416評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼荞彼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了待笑?” 一聲冷哼從身側(cè)響起鸣皂,我...
    開封第一講書人閱讀 39,326評論 0 276
  • 序言:老撾萬榮一對情侶失蹤导俘,失蹤者是張志新(化名)和其女友劉穎句各,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蛹批,經(jīng)...
    沈念sama閱讀 45,782評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡仰泻,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,957評論 3 337
  • 正文 我和宋清朗相戀三年第租,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片我纪。...
    茶點故事閱讀 40,102評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡慎宾,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出浅悉,到底是詐尸還是另有隱情趟据,我是刑警寧澤,帶...
    沈念sama閱讀 35,790評論 5 346
  • 正文 年R本政府宣布术健,位于F島的核電站汹碱,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏荞估。R本人自食惡果不足惜咳促,卻給世界環(huán)境...
    茶點故事閱讀 41,442評論 3 331
  • 文/蒙蒙 一稚新、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧跪腹,春花似錦褂删、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至轴术,卻和暖如春难衰,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背逗栽。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評論 1 272
  • 我被黑心中介騙來泰國打工盖袭, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人彼宠。 一個月前我還...
    沈念sama閱讀 48,332評論 3 373
  • 正文 我出身青樓苍凛,卻偏偏與公主長得像,于是被迫代替她去往敵國和親兵志。 傳聞我的和親對象是個殘疾皇子醇蝴,可洞房花燭夜當晚...
    茶點故事閱讀 45,044評論 2 355

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