spark的基本原理
executor
worker
task
jobstage
dagscheduler
taskscheduler
rdd一些疑問
一些結論
spark是乙個以複雜計算為核心的大資料分析框架,是mapreduce的「後繼者」,具備高效性、通用性等特點。
spark最初在2023年由加州大學伯克利分校的amplab開發,並於2023年成為apache的開源專案之一,與hadoop和storm等其他大資料和mapreduce技術相比,spark提供的技術更加全面,速度更快(比mapreduce快一百倍)。
spark的技術生態包含了各種豐富的元件,而不同的元件提供了不同功能,以適應不同場景。
spark core包含spark的基本功能,定義了rdd的api以及以此為基礎的其他動作。spark的其他庫都構建在rdd和spark core之上。
提供通過hiveql與spark進行互動的api。每個資料庫表被當做乙個rdd,spark sql的查詢會被轉換為spark操作。
對實時資料流進行處理和控制。spark streaming允許程式能夠像普通rdd一樣處理實時資料。嚴格來說spark streaming並不是實時的,而是準實時(跟storm相比)。
乙個基於rdd的機器學習演算法庫,包含了可擴充套件的機器學習演算法。
控制圖、並行圖操作和計算的一組演算法和工具的集合。
在excutor程序中執行任務的單元,執行相同**段的多個task組成乙個stage。
由乙個action運算元觸發的乙個排程。
spark根據提交的作業**劃分出多個stages,每個stage有多個tasks,這些tasks負責並行處理他們所屬的stage裡面的**。
根據stage劃分原則構建的dag(有向無環圖,理解為執行流程還行),並將stage提交給taskscheduler。
taskscheduler將taskset提交給worker執行。
彈性分布式資料集。
resilient distributed dataset,是spark中最基本的資料抽象,它代表乙個不可變、可分割槽、元素可平行計算的集合。簡單點說,從資料檔案中獲取到的資料會被放到rdd中。
它具有資料流模型的特點:自動容錯、位置感知性排程和可伸縮性。它允許在執行多個查詢時顯式地將工作集快取在記憶體中,後續的查詢能夠重用工作集,這極大地提公升了查詢速度。
rdd的屬性
(1)一組分片(partition),即資料集的基本組成單位。對於rdd來說,每個分片都會被乙個計算任務處理,並決定平行計算的粒度。使用者可以在建立rdd時指定rdd的分片個數,如果沒有指定,那麼就會採用預設值。預設值就是程式所分配到的cpu core的數目。
(2)乙個計算每個分割槽的函式。spark中rdd的計算是以分片為單位的,每個rdd都會實現compute函式以達到這個目的。compute函式會對迭代器進行復合,不需要儲存每次計算的結果。
(3)rdd之間的依賴關係。rdd的每次轉換都會生成乙個新的rdd,所以rdd之間就會形成類似於流水線一樣的前後依賴關係。在部分分割槽資料丟失時,spark可以通過這個依賴關係重新計算丟失的分割槽資料,而不是對rdd的所有分割槽進行重新計算。
(4)乙個partitioner,即rdd的分片函式。當前spark中實現了兩種型別的分片函式,乙個是基於雜湊的hashpartitioner,另外乙個是基於範圍的rangepartitioner。只有對於於key-value的rdd,才會有partitioner,非key-value的rdd的parititioner的值是none。partitioner函式不但決定了rdd本身的分片數量,也決定了parent rdd shuffle輸出時的分片數量。
(5)乙個列表,儲存訪問每個partition的優先位置(preferred location)。對於乙個hdfs檔案來說,這個列表儲存的就是每個partition所在的塊的位置。按照「移動資料不如移動計算」的理念,spark在進行任務排程的時候,會盡可能地將計算任務分配到其所要處理資料塊的儲存位置。
/*
* pagerank 即網頁排名,又稱網頁級別,google左側排名,佩奇排名
* */
def pagerand()
:unit=
)val ranksbyusers = users.
join
(ranks)
.map
ranksbyusers.
foreach
(println)
}
從後往前推算,遇到shuffledependency就斷開,遇到narrowdependency就將其加入該stage。每個stage裡面task的數目由該stage最後乙個rdd中的partition個數決定。
reducebykey是個transformation運算元,但是它有shuffle,所以程式中遇到reducebykey時,也會劃分stage。
(1)stage是根據shuffle運算元來劃分的。每一次shuffle很有可能會有一次節點間資料傳輸的過程。會造成效能上的影響。
(2)同乙個stage中的task執行一樣的**塊。
(3)executor的記憶體主要會分成三塊:第一塊是讓task執行**時使用,預設佔executor總記憶體的20%;第二塊是讓task通過shuffle過程拉取了上乙個stage的task的輸出後,進行聚合等操作時使用,預設佔executor總記憶體的20%;第三塊是讓rdd持久化時使用,預設佔executor總記憶體的60%。
(4)task的執行速度跟每個executor程序的cpu core數量有直接關係。乙個cpu core同一時間只能執行乙個執行緒。而每個executor程序分配到的tasks,都是以「每個task對應乙個執行緒」的方式,多執行緒併發執行的。如果cpu core數量比較充足,而且分配到的task數量比較合理,那麼就可以快速高效地執行task
Spark快速大資料分析 RDD程式設計
rdd resilient distributed dataset 彈性分布式資料集 rdd就是乙個不可變的分布式物件集合。每個rdd都被分為多個分割槽,這些分割槽執行在集群中的不同節點。使用者可以通過2中方法建立rdd 1 讀取乙個外部資料集 sc.textfile test.txt 2 在驅動器...
Spark 大資料分析 MLlib,基本統計
statistics的colstats函式是列統計方法,該方法可以計算每列最大值 最小值 平均值 方差值 l1範數 l2範數。val datapath e scala testdata sample stat.txt val rdd sc.textfile datapath map split ma...
大資料分析平台Hadoop與Spark之爭
zd至頂網軟體頻道訊息 原創文章 文 鄧曉蕾 有人把大資料稱為資訊資產 有人稱為金礦 甚至社會財富。而大資料,即,無法在可承受的時間範圍內用常規軟體工具進行捕捉 管理和處理的資料集合。gartne認為 大資料 是需要新處理模式才能具有更強的決策力 洞察發現力和流程優化能力的海量 高增長率和多樣化的資...