文章目錄
- Spark Shuffle 解析
- 寬依賴和窄依賴
- 回顧Stage
- 引起shuffle的算子
- MapReduce Shuffle 回顧
- Spark Shuffle 兩階段
- Shuffle 是個昂貴的操作
- Shuffle 實現進化歷史
- Shuffle 相關組件
- Hash Shuffle
- Hash Shuffle 存在的問題?
- Sort Shuffle
- Sort Shuffle 存在的問題?
- Sort Shuffle 改進 Tungsten 計劃
- Shuffle調優
- Spark SQL 原理
- Spark一個模塊,用於處理結構化數據
- Spark SQL Example
- Spark SQL 原理
- SQL Analyzer
- SQL Optimizer
- SQL Optimizer 謂詞下推
- SQL Optimizer 列值裁剪
- SQL Planner
- RDD DataFrame
- Spark SQL 實戰
- Spark SQL 實戰 1.6
- Spark SQL 實戰 2.0
- Spark SQL 數據傾斜
- Spark MLlib 實戰
Spark Shuffle 解析
爲何要Shuffle?
寬依賴和窄依賴
- 窄依賴
- 沒有數據shuffling
- 所有父RDD中的Partition均會一一映射到子RDD的Partition中
- 寬依賴
- 有數據shuffling
- 所有父RDD中的Partition會被切分,根據key的不同劃分到子RDD的Partition中
回顧Stage
- 什麼是Stage
- 一個Job會被拆分爲多組Task,每組Task被稱爲一個Stage
- 劃分依據
- 以shuffle操作作爲邊界,遇到一個寬依賴就分一個stage
- 以shuffle操作作爲邊界,遇到一個寬依賴就分一個stage
引起shuffle的算子
MapReduce Shuffle 回顧
- Map端完成之後會暴露一個Http Server共Reduce端獲取數據
- Reduce啓動拷貝線程從各個Map端拷貝結果
- 有大量的網絡I/O開銷
- 一邊拷貝一邊進行Merge操作(歸併排序)
Spark Shuffle 兩階段
Shuffle 是個昂貴的操作
Shuffle 實現進化歷史
Shuffle 相關組件
- ShuffleManager
- 管理與Shuffle相關的組件
- 實現
org.apache.spark.shuffle.hash.HashShuffleManager (1.6)- org.apache.spark.shuffle.sort.SortShuffleManager
- ShuffleWriter
- 處理Shuffle輸出相關邏輯
- 實現
org.apache.spark.shuffle.hash.HashShuffleWriter (1.6)- org.apache.spark.shuffle.sort.BypassMergeSortShuffleWriter
- org.apache.spark.shuffle.sort.SortShuffleWriter
- org.apache.spark.shuffle.sort.UnsafeShuffleWriter
- ShuffleReader
- 處理讀取ShuffleWriter輸出相關邏輯
- 實現
- org.apache.spark.shuffle.BlockStoreShuffleReader
Hash Shuffle
Hash Shuffle 存在的問題?
Sort Shuffle
Sort Shuffle 存在的問題?
Sort Shuffle 改進 Tungsten 計劃
But 使用Tungsten限制條件
- 在shuffle階段不能有aggregate:例如reduceByKey
- 分區數不能超過2^24 − 1
Shuffle調優
- 調整spill頻率
- spark.shuffle.file.buffer
- map task的內存緩衝調節參數,默認是32kb
- spark.shuffle.memoryFraction
- reduce端聚合內存佔比,默認0.2
- 如何調整?
- 通過監控平臺觀察shuffle write和shuffle read的運行次數
- 儘量減少Shuffle次數
Spark SQL 原理
Spark一個模塊,用於處理結構化數據
Spark SQL Example
在Spark程序中無縫集成SQL查詢
Spark SQL 原理
求大於18歲的同學總成績平均分
原理
SQL Parser
SQL Analyzer
- 經過Parser之後的LogicalPlan並不知道如何執行
- 需要綁定不確定的屬性和關係
- 解析表名
- 臨時表
- 臨時view
- hive table
- hive view
- 解析具體的schema結構
- 字段類型
- 存儲位置
SQL Optimizer
SQL Optimizer 謂詞下推
SQL Optimizer 列值裁剪
SQL Planner
RDD DataFrame
- Spark本身並不清楚RDD中Person內部的結構
- 執行時無法優化
- DataFrame提供了詳細的結構信息
- 分佈式Row對象集合
- 算子更加豐富
- 執行計劃優化
Spark SQL 實戰
- 創建DataFrame
- 執行業務邏輯
Spark SQL 實戰 1.6
- 初始化SparkContext
- 初始化SQLContext
- 生成DataFrame
- 使用算子執行業務邏輯
• 使用標準SQL執行業務邏輯
• 使用DataFrame API執行業務邏輯
Spark SQL 實戰 2.0
- 初始化SparkSession
- 加載數據
- Enjoy Computing
Spark SQL 數據傾斜
- Spark 1.6 使用MapJoin
CACHE TABLE xx AS select * from xx - Spark 2.2 使用MapJoin Hint
SELECT /*+ MAPJOIN(b) */ … - 調整Spark SQL相關參數
• spark.sql.autoBroadcastJoinThreshold
被廣播表的大小小於該值時啓動BroadcastJoin,默認10MB。
• spark.sql.broadcastTimeout
廣播等待超時時間(秒),默認300s。
• spark.sql.shuffle.partitions
join或者aggregation是使用多少分區,默認200。
Spark MLlib 實戰
MLlib是Spark機器學習庫,包含了許多通用的機器學習算法和工具。
什麼是機器學習?
讓機器從數據中學習,進而得到一個更加符合現實規律的模型,通過對模型的使用使得機器比以往表現的更好,這就是機器學習。
MLlib 究竟能幹啥?
- 算法
- 迴歸 Regression
- 分類 Classification
- 聚類 Clustering
- 決策樹 Decision trees
- 協同過濾 Collaborative filtering
- 特徵工程
- 特徵抽取 Feature extraction
- 降維 Dimensionality reduction
- 持久化
- 常用工具
- 線性代數工具集
- 統計工具集
邏輯迴歸預測乳腺癌
數據來源:https://archive.ics.uci.edu/ml/datasets/Breast+Cancer+Wisconsin+(Original)