隨著信息時代的到來,數據開始急劇膨脹,業務也變得很複雜,我們每個人都是個數據源,每時每刻都在產生著數據與個性化、實時化的需求,原本的人力以及伺服器已經不足以支撐數據處理平臺的業務。由此,流式數據處理便應運而生。 ...
流式數據處理與Spark
技術產生背景
隨著信息時代的到來,數據開始急劇膨脹,業務也變得很複雜,我們每個人都是個數據源,每時每刻都在產生著數據與個性化、實時化的需求,原本的人力以及伺服器已經不足以支撐數據處理平臺的業務。由此,流式數據處理便應運而生。
在我們的普遍認知中,數據的價值會隨著時間的流逝而降低,所以在事件出現後必須儘快對它進行處理,最好是數據出現時便立刻對其進行處理,發生一個事件處理一次,而不是緩存起來進行批處理。
批處理 | 流處理 | |
---|---|---|
數據範圍 | 對數據集中的所有或大部分數據進行查詢或處理 | 對滾動時間視窗內的數據或僅對最近的數據記錄進行查詢或處理 |
數據大小 | 大批量數據 | 單條記錄或包含幾條記錄的微批量數據 |
性能 | 幾分鐘至幾小時的延遲 | 只需大約幾秒或幾毫秒的延遲 |
分析 | 複雜分析 | 簡單的響應函數、聚合和滾動指標 |
流式數據處理是針對流式數據的實時處理(計算)。既然要處理流式數據,那麼首先要搞明白的該是處理對象本身,既流式數據是什麼呢?流式數據是指由數千個數據源持續生成的數據,通常也同時以數據記錄的形式發送,規模較小(約幾千位元組)。
流數據包括多種數據,例如客戶使用您的移動或 Web 應用程式生成的日誌文件、網購數據、游戲內玩家活動、社交網站信息、金融交易大廳或地理空間服務,以及來自數據中心內所連接設備或儀器的遙測數據。[1]
它具有數據實時持續不斷到達、到達次序獨立、數據來源眾多格式複雜、數據規模大且十分關註存儲、註重數據的整體價值而不關註個別數據等特點。
具體而言,流式數據處理一般有三個流程:數據實時採集,數據實時處理,實時查詢服務。而這個過程也就對高性能、海量式、實時性、分散式以及可靠性提出了需求,並且,流式數據處理需要兩個層:存儲層和處理層。存儲層需要支持記錄定序和高度一致性,以便以快速、便宜且可重覆的方式讀取和寫入大型數據流。處理層負責處理存儲層中的數據,基於該數據運行計算,然後通知存儲層刪除不再需要的數據。除此之外,還必須為存儲層和處理層制定可擴展性、數據持久性和容錯規劃。因此,滿足以上性能的流式數據處理系統便炙手可熱,隨後出現了可提供構建流數據應用程式所需的基礎設施的多種平臺,Apache Spark便是其中之一。
下麵,我們以Spark為例,將會從技術基本原理,應用特點與應用場景這三個方面作以介紹。
技術基本原理
Spark是一個Apache項目,它被標榜為“快如閃電的集群計算”。它擁有一個繁榮的開源社區,並且是目前最活躍的Apache項目。它是基於記憶體計算的大數據並行計算框架.Spark基於記憶體計算,提高了在大數據環境下數據處理的實時性,同時保證了高容錯性和高可伸縮性,允許用戶將Spark部署在大量的廉價硬體之上,形成集群。
Spark誕生於加州大學伯利克分校AMPLab,AMPLab開發以Spark為核心的BDAS時提出的目標是:one stack to rule them all,也就是說在一套軟體棧內完成各種大數據分析任務。[2]
Spark生態圈
Spark的整個生態圈如下圖所示,最底層為資源管理器,採用Mesos、Yarn等資源管理集群或者Spark自帶的Standalone模式,底層存儲為文件系統或者其他格式的存儲系統如HBase。Spark作為計算框架,為上層多種應用提供服務。Graphx和MLBase提供數據挖掘服務,如圖計算和挖掘迭代計算等。Shark提供SQL查詢服務,相容Hive語法,性能比Hive快3-50倍,BlinkDB是一個通過權衡數據精確度來提升查詢晌應時間的交互SQL查詢引擎,二者都可作為互動式查詢使用。Spark Streaming將流式計算分解成一系列短小的批處理計算,並且提供高可靠和吞吐量服務。
Spark Core
Spark Core是一個基本引擎,用於大規模並行和分散式數據處理。它主要負責:
- 記憶體管理和故障恢復
- 在集群上安排、分佈和監控作業
- 和存儲系統進行交互
Spark引入了一個稱為彈性分散式數據集的概念,它是一個不可變的、容錯的、分散式對象集合,我們可以並行的操作這個集合。RDD可以包含任何類型的對象,它在載入外部數據集或者從驅動應用程式分發集合時創建。
RDD支持兩種操作類型:[3]
- 轉換是一種操作(例如映射、過濾、聯接、聯合等等),它在一個RDD上執行操作,然後創建一個新的RDD來保存結果。
- 行動是一種操作(例如歸併、計數、第一等等),它在一個RDD上執行某種計算,然後將結果返回。
在Spark中,轉換是“懶惰”的,也就是說它們不會立刻計算出結果。相反,它們只是“記住”要執行的操作以及要操作的數據集(例如文件)。只有當行為被調用時,轉換才會真正的進行計算,並將結果返回給驅動器程式。這種設計讓Spark運行得更有效率。例如,如果一個大文件要通過各種方式進行轉換操作,並且文件被傳遞給第一個行為,那麼Spark只會處理文件的第一行內容並將結果返回,而不會處理整個文件。
預設情況下,當你在經過轉換的RDD上運行一個行為時,這個RDD有可能會被重新計算。然而,你也可以通過使用持久化或者緩存的方法,將一個RDD持久化從年初在記憶體中,這樣,Spark就會在集群上保留這些元素,當你下一次查詢它時,查詢速度會快很多。
Spark架構
Spark架構採用了分散式計算中的Master-Slave模型。Master是對應集群中的含有Master進程的節點,Slave是集群中含有Worker進程的節點。Master作為整個集群的控制器,負責整個集群的正常運行;Worker相當於是計算節點,接收主節點命令與進行狀態彙報;Executor負責任務的執行;Client作為用戶的客戶端負責提交應用,Driver負責控制一個應用的執行,如下圖所示。
Spark集群部署後,需要在主節點和從節點分別啟動Master進程和Worker進程,對整個集群進行控制。在一個Spark應用的執行過程中,Driver和Worker是兩個重要角色。Driver程式是應用邏輯執行的起點,負責作業的調度,即Task任務的分發,而多個Worker用來管理計算節點和創建Executor並行處理任務。在執行階段,Driver會將Task和Task所依賴的file和jar序列化後傳遞給對應的Worker機器,同時Executor對相應數據分區的任務進行處理。
Spark的整理運行流程為:Client提交應用時,Master找到一個Worker啟動Driver,Driver向Master或者資源管理器申請資源,之後將應用轉化為RDD Graph,再由DAGScheduler將RDD Graph轉化為Stage的有向無環圖提交給TaskScheduler,由TaskScheduler提交任務給Executor執行。在任務執行的過程中,其他組件協同工作,確保整個應用順利執行。[4]
Spark運行邏輯
如下圖所示,在Spark應用中,整個執行流程在邏輯上會形成有向無環圖(DAG)。Action運算元觸發之後,將所有累積的運算元形成一個有向無環圖,然後由調度器調度該圖上的任務進行運算。Spark的調度方式與MapReduce有所不同。Spark根據RDD之間不同的依賴關係切分形成不同的階段(Stage),一個階段包含一系列函數執行流水線。圖中的A、B、C、D、E、F分別代表不同的RDD,RDD內的方框代表分區。數據從HDFS輸入,Spark形成RDD A和RDD C,RDD C上執行map操作,轉換為RDD D,RDD B和RDDE執行join操作,轉換為F,而在B和E連接轉化為F的過程中又會執行Shuffle,最後RDD F通過函數saveAsSequenceFile輸出並保存到HDFS中。
技術的特點與應用場景
技術特點
今天,Spark已經被很多巨頭使用,包括Amazon、eBay以及Yahoo!。很多組織都在擁有成千上萬節點的集群上運行Spark。
根據Spark FAQ,已知的最大的Spark集群擁有超過8000個節點,且已經有1000個組織在生產中使用Spark。[5]
Spark的特點可概括為以下幾點:
- 高效易用,擁有Java、Scala、Python和R APIs。
- 可擴展至超過8000個結點。
- 能夠在記憶體內緩存數據集以進行互動式數據分析。
- 與Hadoop集成
- Scala或Python中的互動式命令行介面可降低橫向擴展數據探索的反應時間。
- Spark Streaming對即時數據流的處理具有可擴充性、高吞吐量、可容錯性等特點。
- Spark SQL支持結構化和和關係式查詢處理(SQL)。
- MLlib機器學習演算法[6]和Graphx圖形處理演算法的高級庫。
應用場景分析
Spark是基於記憶體的迭代計算框架,適用於需要多次操作特定數據集的應用場合。需要反覆操作的次數越多,所需讀取的數據量越大,受益越大,數據量小但是計算密集度較大的場合,受益就相對較小。由於RDD的特性,Spark不適用那種非同步細粒度更新狀態的應用,例如web服務的存儲或者是增量的web爬蟲和索引。就是對於那種增量修改的應用模型不適合。數據量不是特別大,但是要求近實時統計分析需求。
參考文獻:
[1] https://amazonaws-china.com/cn/streaming-data/
[2] https://zh.wikipedia.org/wiki/Apache_Spark
[3] http://blog.jobbole.com/89446/
[4] http://www.jianshu.com/p/eb2bc8d8ebc0
[5] Apache Spark FAQ. apache.org. Apache Software Foundation. [5 December 2014].
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文鏈接(http://www.cnblogs.com/Echo-41/p/7685142.html)。