目前存在著很多種在實時數(shù)據(jù)被保存進數(shù)據(jù)庫之前系統(tǒng)對這些數(shù)據(jù)進行處理的方式,。例如,,現(xiàn)在最常見的兩個開源平臺就是Apache Storm和Apache Spark(帶有它自身Spark Streaming框架),它們都擁有一種非常特有的處理數(shù)據(jù)流的方法,。Storm,像SQLstream Blaze,、IBM InfoSphere Streams還有其它一些產(chǎn)品,,是真正的record-by-record流處理引擎。而其它的像Apache Spark則使用一種不同的方式,,通過把事件收集起來,,然后進行批處理。在考慮這些非常容易混淆的范例的時候,,我對需要重點考慮的事項做了如下總結(jié): #1流處理方式與批處理方式在數(shù)據(jù)流處理的對比 在流處理的過程中有兩個基本的特征,。第一,系統(tǒng)里面的每一條記錄都要有一個時間戳,99%的記錄都是把數(shù)據(jù)產(chǎn)生的那個時間作為時間戳,;第二,,每一條記錄都是當它到達的時候就被處理。這兩個特性可以保證系統(tǒng)能夠根據(jù)時間的先后對每一條記錄進行反應(yīng),,并且把延遲降低到毫秒級,。相比而言,像Spark Streaming這種把數(shù)據(jù)流批處理的方法,,每一個批處理操作都包含了一個批處理周期到達的事件的集合(不管這些數(shù)據(jù)實際是什么時候產(chǎn)生的),。這種方法雖然對簡單計數(shù)或者ETL數(shù)據(jù)進Hadoop是有好處的,但是,,由于缺乏record-by-record的處理機制,,則無法實現(xiàn)流處理以及時間序列分析。 #2處理不按時間到達的數(shù)據(jù)對于基于批處理的方法來說是一個大問題 在真實世界中處理數(shù)據(jù)是一個非常麻煩的事情,。數(shù)據(jù)一般的質(zhì)量都不高,,記錄可能會丟失,并且數(shù)據(jù)到達的時間可能不按正常的時間(產(chǎn)生)順序,。從不同的遠程數(shù)據(jù)源到來的數(shù)據(jù)可能是在同一時間產(chǎn)生的,,但是由于網(wǎng)絡(luò)或者其他一些原因,一些數(shù)據(jù)流可能延遲到達,。對于批處理的儲存來說,,這些數(shù)據(jù)流的問題不能夠很容易被解決,對于檢測丟失數(shù)據(jù),、數(shù)據(jù)間隙還有糾正數(shù)據(jù)到達的順序等操作會無法實現(xiàn)或者會花費大量的代價(計算資源并且影響性能),。但對于record-by-record流處理平臺,由于每個記錄都有自己的時間戳,,并且是單獨處理,,因此上面的問題很容易得到解決。 #3 批的長度約束了基于窗口的分析 任何一個使用基于批處理數(shù)據(jù)流方式的系統(tǒng)都會由于批的長度而被限制了處理的粒度,。Window操作可以通過對一系列的微批次進行迭代來進行模擬,,很大程度上就像對存儲數(shù)據(jù)的靜態(tài)查詢操作。但是,,這樣對處理資源來說代價非常大并且會進一步加大計算開銷,。另外,處理過程也會被數(shù)據(jù)的到達時間限制(而不是數(shù)據(jù)產(chǎn)生的時間),。 #4 Spark聲稱是比Storm要快但還是會有性能限制 Spark Streaming的Java或者Scala-based的運行宣稱要比使用WordCount基準的Apache Storm快4到8倍,。盡管Apache Storm可以通過向外擴展大量的服務(wù)器來提升總體性能,但是由于它的流處理使用標準,,它的每一臺服務(wù)器的性能是有限的,。(而不斷擴展服務(wù)器的這個操作會增加花銷,,包括在服務(wù)器成本、能源成本,、冷卻成本上,,另外,這也是增加分布式系統(tǒng)復(fù)雜性的一個因素),。目前,,Spark Streaming的性能可以通過使用大量的批次來改善,這可以增加性能,,但是大量的批次會讓Spark Streaming遠離實時分析,,而成為了批處理存儲模式,并且會減弱處理流處理,、實時處理,、時序分析等問題的能力。 #5 從scratch編寫流處理操作并不容易 基于批處理的平臺例如Spark Streaming,,對于到達數(shù)據(jù)的聚合以及計數(shù)只是提供了很有限的一些流處理函數(shù)的庫,。在Spark Streaming上寫一個流分析應(yīng)用需要在Java or Scala上去寫代碼。處理數(shù)據(jù)流使用的是不同的范式,,而且,,Java的緊湊程度比SQL低50倍,這意味著需要寫更多的代碼,。Java和Scala需要有效的垃圾收集機制,,而這些機制在內(nèi)存處理上面是非常低效以及麻煩的。
|
|