<Spark快速大數據分析>讀書筆記
<Spark快速大數據分析>主要使用java, scala和python進行講解,因博主暫未對java和scala展開了解,所以後續總結只通過python進行展示。
Part 1 Spark簡介
Spark的定位:是一個用來實現快速而通用的集群計算平臺。
Spark與Hadoop的聯系:Spark擴展了mapreduce計算模型,且支持更多的計算模式,包括交互式查詢和流處理。
Spark的主要特點:能夠在內存中進行計算,因而更快。即便是在磁盤上進行復雜的計算,Spark依然比mapreduce更高效。
Spark主要包含了如下圖所示的組件:
1.Spark Core
2.Spark SQL:是Spark操作結構化數據的程序包,通過Spark SQL可以使用SQL或者Apache Hive版本的SQL方言(HQL)來查詢數據。
3.Spark Streaming:是Spark提供的對實時數據進行流式計算的組件,如生產環境中的網頁服務器日誌。
4.MLlib:提供機器學習功能的程序庫。
5.GraphX:操作圖的程序庫,可以進行並行的圖計算。
6.集群管理器
Part 2 核心概念與基本操作
彈性分布式數據集(Resilient Distributed Dataset, 簡稱RDD):RDD的核心特性是分布式與不可變。
Spark中對數據的所有操作不外乎:
-
- 創建RDD
- 轉化已有RDD,即轉化操作(transformation):由一個RDD生成一個新的RDD
- 調用RDD操作進行求值,即行動操作(action):會對一個RDD計算出一個結果
Spark會自動將RDD中的數據分發到集群上,並將操作並行化執行。
惰性計算的特性:Spark會惰性計算RDD,意思是只有在一個RDD第一次執行行動操作時,才會真正計算
默認情況下,Spark的RDD會在每次對他們進行行動操作時重新計算,如果重用同一個RDD,可以使用RDD.persist()讓Spark把這個RDD緩存下來。舉例來說,有一個原始RDD1,由RDD1生成一個RDD2,再由RDD2生成了RDD3,這時如果需要用RDD3進行兩個行動操作,默認情況下,系統兩次都會從RDD1開始重新計算RDD3,再進行行動操作。如果在RDD3生成後,使用RDD3.persist(),則兩次行動操作就會忽略RDD1到RDD3的計算過程,從而省略了1次RDD3的生成過程。類似於闖關遊戲中存儲進度,下次從存儲位置繼續玩起的動作。
每一個Spark應用都由一個驅動器程序(driver program)來發起集群上的各種並行操作,驅動器程序通過一個SparkContext對象來訪問Spark,使用python shell啟動時會自動創建一個SparkContext對象,默認變量名為sc。
創建RDD的方式:
1 #1.通過已有集合生成,用於原型開發和測試 2 lines = sc.parallelize(["pandas", "i love pandas"])
1 #2.從外部存儲中讀取數據 2 lines = sc.textFile("/path/to/README.md")
轉化操作:
#filter操作篩選出RDD1中滿足條件的元素構成新的RDD,以下意為選出大於5的元素構成新RDD newRDD = oldRDD.filter(lambda x: x > 5)
#map操作對RDD1中的每個元素進行函數操作後,將結果構成新的RDD,以下意為對RDD中的每個元素進行平方構成新RDD newRDD = oldRDD.map(lambda x: x ** 2)
1 #flatMap操作和map操作類似,但是如果操作後的結果為一個列表,則取出列表中的元素構成新RDD,而非將列表構成新RDD 2 newRDD = oldRDD.flatMap(lambda x: x.split(" "))
其中map()和flatMap()操作的區別如下圖所示:
<Spark快速大數據分析>讀書筆記