storm入門教程1:storm概述


 
問題導讀:
1.Storm是什么,應用場景有哪些?
2.Storm有什么特點?
3.spout發出的消息后續可能會觸發產生成千上萬條消息,Storm如何跟蹤這條消息樹的?
4.Storm本地模式的作用是什么?






  1.1 實時流計算
  互聯網從誕生的第一時間起,對世界的最大的改變就是讓信息能夠實時交互,從而大大加速了各個環節的效率。正因為大家對信息實時響應、實時交互的需求,軟件行業除了個人操作系統之外,數據庫(更精確的說是關系型數據庫)應該是軟件行業發展最快、收益最為豐厚的產品了。記得十年前,很多銀行別說實時轉賬,連實時查詢都做不到,但是數據庫和高速網絡改變了這個情況。

  隨着互聯網的更進一步發展,從Portal信息瀏覽型到Search信息搜索型到SNS關系交互傳遞型,以及電子商務、互聯網旅游生活產品等將生活中的流通環節在線化。對效率的要求讓大家對於實時性的要求進一步提升,而信息的交互和溝通正在從點對點往信息鏈甚至信息網的方向發展,這樣必然帶來數據在各個維度的交叉關聯,數據爆炸已不可避免。因此流式處理加NoSQL產品應運而生,分別解決實時框架和數據大規模存儲計算的問題。

  早在7、8年前諸如UC伯克利、斯坦福等大學就開始了對流式數據處理的研究,但是由於更多的關注於金融行業的業務場景或者互聯網流量監控的業務場景,以及當時互聯網數據場景的限制,造成了研究多是基於對傳統數據庫處理的流式化,對流式框架本身的研究偏少。目前這樣的研究逐漸沒有了聲音,工業界更多的精力轉向了實時數據庫。

  2010年Yahoo!對S4的開源,2011年twitter對Storm的開源,改變了這個情況。以前互聯網的開發人員在做一個實時應用的時候,除了要關注應用邏輯計算處理本身,還要為了數據的實時流轉、交互、分布大傷腦筋。但是現在情況卻大為不同,以Storm為例,開發人員可以快速的搭建一套健壯、易用的實時流處理框架,配合SQL產品或者NoSQL產品或者MapReduce計算平台,就可以低成本的做出很多以前很難想象的實時產品:比如一淘數據部的量子恆道品牌旗下的多個產品就是構建在實時流處理平台上的。

  本教程是一本對storm的基礎介紹手冊,但是我們也希望它不僅僅是一本storm的使用手冊,我們會在其中加入更多我們在實際數據生產過程的經驗和應用的架構,最后的目的是幫助所有願意使用實時流處理框架的技術同仁,同時也默默的改變這個世界。

  1.2 Storm特點
  Storm是一個開源的分布式實時計算系統,可以簡單、可靠的處理大量的數據流。Storm有很多使用場景:如實時分析,在線機器學習,持續計算,分布式RPC,ETL等等。Storm支持水平擴展,具有高容錯性,保證每個消息都會得到處理,而且處理速度很快(在一個小集群中,每個結點每秒可以處理數以百萬計的消息)。Storm的部署和運維都很便捷,而且更為重要的是可以使用任意編程語言來開發應用。

  Storm有如下特點:
  編程模型簡單
  在大數據處理方面相信大家對hadoop已經耳熟能詳,基於Google Map/Reduce來實現的Hadoop為開發者提供了map、reduce原語,使並行批處理程序變得非常地簡單和優美。同樣,Storm也為大數據的實時計算提供了一些簡單優美的原語,這大大降低了開發並行實時處理的任務的復雜性,幫助你快速、高效的開發應用。

  可擴展
  在Storm集群中真正運行topology的主要有三個實體:工作進程、線程和任務。Storm集群中的每台機器上都可以運行多個工作進程,每個工作進程又可創建多個線程,每個線程可以執行多個任務,任務是真正進行數據處理的實體,我們開發的spout、bolt就是作為一個或者多個任務的方式執行的。
  因此,計算任務在多個線程、進程和服務器之間並行進行,支持靈活的水平擴展。

  高可靠性
  Storm可以保證spout發出的每條消息都能被“完全處理”,這也是直接區別於其他實時系統的地方,如S4。

  請注意,spout發出的消息后續可能會觸發產生成千上萬條消息,可以形象的理解為一棵消息樹,其中spout發出的消息為樹根,Storm會跟蹤這棵消息樹的處理情況,只有當這棵消息樹中的所有消息都被處理了,Storm才會認為spout發出的這個消息已經被“完全處理”。如果這棵消息樹中的任何一個消息處理失敗了,或者整棵消息樹在限定的時間內沒有“完全處理”,那么spout發出的消息就會重發。

  考慮到盡可能減少對內存的消耗,Storm並不會跟蹤消息樹中的每個消息,而是采用了一些特殊的策略,它把消息樹當作一個整體來跟蹤,對消息樹中所有消息的唯一id進行異或計算,通過是否為零來判定spout發出的消息是否被“完全處理”,這極大的節約了內存和簡化了判定邏輯,后面會對這種機制進行詳細介紹。

  這種模式,每發送一個消息,都會同步發送一個ack/fail,對於網絡的帶寬會有一定的消耗,如果對於可靠性要求不高,可通過使用不同的emit接口關閉該模式。

  上面所說的,Storm保證了每個消息至少被處理一次,但是對於有些計算場合,會嚴格要求每個消息只被處理一次,幸而Storm的0.7.0引入了事務性拓撲,解決了這個問題,后面會有詳述。

  高容錯性
  如果在消息處理過程中出了一些異常,Storm會重新安排這個出問題的處理單元。Storm保證一個處理單元永遠運行(除非你顯式殺掉這個處理單元)。

  當然,如果處理單元中存儲了中間狀態,那么當處理單元重新被Storm啟動的時候,需要應用自己處理中間狀態的恢復。

  支持多種編程語言
  除了用java實現spout和bolt,你還可以使用任何你熟悉的編程語言來完成這項工作,這一切得益於Storm所謂的多語言協議。多語言協議是Storm內部的一種特殊協議,允許spout或者bolt使用標准輸入和標准輸出來進行消息傳遞,傳遞的消息為單行文本或者是json編碼的多行。

  Storm支持多語言編程主要是通過ShellBolt, ShellSpout和ShellProcess這些類來實現的,這些類都實現了IBolt 和 ISpout接口,以及讓shell通過java的ProcessBuilder類來執行腳本或者程序的協議。

  可以看到,采用這種方式,每個tuple在處理的時候都需要進行json的編解碼,因此在吞吐量上會有較大影響。

  支持本地模式
  Storm有一種“本地模式”,也就是在進程中模擬一個Storm集群的所有功能,以本地模式運行topology跟在集群上運行topology類似,這對於我們開發和測試來說非常有用。

  高效
  用ZeroMQ作為底層消息隊列, 保證消息能快速被處理


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM