在大數據出現的早期,當時企業或者開發者所注重的都是批量計算,當時對於開發者來說,對於一定量數據的處理,利用普通的程序就可以解決,然而當數據量或者計算量到達一定數量之后,應用程序的計算需要的時間也和數據量一樣飛速增長,這個時候僅僅依靠傳統的應用程序就遇到的很大的瓶頸,這個時候,一方面通過優化程序內部算法和一些機制等各種底層優化來提高系統性能和處理效率,另一方面是提高硬件的質量,也就是提高服務器的配置,從而提升計算速度和I/O,但是這樣應對數據量的急速增長,顯然會出現問題,開發成本和部署成本也在不斷的提高,所以很多公司在具體的業務場景上都想到了一個共同的方法,那就是把一個復雜的任務放到多台計算機上執行,這樣服務器配置不用太高,一般機器也可以,並且效率大大提升,當數據量繼續增大時,那么繼續增加服務器分擔任務即可,這樣就形成的初期的分布式計算系統。
對於前面所說的分布式計算系統,如果一個公司開發出來,另外公司想要拿過來用,根本是不可能的,因為這涉及到不同的硬件配置,通信方式,處理的業務等等都不相同,所以根本不能通用,當時也有開發者試着抽象出來一種通用的大數據處理框架,但是效果不太理想,比如會有使用難度太大,應用到實際場景限制過多等問題,這樣的話也限制了大數據技術的發展,當時最流行的計算方式就是高性能分布式計算和網格計算,,直到2003、2004、2006年Google分別發表了3篇論文,分別是Google File System(簡稱GFS)、BigTable、Google MapReduce;發表這三篇論文才使大數據技術有了第一次飛躍,開啟了真正的大數據時代,GFS使文件存儲系統,BigTable是數據存儲系統,MapReduce是計算模型,這樣將大數據技術進行了一般性抽象,開啟了后來大數據技術的大門,谷歌雖然沒有將他的成果開源,但是后來有人根據谷歌的計算模型開發出來,最后就形成了Apache開源基金會的一個項目,就是Hadoop,Hadoop的主要組成是HDFS和MapReduce,其中HDFS是GFS的開源實現,MapReduce是Google MapReduce的開源實現,Hadoop在處理大批量數據時表現非常好,后來圍繞這一中心形成了Hadoop生態系統,比如:
Hbase,相當於BigTable的分布式NoSQL系列的數據庫
Hive數據倉庫工具,由Facebook貢獻,
Zookeeper 分布式鎖,提供類似Google Chubby的功能,有Facebook貢獻
Avro 數據序列化與傳輸工具,將逐步取代Hadoop原有的IPC機制
Pig 大數據分析平台,
Ambari Hadoop的管理工具,可以快捷的監控、部署、管理集群
Sqoop 支持Hadoop與傳統數據庫之間進行數據的傳遞
Mahout 用於數據挖掘和機器學習實現,實現文檔聚類、做出推薦和組織內容等,創始人是Grant Ingersoll
以上這些等等,形成了Hadoop的生態系統,一下是在網上找到的一張經典的Hadoop生態系統圖:
HDFS存儲模型:

MapReduce計算模型:

