Spark簡介
Spark是基於內存的分布式批處理系統,它把任務拆分,然后分配到多個的CPU上進行處理,處理數據時產生的中間產物(計算結果)存放在內存中,減少了對磁盤的I/O操作,大大的提升了數據的處理速度,在數據處理和數據挖掘方面比較占優勢。
Spark應用場景
- 數據處理(Data Processing):可以用來快速處理數據,兼具容錯性和可擴展性。
- 迭代計算(Iterative Computation):支持迭代計算,有效應對復雜的數據處理邏輯。
- 數據挖掘(Data Mining):在海量數據基礎上進行復雜的挖掘分析,可支持多種數據挖掘和機器學習算法。
- 流式處理(Streaming Processing):支持秒級延遲的流處理,可支持多種外部數據源。
- 查詢分析(Query Analysis):支持SQL的查詢分析,同時提供領域特定語言(DSL)以方便操作結構化數據,並支持多種外部數據源。
Spark對比MapReduce
- 性能上提升了100倍。
- Spark的中間數據放在內存中,對於迭代運算的效率更高;進行批處理時更高效,同時有着更低的延遲。
- Spark提供更多的數據集操作類型,編程模型比MapReduce更靈活,開發效率更高。
- 更高的容錯能力(血統機制)。
RDD
RDD是分布式彈性數據集,可以理解一個存儲數據的數據結構。Spark會把所要操作的數據,加載到RDD上,即RDD所有操作都是基於RDD來進行的。RDD是只讀和可分區。要想對RDD進行操作,只能重新生成一個新的RDD。
- 從HDFS輸入創建,或從與Hadoop兼容的其他存儲系統中輸入創建。
- 從父的RDD轉換的到新的RDD。
- 從數據集合轉換而來,通過編碼實現。
RDD的存儲:
- 用戶可以選擇不同的存儲級別緩存RDD以便重用。
- 當前RDD默認是存儲於內存,但當內存不足時,RDD會溢出到磁盤中。
Shuffle
Shuffle 是划分 DAG 中 stage 的標識,同時影響 Spark 執行速度的關鍵步驟
- RDD 的 Transformation 函數中,分為窄依賴(narrow dependency)和寬依賴(wide dependency)的操作.
- 窄依賴跟寬依賴的區別是是否發生Shuffle(洗牌) 操作。
窄依賴
窄依賴是指父RDD的每個分區只被子RDD的一個分區所使用。 表現為: 一個父RDD的每一個分區對應於一個子RDD分區。
寬依賴
寬依賴是指父RDD的每個分區都可能被多個子RDD分區所使用。 表現為: 父RDD的每個分區都被多個子RDD分區使用
Transformation
Transformation是RDD的算子類型,它的返回值還是一個RDD。
Transformation操作屬於懶操作(算子),不會真正觸發RDD的處理計算。
變換方法的共同點:
- 不會馬上觸發計算。
- 每當調用一次變換方法,都會產生一個新的RDD。
例如:map(func),flatMap(func)
Action
Action是RDD的算子,它的返回值不是一個RDD。Action操作是返回結果或者將結果寫入存儲的操作。Action是Spark應用啟動執行的觸發動作,得到RDD的相關計算結果或將RDD保存到文件系統中。
SparkConf
SparkConf是用來對Spark進行任務參數配置的對象。 是通過鍵值對的形式,設置Spark任務執行時所需要的參數。 Spark讀取任務參數的優先級是: 代碼配置>動態參數>配置文件。
SparkContext
SparkContext是Spark的入口,相當於應用程序的main函數。
SparkContext表示與Spark集群的連接,可用於在該集群上創建RDD,記錄計算結果和環境配置等信息。
SparkSession
Spark2.0中引入了SparkSession的概念,為用戶提供了一個統一的切入點來使用Spark的各項功能。
封裝了SparkConf和SparkContext對象,方便用戶使用Spark的各種API。
SparkSQL簡介
SparkSQL是Spark用來處理結構化數據的一個模塊,可以在Spark應用中直接使用SQL語句對數據進行操作。
SQL語句通過SparkSQL模塊解析為RDD執行計划,交給SparkCore執行。
通過SparkSession提交SQL語句。任務像普通Spark應用一樣,提交到集群中分布式運行。
JDBC:
- 應用加載JDBC驅動,然后統一提交到集群的JDBCServer執行。
- JDBCServer是單點服務,會成為任務執行的瓶頸,不能處理海量數據和高並發任務。
DataSet:
- DataSet是一個由特定域的對象組成的強類型集合,可通過功能或關系操作並行轉換其中的對象
- DataSet以Catalyst邏輯執行計划表示,並且數據以編碼的二進制形式存儲,不需要反序列化就可以執行sort、filter、shuffle等操作。
- Dataset是“懶惰”的,只在執行action操作時觸發計算。當執行action操作時,Spark用查詢優化程序來優化邏輯計划,並生成一個高效的並行分布式的物理計
SparkSQL使用場景
適合: 結構化數據處理。 對數據處理的實時性要求不高的場景 需要處理PB級的大容量數據。
不適合: 實時數據查詢。