大資料之——認識spark
什么是spark?
-
wiki:Apache Spark是一個開源集群運算框架,最初是由加州大學柏克萊分校AMPLab所開發,相對于Hadoop的MapReduce會在運行完作業后將中介資料存放到磁盤中,Spark使用了存盤器內運算技術,能在資料尚未寫入硬碟時即在存盤器內分析運算,Spark在存盤器內運行程式的運算速度能做到比Hadoop MapReduce的運算速度快上100倍,即便是運行程式于硬碟時,Spark也能快上10倍速度,[1]Spark允許用戶將資料加載至集群存盤器,并多次對其進行查詢,非常適合用于機器學習演算法,[2]
-
通過官方檔案的介紹我們了解到了Spark就是一個開源的大資料集群運算框架,對于我們已知的大資料運算運算框架MapReduce來講是類似的計算框架,只不過兩者在設計上有區別,也從而導致了性能上的差距,接下來分為兩個部分認識一下Spark,
2. spark 編程模型
- 從hadoop的MapReduce的對比我們來進行學習spark,首先spark相對于mapReduce來講,spark在性能和使用方面是優于mapReduce的,其中原因之一那這里不得不提到Spark的核心,也就是spark的編程模型RDD 彈性資料集(Resilient Distributed Datasets)
- RDD 既是 Spark 面向開發者的編程模型,又是 Spark 自身架構的核心元素,
- 大資料計算就是在大規模的資料集上進行一系列的資料計算處理,MapReduce 針對輸入資料,將計算程序分為兩個階段,一個 Map 階段,一個 Reduce 階段,可以理解成是面向程序的大資料計算,
- 我們在用 MapReduce 編程的時候,思考的是,如何將計算邏輯用 Map 和 Reduce 兩個階段實作,而 Spark 則直接針對資料進行編程,將大規模資料集合抽象成一個 RDD 物件,然后在這個 RDD 上進行各種計算處理,得到一個新的 RDD,繼續計算處理,直到得到最后的結果資料,所以 Spark 可以理解成是面向物件的大資料計算,在這里其實也可以聯想一下在java中的stream流,我們將一個資料集裝換成我們所謂的stream流然后進行一系列的函式操作,其中有一部分函式是在操作完成后還是stream流,這種函式在spark中叫做transformation函式,另一種函式則是直接得到最終的結果,在spark中也就是得到做種的資料檔案這在spark中叫action函式,
- 所以我們在進行 Spark 編程的時候,思考的是一個 RDD 物件需要經過什么樣的操作,轉換成另一個 RDD 物件,思考的重心和落腳點都在 RDD 上,RDD就是我們的編程物件,讓后通過RDD的內置函式,進行資料的操作,我們可以看一下Spark的RDD是如何實作大資料編程的hello word (word count)下圖是scala語言寫的,是我喜歡的style
val textFile = sc.textFile("hdfs://...")
val counts = textFile.flatMap(line => line.split(" "))
.map(word => (word, 1))
.reduceByKey(_ + _)
counts.saveAsTextFile("hdfs://...")
- 剛也說了RDD有兩種函式,一種transformation 一種是Action ,還有具體RDD 是怎么一種形式和方式存在,在后續我們繼續了解
在進行了解spark 和 mapReduce的區別時,看到一個大佬所講:人們在 Spark 出現之后,才開始對 MapReduce 不滿,原來大資料計算速度可以快這么多,編程也可以更簡單,而且 Spark 支持 Yarn 和 HDFS,公司遷移到 Spark 上的成本很小,于是很快,越來越多的公司用 Spark 代替 MapReduce,也就是說,因為有了 Spark,才對 MapReduce 不滿;而不是對 MapReduce 不滿,所以誕生了 Spark,真實的因果關系是相反的,這里有一條關于問題的定律分享給你:我們常常意識不到問題的存在,直到有人解決了這些問題,
3. spark 的架構原理
-
我們先看看Spark的架構圖是怎么樣的

-
應用程式(Application): 基于Spark的用戶程式,包含了一個Driver Program 和集群中多個的Executor;
- 驅動(Driver): 運行Application的main()函式并且創建SparkContext;
- 執行單元(Executor): 是為某Application運行在Worker Node上的一個行程,該行程負責運行Task,并且負責將資料存在記憶體或者磁盤上,每個Application都有各自獨立的Executors;
- 集群管理程式(Cluster Manager): 在集群上獲取資源的外部服務(例如:Local、Standalone、Mesos或Yarn等集群管理系統);
- 操作(Operation): 作用于RDD的各種操作分為Transformation和Action. -
整個 Spark 集群中,分為 Master 節點與 worker 節點,其中 Master 節點上常駐 Master 守護行程和 Driver 行程, Master 負責將串行任務變成可并行執行的任務集Tasks, 同時還負責出錯問題處理等,而 Worker 節點上常駐 Worker 守護行程, Master 節點與 Worker 節點分工不同, Master 負載管理全部的 Worker 節點,而 Worker 節點負責執行任務.
-
Driver 的功能是創建 SparkContext, 負責執行用戶寫的 Application 的 main 函式行程,Application 就是用戶寫的程式.
Spark 支持不同的運行模式,包括Local, Standalone,Mesoses,Yarn 模式.不同的模式可能會將 Driver 調度到不同的節點上執行.集群管理模式里, local 一般用于本地除錯. -
每個 Worker 上存在一個或多個 Executor 行程,該物件擁有一個執行緒池,每個執行緒負責一個 Task 任務的執行.根據 Executor 上 CPU-core 的數量,其每個時間可以并行多個 跟 core 一樣數量的 Task.Task 任務即為具體執行的 Spark 程式的任務.*
總結
- 認識到spark是一個開源的大資料分布式計算框架,比hadoop的MapReduce晚出來,且優秀
- Spark的編程模型RDD,包括RDD的兩種函式 Transformation 和 Action
- Spark的架構模型原理,以及大概Run的程序
- 令人影像很深刻的一句話:我們常常意識不到問題的存在,直到有人解決了這些問題
參考
- https://time.geekbang.org/column/article/69978(極客時間)
- https://zhuanlan.zhihu.com/p/34436165
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/297098.html
標籤:其他
下一篇:SQL資料庫之增
