逐漸意識(shí)到光會(huì)用Spark是遠(yuǎn)遠(yuǎn)不夠的,得了解基本原理和內(nèi)部實(shí)現(xiàn)。遂學(xué)習(xí)《大規(guī)模數(shù)據(jù)處理實(shí)戰(zhàn)》,本文為學(xué)習(xí)筆記。
MapReduce的缺點(diǎn)
- 維護(hù)成本高
- 時(shí)間達(dá)不到用戶期望
- 抽象層次低,大部分邏輯都需要用戶手動(dòng)開(kāi)發(fā)
- 很多場(chǎng)景不適合用Map&Reduce來(lái)描述
- 每一個(gè)Job的計(jì)算結(jié)果都會(huì)存儲(chǔ)在HDFS,每一步計(jì)算都需要的讀取和寫(xiě)入
- 欠缺對(duì)流數(shù)據(jù)處理的支持
Spark
- MapReduce是多進(jìn)程模型,多進(jìn)程模型便于細(xì)粒度的控制每個(gè)任務(wù)占用的資源,但是會(huì)消耗較多的啟動(dòng)時(shí)間。Spark的并行機(jī)制是多線程模型,同一節(jié)點(diǎn)的任務(wù)以多線程的方式運(yùn)行在一個(gè)JVM進(jìn)程中,啟動(dòng)速度更快,CPU利用率更高,內(nèi)存共享更好。
RDD
- Resilient Distributed Dataset,可以被分區(qū)、只讀,Spark最基本的數(shù)據(jù)結(jié)構(gòu)。
- 中間數(shù)據(jù)緩存在內(nèi)存中,減少硬盤讀寫(xiě),加快處理速度。
-
每個(gè)分區(qū)指向一個(gè)存放在內(nèi)存中或硬盤中的數(shù)據(jù)塊,每個(gè)數(shù)據(jù)塊是獨(dú)立的,可以被存放在不同的節(jié)點(diǎn),故天然支持并行操作。
RDD 的分區(qū)邏輯結(jié)構(gòu) - 已有的RDD不可被改變,可以對(duì)現(xiàn)有的RDD進(jìn)行轉(zhuǎn)換,得到新的RDD
- 記錄RDD的依賴關(guān)系,不需要立刻去存儲(chǔ)計(jì)算出來(lái)的數(shù)據(jù)
- 提高Spark的計(jì)算效率,并且是錯(cuò)誤恢復(fù)更加容易,因?yàn)楫?dāng)?shù)贜步輸出RDD節(jié)點(diǎn)發(fā)生故障時(shí),只需要從第N-1步的RDD出發(fā),再次計(jì)算即可。
-
RDD結(jié)構(gòu):
RDD結(jié)構(gòu)- SparkContext是與Spark節(jié)點(diǎn)的連接,一個(gè)線程只有一個(gè)SparkContext
- SparkConf是參數(shù)配置信息
- Partitions是RDD中數(shù)據(jù)的邏輯結(jié)構(gòu),每個(gè)Partition映射到某個(gè)節(jié)點(diǎn)內(nèi)存或硬盤的一個(gè)數(shù)據(jù)塊
- Partitioner決定分區(qū)方式,主流Hash和Range
- Dependencies存儲(chǔ)依賴關(guān)系,通過(guò)哪個(gè)RDD經(jīng)過(guò)哪個(gè)轉(zhuǎn)換得到的
- 窄依賴:每個(gè)分區(qū)可以并行處理產(chǎn)生,map、filter等??梢灾С滞粋€(gè)節(jié)點(diǎn)上鏈?zhǔn)綀?zhí)行多條命令;失敗恢復(fù)更有效,只需要重新計(jì)算丟失的父分區(qū)即可。
- 寬依賴:必須等父RDD所有分區(qū)都計(jì)算好后才可以開(kāi)始處理,join、groupBy等。需要等父分區(qū)都是可用的;失敗恢復(fù)牽涉到多個(gè)父分區(qū)。

