Spark入門之八:Spark Streaming 的原理以及應用場景介紹
- 什麼是Spark Streaming
Spark Streaming類似於Apache Storm,用於流式資料的處理。根據其官方文件介紹,Spark Streaming有高吞吐量和容錯能力強這兩個特點。Spark Streaming支援的資料輸入源很多,例如:Kafka、Flume、Twitter、ZeroMQ和簡單的TCP套接字等等。資料輸入後可以用 Spark的高度抽象原語如:map、reduce、join、window等進行運算。而結果也能儲存在很多地方,如HDFS,資料庫等。另外 Spark Streaming也能和MLlib(機器學習)以及Graphx完美融合。大概架構如下: - Spark Streaming 執行原理
Spark Streaming的基本原理是將輸入資料流以時間片(秒級)為單位進行拆分,然後以類似批處理的方式處理每個時間片資料,基本原理圖如下:
首先,Spark Streaming把實時輸入資料流以時間片Δt (如1秒)為單位切分成塊。Spark Streaming會把每塊資料作為一個RDD,並使用RDD操作處理每一小塊資料。每個塊都會生成一個Spark Job處理,最終結果也返回多塊。
- SparkStreaming 支援的業務場景
目前而言SparkStreaming 主要支援以下三種業務場景- 無狀態操作:只關注當前的DStream中的實時資料,例如 只對當前DStream中的資料做正確性校驗
- 有狀態操作:對有狀態的DStream進行操作時,需要依賴之前的資料 例如 統計網站各個模組總的訪問量
- 視窗操作:對指定時間段範圍內的DStream資料進行操作,例如 需要統計一天之內網站各個模組的訪問數量
- SparkStreaming 支援的操作
Discretized Stream是Spark Streaming的基礎抽象,代表持續性的資料流和經過各種Spark原語操作後的結果資料流。在內部實現上,DStream由連續的序列化RDD來表示。支援的操作主要包含以下幾種- Action
- 當某個Output Operations原語被呼叫時,stream才會開始真正的計算過程。現階段支援的Output方式有以下幾種:
- print()
- foreachRDD(func)
- saveAsObjectFiles(prefix, [suffix])
- saveAsTextFiles(prefix, [suffix])
- saveAsHadoopFiles(prefix, [suffix])
- 當某個Output Operations原語被呼叫時,stream才會開始真正的計算過程。現階段支援的Output方式有以下幾種:
- 常規RDD 的Transformation操作
對常規RDD使用的transformation操作,在DStream上都適用 - 有狀態的Transformation
- UpdateStateByKey:使用該方法主要是使用目前的DStream資料來更新歷史資料
- 視窗的 Transformation
Window Operations有點類似於Storm中的State,可以設定視窗的大小和滑動視窗的間隔來動態的獲取當前Steaming的允許狀態。如下圖所示:
主要支援的操作有:- window(windowLength, slideInterval)
- countByWindow(windowLength, slideInterval)
- reduceByWindow(func, windowLength, slideInterval)
- reduceByKeyAndWindow(func, windowLength, slideInterval, [numTasks])
- reduceByKeyAndWindow(func, invFunc, windowLength, slideInterval, [numTasks])
- countByValueAndWindow(windowLength, slideInterval, [numTasks])
- Action
- 持久化以及容錯
- 持久化
與RDD一樣,DStream同樣也能通過persist()方法將資料流存放在記憶體中,這樣做的好處是遇到需要多次迭代計算的程式時,速度優勢十分的明顯。
而對於上文中提到的Window以及Stateful的操作,其預設的持久化策略就是儲存在記憶體中(MEMORY_ONLY_SER)。
當資料來源來自於網路時(例如通過Kafka、Flume、sockets等等),由於網路資料的不可在再現性,預設的持久化策略是MEMORY_AND_DISK_SER_2(將資料儲存在兩臺機器上),這也是為了容錯性而設計的。關於持久化,還有一點需要注意的就是,由於資料流的持續處理,在記憶體的消耗上可能比較大,為了緩解記憶體的壓力引入了checkpoint的概念,checkpoint有以下幾點需要注意:
– 對於 window 和 stateful 操作必須 checkpoint
– 通過 StreamingContext 的 checkpoint 來指定目錄
– 通過 DStream 的 checkpoint 指定間隔時間
– 間隔必須是 slide interval 的倍數
- 容錯
DStream 基於 RDD 組成, RDD 的容錯性依舊有效- RDD 的某些 partition 丟失了 , 可以通過 lineage 資訊重新計算恢復
- 資料來源來自外部檔案系統 , 如 HDFS
- 一定可以通過重新讀取資料來恢復 , 絕對不會有資料丟失
- 資料來源來自網路
- 預設會在兩個不同節點載入資料到記憶體 , 一個節點 fail 了 , 系統可以通過另一個節點的數據重算
- 假設正在執行 InputReceiver 的節點 fail 了 , 可能會丟失一部分資料
- 持久化
- 優化
- 監控手段
一般來說,使用Spark自帶的Web UI就能滿足大部分的監控需求。對於Spark Streaming來說,以下幾個度量指標尤為重要(在Batch Processing Statistics標籤下):- Processing Time:處理每個batch的時間
- Scheduling Delay:每個batch在佇列中等待前一個batch完成處理所等待的時間
- 若Processing Time的值一直大於Scheduling Delay,或者Scheduling Delay的值持續增長,代表系統已經無法處理這樣大的資料輸入量了,這時就需要考慮各種優化方法來增強系統的負載。
- 優化方式
- 利用叢集資源,減少處理每個批次的資料的時間
- 控制 reduce 數量,太多的 reducer, 造成很多的小任務 , 以此產生很多啟動任務的開銷。太少的 reducer, 任務執行行慢 !
- spark.streaming.blockInterval
- inputStream.repartition
- spark.default.parallelism
- 序列化
- 輸入資料序列化
- RDD 序列化
- TASK 序列化
- 控制 reduce 數量,太多的 reducer, 造成很多的小任務 , 以此產生很多啟動任務的開銷。太少的 reducer, 任務執行行慢 !
- 在 Standalone 及 coarse-grained 模式下的任務啟動要比 fine-grained 省時
- 給每個批次的資料量的設定一個合適的大小,原則 : 要來得及消化流進系統的資料
- 記憶體調優
- 清理快取的 RDD
- 在 spark.cleaner.ttl 之前快取的 RDD 都會被清除掉
- 設定 spark.streaming.unpersis, 系統為你分憂
- 使用併發垃圾收集器
- 清理快取的 RDD
- 利用叢集資源,減少處理每個批次的資料的時間
- 監控手段
相關推薦
Spark入門之八:Spark Streaming 的原理以及應用場景介紹
什麼是Spark StreamingSpark Streaming類似於Apache Storm,用於流式資料的處理。根據其官方文件介紹,Spark Streaming有高吞吐量和容錯能力強這兩個特點。Spark Streaming支援的資料輸入源很多,例如:Kafka、F
Spark 入門之二:Spark RDD詳解
RDD的容錯機制實現分散式資料集容錯方法有兩種:資料檢查點和記錄更新RDD採用記錄更新的方式:記錄所有更新點的成本很高。所以,RDD只支援粗顆粒變換,即只記錄單個塊上執行的單個操作,然後建立某個RDD的變換序列(血統)儲存下來;變換序列指,每個RDD都包含了他是如何由其他RDD變換過來的以及如何重建某一塊資料
Spark入門之六:SparkSQL實戰
sqlContext 使用Case Class定義RDD 介紹對於Case Class方式,首先要定義Case Class,在RDD的Transform過程中使用Case Class可以隱式轉化成SchemaRDD,然後再使用registerTempTable註冊成表。註冊成表後就可以在sqlConte
Spark學習之15:Spark Streaming執行流程(1)
DStream的所有轉換和計算操作最終會基於該雜湊表中的RDD進行。 1. Receiver啟動 流程如下: Receiver啟動分為兩個部分,一是在Driver端初始化ReceiverTracker等,二是在將所有的Receiver封裝成RDD,併發送的Executor執行。 1.1. Streami
Spark MLlib 之 aggregate和treeAggregate從原理到應用
數據量 hash oom 向上 gre require 圖片 iterator reac 在閱讀spark mllib源碼的時候,發現一個出鏡率很高的函數——aggregate和treeAggregate,比如matrix.columnSimilarities()中。為了
UVM暫存器篇之八:暫存器模型的場景應用(終)
本文轉自:http://www.eetop.cn/blog/html/28/1561828-6266225.html 如何檢查暫存器模型 在瞭解了暫存器模型的常規方法之後,我們需要考慮如何利用這些方法來檢查暫存器、以及協助檢查硬體設計的邏輯和資料比對。要知道,在軟體實現硬體驅動和韌體層時,也
Godot3遊戲引擎入門之二:第一個簡單的遊戲場景
一、前言 最近工作時間安排地非常緊湊,除了週日一天,已經沒有其他空閒時間了。不過到了 10 月份會慢慢恢復,目前我在抽出一點時間好好準備這個 Godot 系列,邊寫邊學習邊迎接Godot 3.1 版本的到來,也算是一件高興地事情,哈哈。 :sunglasses:
DAV入門之kivy:一個簡單的kivy應用
這裡我們採用PyCharm作為開發環境,先介紹下鄙人做的一個示例的庫,取名叫做kivy_cracker,意味著我將一步一步的將kivy擊破(手動剪刀手),這個庫包含了後面我更新的內容以及官網的示例:https://gitee.com/davied9/kivy_cracker.
智能合約從入門到精通:智能合約的應用場景
區塊鏈 智能合約 簡介:上一章我們簡單介紹了區塊鏈技術的發展情況,並詳細介紹智能合約的基礎概念。可以說,區塊鏈1.0時代(比特幣)除了代幣功能,與現實生活相去甚遠。智能合約的出現,給區塊鏈帶來了巨大的變化,區塊鏈也從一種賬本形式,變成了下一代計算網絡的雛形。這一章我們將聊聊智能合約的應用場景。在上一篇
dubbo原始碼分析(二):超時原理以及應用場景
本篇主要記錄dubbo中關於超時的常見問題,實現原理,解決的問題以及如何在服務降級中體現作用等。 超時問題 為了檢查對dubbo超時的理解,嘗試回答如下幾個問題,如果回答不上來或者不確定那麼說明此處需要再多研究研究。 我只是針對個人的理解提問題,並不代表我理解的就是全面深入的,但我的問題如果也回答不
棧和佇列的原理以及應用場景
棧和佇列是一個比較抽象的概念,大多數人知道棧和佇列的特點,但是實際不知道怎麼用,這是大家學習階段的通病。 要想用棧和佇列,首先要明確,他們是什麼。1.是什麼? 棧和佇列其實是一個工具,他們傳統的工具方法 工具類不同,他們是“思想”工具,大家都知道,
java 中泛型的原理以及應用場景
Java從1.5之後支援泛型,泛型的本質是引數化型別,也就是說所操作的資料型別被指定為一個引數。這種引數型別可以用在類、介面和方法的建立中,分別稱為泛型類、泛型介面、泛型方法。 入不支援泛型,則表現為支援Object,不是特定的泛型。 泛型是對 Java 語言的型別系統的一
Spark修煉之道(進階篇)——Spark入門到精通:第十四節 Spark Streaming 快取、Checkpoint機制
作者:周志湖 微訊號:zhouzhihubeyond 主要內容 Spark Stream 快取 Checkpoint 案例 1. Spark Stream 快取 通過前面一系列的課程介紹,我們知道DStream是由一系列的RDD構成的,
Spark修煉之道(進階篇)——Spark入門到精通:第十六節 Spark Streaming與Kafka
作者:周志湖 主要內容 Spark Streaming與Kafka版的WordCount示例(一) Spark Streaming與Kafka版的WordCount示例(二) 1. Spark Streaming與Kafka版本的WordCount示例
Spark修煉之道(進階篇)——Spark入門到精通:第十三節 Spark Streaming—— Spark SQL、DataFrame與Spark Streaming
主要內容 Spark SQL、DataFrame與Spark Streaming 1. Spark SQL、DataFrame與Spark Streaming import org.apache.spark.SparkConf import org
Spark修煉之道(進階篇)——Spark入門到精通:第十節 Spark Streaming(一)
本節主要內容 Spark流式計算簡介 Spark Streaming相關核心類 入門案例 1. Spark流式計算簡介 Hadoop的MapReduce及Spark SQL等只能進行離線計算,無法滿足實時性要求較高的業務需求,例如實時推薦、實時
Spark學習(八)---Spark streaming原理
這次我們介紹spark streaming,今天主要是原理和相關的操作 Spark Streaming概念介紹 Spark Streaming的相關操作 1. Spark Streaming概念 1.1什麼是Spark Streaming Spark St
Spark修煉之道(進階篇)——Spark入門到精通:第一節 Spark 1.5.0叢集搭建
作者:周志湖 網名:搖擺少年夢 微訊號:zhouzhihubeyond 本節主要內容 作業系統環境準備 Hadoop 2.4.1叢集搭建 Spark 1.5.0 叢集部署 注:在利用CentOS 6.5作業系統安裝spark 1.5叢集過程中,
Spark修煉之道(進階篇)——Spark入門到精通:第十節 Spark SQL案例實戰(一)
作者:周志湖 放假了,終於能抽出時間更新部落格了……. 1. 獲取資料 本文通過將github上的Spark專案git日誌作為資料,對SparkSQL的內容進行詳細介紹 資料獲取命令如下: [[email protected] spa
Spark修煉之道(進階篇)——Spark入門到精通:第十五節 Kafka 0.8.2.1 叢集搭建
作者:周志湖 微訊號:zhouzhihubeyond 本節為下一節Kafka與Spark Streaming做鋪墊 主要內容 1.kafka 叢集搭建 1. kafka 叢集搭建 kafka 安裝與配置 tar -zxvf kafka_2