作者介紹:TNTEVE,狐小E資深開發工程師,專注移動協同辦公平台的SAAS軟件開發以及輕應用開發
最近開發了一款移動辦公軟件狐小E
MapReduce
MapReduce是編程模型,也是計算框架。開發人員基於MapReduce編程模型進行編程開發,然后將程序通過MapReduce計算框架分發到Hadoop集群中運行。
MapReduce編程模型只包含Map和Reduce兩個過程,map的主要輸入是一對<Key, Value>值,經過map計算后輸出一對<Key, Value>值;然后將相同Key合並,形成<Key, Value集合>,再將這個<Key, Value集合>輸入reduce,經過計算輸出零個或多個<Key, Value>對。
MapReduce運行的時候,會通過Mapper運行的任務讀取數據文件,然后調用自己的方法,處理數據,最后輸出。Reducer任務會接收Mapper任務輸出的數據,作為自己的輸入數據,調用自己的方法,最后輸出到相應的文件中。
因為MapReduce采用了多進程模型。多進程模型便於細粒度控制每個任務占用的資源,但會消耗較多的啟動時間,不適合運行低延遲類型的作業,具體流程如下:
Input => MapReduce ==> Output ==> MapReduce ==> Output
在MapReduce流程里,第一個MR的輸出要先落地,然后第二個MR才能把第一個MR的輸出當做輸入,進行第二次MR。如果有多個MR流式作業,消耗的時間也就會隨之增加。這是MapReduce廣為詬病的原因之一。
Spark
Apache Spar是一個圍繞速度、易用性和復雜分析構建的大數據處理框架。最初在2009年由加州大學伯克利分校的AMPLab開發,並於2010年成為Apache的開源項目之一。Apache Spark的高性能一定程度上取決於它采用的異步並發模型(這里指server/driver 端采用的模型),這與Hadoop 2.0(包括YARN和MapReduce)是一致的。Hadoop 2.0自己實現了類似Actor的異步並發模型,實現方式是epoll+狀態機,而Apache Spark則直接采用了開源軟件Akka,該軟件實現了Actor模型,性能非常高。盡管二者在server端采用了一致的並發模型,但在任務級別(特指 Spark任務和MapReduce任務)上卻采用了不同的並行機制:Hadoop MapReduce采用了多進程模型,而Spark采用了多線程模型。
Spark采用了經典的scheduler/workers模式,每個Spark應用程序運行的第一步是構建一個可重用的資源池,然后在這個資源池里運行所有的ShuffleMapTask和ReduceTask。而MapReduce應用程序則不同,它不會構建一個可重用的資源池,而是讓每個Task動態申請資源,且運行完后馬上釋放資源。
與Hadoop和Storm等其他大數據和MapReduce技術相比,Spark有如下優勢。
首先,Spark為我們提供了一個全面、統一的框架用於管理各種有着不同性質(文本數據、圖表數據等)的數據集和數據源(批量數據或實時的流數據)的大數據處理的需求。
Spark可以將Hadoop集群中的應用在內存中的運行速度提升100倍,甚至能夠將應用在磁盤上的運行速度提升10倍。
Spark通過在數據處理過程中成本更低的洗牌(Shuffle)方式,將MapReduce提升到一個更高的層次。利用內存數據存儲和接近實時的處理能力,Spark比其他的大數據處理技術的性能要快很多倍。
Spark還支持大數據查詢的延遲計算,這可以幫助優化大數據處理流程中的處理步驟。Spark還提供高級的API以提升開發者的生產力,除此之外還為大數據解決方案提供一致的體系架構模型。
Spark將中間結果保存在內存中而不是將其寫入磁盤,當需要多次處理同一數據集時,這一點特別實用。Spark的設計初衷就是既可以在內存中又可以在磁盤上工作的執行引擎。當內存中的數據不適用時,Spark操作符就會執行外部操作。Spark可以用於處理大於集群內存容量總和的數據集。
Spark會嘗試在內存中存儲盡可能多的數據然后將其寫入磁盤。它可以將某個數據集的一部分存入內存而剩余部分存入磁盤。開發者需要根據數據和用例評估對內存的需求。Spark的性能優勢得益於這種內存中的數據存儲。
Spark讓開發者可以快速的用Java、Scala或Python編寫程序。它本身自帶了一個超過80個高階操作符集合。而且還可以用它在shell中以交互式地查詢數據。
它還支持SQL查詢,流數據,機器學習和圖表數據處理。開發者可以在一個數據管道用例中單獨使用某一能力或者將這些能力結合在一起使用。
Flink
Apache Flink是一個面向數據流處理和批量數據處理的可分布式的開源計算框架,它基於同一個Flink流式執行模型(streaming execution model),能夠支持流處理和批處理兩種應用類型。由於流處理和批處理所提供的SLA(服務等級協議)是完全不相同,流處理一般需要支持低延遲、Exactly-once保證,而批處理需要支持高吞吐、高效處理,所以在實現的時候通常是分別給出兩套實現方法,或者通過一個獨立的開源框架來實現其中每一種處理方案。比較典型的有:實現批處理的開源方案有MapReduce、Spark;實現流處理的開源方案有Storm;Spark的Streaming 其實本質上也是微批處理。
Flink在實現流處理和批處理時,與傳統的一些方案完全不同,它從另一個視角看待流處理和批處理,將二者統一起來:Flink是完全支持流處理,也就是說作為流處理看待時輸入數據流是無界的;批處理被作為一種特殊的流處理,只是它的輸入數據流被定義為有界的。
任何類型的數據都是作為事件流產生的。信用卡交易,傳感器測量,機器日志或網站或移動應用程序上的用戶交互,所有這些數據都作為流生成。
無界流有一個開始但沒有定義的結束。它們不會在生成時終止並提供數據。必須持續處理無界流,即必須在攝取事件后立即處理事件。無法等待所有輸入數據到達,因為輸入是無界的,並且在任何時間點都不會完成。處理無界數據通常要求以特定順序(例如事件發生的順序)攝取事件,以便能夠推斷結果完整性。
有界流具有定義的開始和結束。可以在執行任何計算之前通過攝取所有數據來處理有界流。處理有界流不需要有序攝取,因為可以始終對有界數據集進行排序。有界流的處理也稱為批處理。
Apache Flink擅長處理無界和有界數據集。精確控制時間和狀態使Flink的運行時能夠在無界流上運行任何類型的應用程序。有界流由算法和數據結構內部處理,這些算法和數據結構專門針對固定大小的數據集而設計,從而產生出色的性能。
流處理特性:
l 支持高吞吐、低延遲、高性能的流處理
l 支持有狀態計算的Exactly-once語義。狀態是指flink能夠維護數據在時序上的聚類和聚合,同時它的checkpoint機制
l 支持帶有事件時間的窗口(Window)操作。支持基於time、count、session,以及data-driven的窗口操作,能很好的對現實環境中的創建的數據進行建模。
l 支持基於輕量級分布式快照(Snapshot)實現的容錯。
l 支持高吞吐、低延遲、高性能的流處理
l 支持大規模的集群模式,支持yarn、Mesos。可運行在成千上萬的節點上
l 支持具有Backpressure功能的持續流模型
l Flink在JVM內部實現了自己的內存管理
l 支持迭代計算
l 支持程序自動優化:避免特定情況下Shuffle、排序等昂貴操作,中間結果進行緩存
與spark的區別
Spark的技術理念是使用微批來模擬流的計算,基於Micro-batch,數據流以時間為單位被切分為一個個批次,通過分布式數據集RDD進行批量處理,是一種偽實時。
而Flink是基於事件驅動的,它是一個面向流的處理框架, Flink基於每個事件一行一行地流式處理,是真正的流式計算. 另外他也可以基於流來模擬批進行計算實現批處理,所以他在技術上具有更好的擴展性,未來可能會成為一個統一的大數據處理引擎。
SparkStreaming只支持處理時間, 折中地使用processing time來近似地實現event time相關的業務。Structured streaming 支持處理時間和事件時間,同時支持 watermark 機制處理滯后數據。
Flink 支持三種時間機制:事件時間,注入時間,處理時間,同時支持 watermark 機制處理遲到的數據,說明Flink在處理亂序大實時數據的時候,優勢比較大。
作者介紹:TNTEVE,狐小E資深開發工程師,專注移動協同辦公平台的SAAS軟件開發以及輕應用開發
最近開發了一款移動辦公軟件狐小E