- 目標
-
Spark
的進化過程當中, 一個很是重要的組成部分就是編程模型的進化, 經過編程模型能夠看得出來內在的問題和解決方案shell - 過程
-
-
編程模型
RDD
的優勢和缺陷apache -
編程模型
DataFrame
的優勢和缺陷編程 -
編程模型
Dataset
的優勢和缺陷
-
回顧和展望前端
入門案例java
Stuctured Streaming
的體系和結構node
Structured Streaming
是 Spark Streaming
的進化版, 若是瞭解了 Spark
的各方面的進化過程, 有助於理解 Structured Streaming
的使命和做用python
Spark
的 API
進化過程mysql
Spark
的序列化進化過程算法
Spark Streaming
和 Structured Streaming
sql
Spark
的進化過程當中, 一個很是重要的組成部分就是編程模型的進化, 經過編程模型能夠看得出來內在的問題和解決方案shell
編程模型 RDD
的優勢和缺陷apache
編程模型 DataFrame
的優勢和缺陷編程
編程模型 Dataset
的優勢和缺陷
編程模型 | 解釋 |
---|---|
|
rdd.flatMap(_.split(" ")) .map((_, 1)) .reduceByKey(_ + _) .collect
|
|
spark.read .csv("...") .where($"name" =!= "") .groupBy($"name") .show()
|
|
spark.read .csv("...") .as[Person] .where(_.name != "") .groupByKey(_.name) .count() .show()
|
RDD
的優勢
面向對象的操做方式
能夠處理任何類型的數據
RDD
的缺點
運行速度比較慢, 執行過程沒有優化
API
比較僵硬, 對結構化數據的訪問和操做沒有優化
DataFrame
的優勢
針對結構化數據高度優化, 能夠經過列名訪問和轉換數據
增長 Catalyst
優化器, 執行過程是優化的, 避免了由於開發者的緣由影響效率
DataFrame
的缺點
只能操做結構化數據
只有無類型的 API
, 也就是隻能針對列和 SQL
操做數據, API
依然僵硬
Dataset
的優勢
結合了 RDD
和 DataFrame
的 API
, 既能夠操做結構化數據, 也能夠操做非結構化數據
既有有類型的 API
也有無類型的 API
, 靈活選擇
Spark
中的序列化過程決定了數據如何存儲, 是性能優化一個很是重要的着眼點, Spark
的進化並不僅是針對編程模型提供的 API
, 在大數據處理中, 也必需要考慮性能
序列化和反序列化是什麼
Spark
中什麼地方用到序列化和反序列化
RDD
的序列化和反序列化如何實現
Dataset
的序列化和反序列化如何實現
Spark
中的序列化和反序列化的應用場景
RDD
的序列化
DataFrame
和
Dataset
中的序列化
當須要將對象緩存下來的時候, 或者在網絡中傳輸的時候, 要把對象轉成二進制, 在使用的時候再將二進制轉爲對象, 這個過程叫作序列化和反序列化
在 Spark
中有不少場景須要存儲對象, 或者在網絡中傳輸對象
Task
分發的時候, 須要將任務序列化, 分發到不一樣的 Executor
中執行
緩存 RDD
的時候, 須要保存 RDD
中的數據
廣播變量的時候, 須要將變量序列化, 在集羣中廣播
RDD
的 Shuffle
過程當中 Map
和 Reducer
之間須要交換數據
算子中若是引入了外部的變量, 這個外部的變量也須要被序列化
RDD
由於不保留數據的元信息, 因此必需要序列化整個對象, 常見的方式是 Java
的序列化器, 和 Kyro
序列化器
Dataset
和 DataFrame
中保留數據的元信息, 因此能夠再也不使用 Java
的序列化器和 Kyro
序列化器, 使用 Spark
特有的序列化協議, 生成 UnsafeInternalRow
用以保存數據, 這樣不只能減小數據量, 也能減小序列化和反序列化的開銷, 其速度大概能達到 RDD
的序列化的 20
倍左右
理解 Spark Streaming
和 Structured Streaming
之間的區別, 是很是必要的, 從這點上能夠理解 Structured Streaming
的過去和產生契機
Spark Streaming
時代
Structured Streaming
時代
Spark Streaming
和 Structured Streaming
Spark Streaming
時代
Structured Streaming
時代
Spark Streaming
和
Structured Streaming
瞭解 Structured Streaming
的編程模型, 爲理解 Structured Streaming
時候是什麼, 以及核心體系原理打下基礎
需求梳理
Structured Streaming
代碼實現
運行
驗證結果
理解接下來要作的案例, 有的放矢
需求
總體結構
開發方式
簡單來講, 就是要進行流式的詞頻統計, 使用 Structured Streaming
實現 Structured Streaming
部分的代碼編寫
建立文件
建立 SparkSession
讀取 Socket
數據生成 DataFrame
將 DataFrame
轉爲 Dataset
, 使用有類型的 API
處理詞頻統計
生成結果集, 並寫入控制檯
object SocketProcessor {
def main(args: Array[String]): Unit = {
// 1. 建立 SparkSession
val spark = SparkSession.builder()
.master("local[6]")
.appName("socket_processor")
.getOrCreate()
spark.sparkContext.setLogLevel("ERROR") import spark.implicits._ // 2. 讀取外部數據源, 並轉爲 Dataset[String] val source = spark.readStream .format("socket") .option("host", "127.0.0.1") .option("port", 9999) .load() .as[String] // 3. 統計詞頻 val words = source.flatMap(_.split(" ")) .map((_, 1)) .groupByKey(_._1) .count() // 4. 輸出結果 words.writeStream .outputMode(OutputMode.Complete()) .format("console") .start() .awaitTermination() } }
調整 Log 級別, 避免過多的 Log 影響視線 |
|
默認 readStream 會返回 DataFrame , 可是詞頻統計更適合使用 Dataset 的有類型 API |
|
統計全局結果, 而不是一個批次 | |
將結果輸出到控制檯 | |
開始運行流式應用 | |
阻塞主線程, 在子線程中不斷獲取數據 |
Structured Streaming
中的編程步驟依然是先讀, 後處理, 最後落地
Structured Streaming
中的編程模型依然是 DataFrame
和 Dataset
Structured Streaming
中依然是有外部數據源讀寫框架的, 叫作 readStream
和 writeStream
Structured Streaming
和 SparkSQL
幾乎沒有區別, 惟一的區別是, readStream
讀出來的是流, writeStream
是將流輸出, 而 SparkSQL
中的批處理使用 read
和 write
代碼已經編寫完畢, 須要運行, 並查看結果集, 由於從結果集的樣式中能夠看到 Structured Streaming
的一些原理
開啓 Socket server
運行程序
查看數據集
Socket server
和運行程序
運行的時候須要先開啓 Socket server
Structured Streaming
的 API 和運行也是針對結構化數據進行優化過的
瞭解 Structured Streaming
的體系結構和核心原理, 有兩點好處, 一是須要了解原理纔好進行性能調優, 二是瞭解原理後, 才能理解代碼執行流程, 從而更好的記憶, 也作到知其然更知其因此然
WordCount
的執行原理
Structured Streaming
的體系結構
Structured Streaming
是一個複雜的體系, 由不少組件組成, 這些組件之間也會進行交互, 若是沒法站在總體視角去觀察這些組件之間的關係, 也沒法理解 Structured Streaming
的全局
瞭解 Dataset
這個計算模型和流式計算的關係
如何使用 Dataset
處理流式數據?
WordCount
案例的執行過程和原理
Dataset
和流式計算
Dataset
這個編程模型表示流式計算?
WordCount
的原理
Dataset
不只能夠表達流式數據的處理, 也能夠表達批量數據的處理
Dataset
之因此能夠表達流式數據的處理, 由於 Dataset
能夠模擬一張無限擴展的表, 外部的數據會不斷的流入到其中
Structured Streaming
是一個複雜的體系, 由不少組件組成, 這些組件之間也會進行交互, 若是沒法站在總體視角去觀察這些組件之間的關係, 也沒法理解 Structured Streaming
的核心原理
體系結構
StreamExecution
的執行順序
StreamExecution
的執行順序
StreamExecution
是整個 Structured Streaming
的核心, 負責在流上的查詢
StreamExecution
中三個重要的組成部分, 分別是 Source
負責讀取每一個批量的數據, Sink
負責將結果寫入外部數據源, Logical Plan
負責針對每一個小批量生成執行計劃
StreamExecution
中使用 StateStore
來進行狀態的維護
Structured Streaming
不只支持 groupBy
, 還支持 groupByKey