1. 程式人生 > >Spark入門之八:Spark Streaming 的原理以及應用場景介紹

Spark入門之八:Spark Streaming 的原理以及應用場景介紹

  1. 什麼是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完美融合。大概架構如下:

  2. Spark Streaming 執行原理
    Spark Streaming的基本原理是將輸入資料流以時間片(秒級)為單位進行拆分,然後以類似批處理的方式處理每個時間片資料,基本原理圖如下:

    首先,Spark Streaming把實時輸入資料流以時間片Δt (如1秒)為單位切分成塊。Spark Streaming會把每塊資料作為一個RDD,並使用RDD操作處理每一小塊資料。每個塊都會生成一個Spark Job處理,最終結果也返回多塊。

  3. SparkStreaming 支援的業務場景
    目前而言SparkStreaming 主要支援以下三種業務場景
    1. 無狀態操作:只關注當前的DStream中的實時資料,例如 只對當前DStream中的資料做正確性校驗
    2. 有狀態操作:對有狀態的DStream進行操作時,需要依賴之前的資料 例如 統計網站各個模組總的訪問量
    3. 視窗操作:對指定時間段範圍內的DStream資料進行操作,例如 需要統計一天之內網站各個模組的訪問數量
  4. SparkStreaming 支援的操作
    Discretized Stream是Spark Streaming的基礎抽象,代表持續性的資料流和經過各種Spark原語操作後的結果資料流。在內部實現上,DStream由連續的序列化RDD來表示。支援的操作主要包含以下幾種
    1. Action
      1. 當某個Output Operations原語被呼叫時,stream才會開始真正的計算過程。現階段支援的Output方式有以下幾種:
      •     print() 
      •     foreachRDD(func)
      •     saveAsObjectFiles(prefix, [suffix])
      •     saveAsTextFiles(prefix, [suffix])
      •     saveAsHadoopFiles(prefix, [suffix])
    2. 常規RDD 的Transformation操作
      對常規RDD使用的transformation操作,在DStream上都適用 
    3. 有狀態的Transformation
      • UpdateStateByKey:使用該方法主要是使用目前的DStream資料來更新歷史資料
    4. 視窗的 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])
  5. 持久化以及容錯
    1. 持久化

      與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 的倍數

    2. 容錯
      DStream 基於 RDD 組成, RDD 的容錯性依舊有效
      1. RDD 的某些 partition 丟失了 , 可以通過 lineage 資訊重新計算恢復
      2. 資料來源來自外部檔案系統 , 如 HDFS
        1. 一定可以通過重新讀取資料來恢復 , 絕對不會有資料丟失
      3. 資料來源來自網路
        1. 預設會在兩個不同節點載入資料到記憶體 , 一個節點 fail 了 , 系統可以通過另一個節點的數據重算 
        2. 假設正在執行 InputReceiver 的節點 fail 了 , 可能會丟失一部分資料

  6. 優化
    1. 監控手段
      一般來說,使用Spark自帶的Web UI就能滿足大部分的監控需求。對於Spark Streaming來說,以下幾個度量指標尤為重要(在Batch Processing Statistics標籤下): 
      • Processing Time:處理每個batch的時間 
      • Scheduling Delay:每個batch在佇列中等待前一個batch完成處理所等待的時間
      • 若Processing Time的值一直大於Scheduling Delay,或者Scheduling Delay的值持續增長,代表系統已經無法處理這樣大的資料輸入量了,這時就需要考慮各種優化方法來增強系統的負載。
    2. 優化方式
      1. 利用叢集資源,減少處理每個批次的資料的時間
        1.  控制 reduce 數量,太多的 reducer, 造成很多的小任務 , 以此產生很多啟動任務的開銷。太少的 reducer, 任務執行行慢 ! 
          1. spark.streaming.blockInterval
          2. inputStream.repartition
          3. spark.default.parallelism
        2. 序列化
          1. 輸入資料序列化
          2. RDD 序列化
          3. TASK 序列化
      2. 在 Standalone 及 coarse-grained 模式下的任務啟動要比 fine-grained 省時
      3. 給每個批次的資料量的設定一個合適的大小,原則 : 要來得及消化流進系統的資料
      4. 記憶體調優
        1. 清理快取的 RDD
          1. 在 spark.cleaner.ttl 之前快取的 RDD 都會被清除掉
          2. 設定 spark.streaming.unpersis, 系統為你分憂
          3. 使用併發垃圾收集器

相關推薦

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學習15Spark 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