以上這些Hadoop生態圈對批量處理TB、PB級的大數據是可靠的,不過在生產過程中逐步出現一些不足之處,仔細想想我們也可以發現,批量數據處理中,有以下的特點:
1、計算開始之前,數據必須提前准備好,然后才可以開始計算
2、當大量數據計算完成之后,會輸出最后計算結果,完成計算
3、時效性比較低,不適用於實時的計算
針對以上這些問題,才慢慢形成了流式計算的這樣一種概念,流式計算主要應用場景就是在線海量數據處理,處理大量用戶的在線請求,可以理解為一台服務器,這個服務是一直開着的,只要用戶有請求它都會去實時處理並輸出結果或者響應,可以看成一個數據流源源不斷的流進計算系統,計算系統作為后台服務源源不斷的進行計算,最終將結果源源不斷的輸出,這就是對流式計算最基本一層的認識
在實際應用中,可以處理用戶線上實時的請求,在線系統產生的日志,記錄用戶行為的數據庫,新聞熱點,電商促銷,微博熱詞推薦,實時用戶在線查詢等
目前流式計算最著名的框架就是:Spark、Twitter的Storm、Yahoo的S4
流式計算的共同特征是:
1、和前面Hadoop生態系統作對比主要是:計算中數據持續到來、實時系統會作為后台服務持續運行、適用於時效性較高的場景
2、非常方便的編寫自己的計算邏輯,而不用關心底層的實現方式,比如Map和Reduce,我們只需要編寫兩個方法,和單機的計算方式一樣,框架自己完成分布式協調計算的功能,所以對於用戶使用非常方便
3、數據可靠性,系統需要保證數據不被丟失,也就是系統的高可用性
4、容錯性 用戶不必關心錯誤處理,系統應該提供高容錯性並且有效的調度和管理資源
5、超時設置 超時時間的大小一定要被重視,時間太短會誤殺正常運算,時間太長不能快速的檢測錯誤,系統應該有延時自動學習的功能,即根據多個計算任務找出出錯的任務,然后重新將任務調度到系統中的其他節點,這樣保證整個系統的性能
Spark的設計思想是將流式計算分解成一系列短小的批處理作業,也就是把Spark Streaming的輸入數據按照時間分成一段一段的數據,每一段數據都轉換成Spark中的RDD,然后在Spark內部對RDD進行處理操作,結果可以放到內存中繼續處理或者存儲到外部設備
Storm將計算邏輯抽象為拓撲Topology,Spout是Topology的數據源,數據源可以是日志或者消息隊列,也可以是數據庫中的表等等數據,Bolt負責數據的整個傳遞方向,也叫消息處理者,Bolt可能由另外2個Bolt進行join得到,在Storm中數據流的單位就是Tuple(元組),這個Tuple可能是由多個Fields字段構成,每個字段都由Bolt定義,Storm中工作進程叫做worker,一個Topology實際上實在多個worker中運行的,在集群中每個Spout和Bolt都是由多個Tasks(任務)組成的,對於宏觀的節點,分為Nimbus主節點和Supervisor從節點,Nimbus通過Zookeeper管理集群所有的Supervisor,Storm提供很多配置來調整Nimbus、Supervisor進程和正在運行的Topology的行為
所以,總結一下Storm的計算流程,首先是用戶使用Storm提供的API編寫Topology計算邏輯,然后使用Storm提供的Client將Topology提交給Nimbus,然后Nimbus將Task作業指派給Supervisor,Supervisor在得到Task后,為Task啟動Worker由Worker執行具體的Task,最后完成計算任務
Storm實際性能上比Spark還要高,總體上來說,Spark和Storm是流式計算中最著名使用也最廣泛的2個框架
另外Google為了應對並發數據流水線和以及實時數據,將MapReduce分布式計算模型進行了全新嘗試,推出Cloud Dataflow,可以構建、管理、優化復雜流水線,構建雲應用,並且提供了基於Java的統一API,開發者只需要使用簡單的API即可掌握Cloud Dataflow的使用,Google Cloud Platform還為開發者提供了一系列工具:雲保存、雲調試、雲追蹤和雲監控,BigQuery為Dataflow提供存儲,數據流經過Dataflow的清洗,可以放到BigQuery中存儲;同時Dataflow還可以連接BigQuery進行數據的讀取,因此如果想在Dataflow中使用一些開源資源是非常方便的,Dataflow的生態系統如下圖所示:

以上就是簡單的說了大數據處理技術的發展歷程和流式計算框架的產生,從最初的網格計算到Hadoop生態系統是一次巨大的飛躍,從大數據批量計算到Spark、Storm、YahooS4和Google Cloud Dataflow這些大數據流式計算技術的產生又是一次巨大的飛躍,文中有很多地方也許理解的不夠到位,歡迎指正,相信在未來DT時代,大數據計算技術將為各行各業注入新的生命力...
