大數據開發實戰:Storm流計算開發

    Storm是一個分佈式、高容錯、高可靠性的實時計算系統,它對於實時計算的意義至關於Hadoop對於批處理的意義。Hadoop提供了Map和Reduce原語。一樣,Storm也對數據的實時處理提供了簡單的數據庫

  spout和bolt原語。Storm集羣表面上看和Hadoop集羣很是像,但Hadoop上面運行的是MapReduce的Job,而Storm上面運行的是topology(拓撲),它們很是不同,好比一個MapReduce的Job最終會結束,數組

  而一個Storm topology永遠運行(除非顯式殺掉它)服務器

  一、Storm集羣的總體架構

   

  二、Storm關鍵概念

    topology網絡

      一個事實應用程序在Storm中稱爲一個拓撲(topology), Storm中的拓撲相似於Hadoop的MapReduce任務,不一樣之處是,一個MapReduce任務總會運行完成,而拓撲若是不顯式結束則一直運行。架構

    一個Storm拓撲通常由一個或者多個spout(負責發送消息)以及一個或者多個bol(負責處理消息)作組成。併發

    tuple負載均衡

      Storm處理的基本消息單元爲tuple(元組),Tuple是一個明明值列表,元組中的字段能夠是任何類型的對象。Storm用元組做爲其數據模型,元組支持全部基本類型、字符串和字節數組做爲字段值,框架

    只要實現類型的序列化接口,就可使用該類型的對象。元組是一個值的列表。分佈式

    函數

      流(Stream)在Storm中是一個核心抽象概念。一個流是由無數個元組序列構成,這些元組並行、分佈式的被建立和執行。在stream的許多元組中,Streams被定義爲以Fields區域命名的一種模式。

    默認狀況下,元組支持:Integers,longs,shorts,bytes,strings,doubles,floats,booleans,and byte arrays.

      每個Stream在聲明的時候都會賦予一個id,單個Stream--spouts和bolts,可使用OutputFieldsDeclarer的convenience方法聲明一個stream.而不用指定一個id,可是這種方法會給一個模式的id:  default。

    spout

      spout(噴口)是topology的流的來源,是一個topology中產生源數據流的組件。一般狀況下,spout會從外表數據源(例如kafak隊列或Tiwitter API)中讀取數據,而後轉爲爲topology 內部的源數據。

    spout能夠是可靠是,也能夠是不可靠的。若是Storm處理元組失敗,可靠的spout可以從新發射,不可靠的spout沒法從新發射已經發出的元組。spout是一個主動的角色,其接口中有一個nextTuple()函數,

    Storm框架會不停的調用此函數,用戶只要在其中生成源數據便可。

      spout能夠發出超過一個的流。爲此,使用OutputFieldsDeclarer類的declareStream方法來聲明多個流,使用SpoutOutputCollector類的emit執行方法來進行流的提交。

      spout的主要方法是nextTuple(),nextTuple()會發出一個新的tuple到拓撲,若是沒有新的元組發出,則簡單地返回。nextTuple()方法不阻止任何的spout的實現,由於stream在同一個線程調用全部

    spout方法。

      spout的其它主要方法是ack()和fail(). 當Storm監測到一個tuple從spout發出時,ack()和fail()會被調用,要麼成功完成經過拓撲,要麼未能完成。ack()和fail()僅被可靠的spout調用。IRichSpout是 spout

    必須實現的接口。

    bolt

      拓撲中全部處理邏輯都在bolt(螺栓)中完成,bolt是流的處理節點,從一個拓撲接收數據後執行進行出來的 組件。bolt能夠完成過濾(filter)、業務處理。鏈接運算(join)、鏈接與訪問數據庫的等任何操做。

    bolt是一個被動的角色,其接口中只有一個execute()方法,此方法在接收到消息後會被調用,用戶能夠在其中執行本身但願的操做。

      bolt能夠完成簡單的流的轉換,而完成複雜的流的轉換一般須要多個步驟,所以須要多個bolt。此外,bolt也能夠發出超過一個的流。

      bolt的主要方法是execute()方法,該方法將一個元組做爲輸入。bolt使用 OutputCollector對象發射新tuple。bolt必須爲他們處理的每一個元組調用OutputCollector類的ack()方法,以便Storm只是什麼

    時候元組會完成。

    流分組

      定義一個topology的步驟之一是定義每一個bolt接收什麼樣的流做爲輸入。流分組(stream grouping)用來定義一個Strream應該如何分配數據給bolts上的多個任務。

      在Storm中,有8種內置流分組方式,經過實現CustomStreamGrouping接口,用戶能夠實現本身的流分組方式。

      shuffle grouping(隨機分組):這種方式會隨機分發tuple給bolt的各個任務,每一個bolt實例接收相同數量的tuple。

      fields grouping(字段分組):根據指定字段的值進行分組,例如,一個數據流根據「word」字段進行分組,全部具備相同"word"字段值的(tuple)會路由到同一個(bolt)的task中。

      all grouping(全複製分組):將全部的tuple複製後分發給全部bolt task, 每一個訂閱數據流的task都會接收到全部的tuple的一份備份。

      globle grouping(全局分組):這種分組方式將全部的tuples路由到惟一的任務上,Storm按照最小的taskID來接收數據的task,注意,當使用全局分組方式時,設置bolt的task併發度是沒有意義的(spout併發有意義),

      由於全部的tuple都轉發到一個task上了,此外,由於全部的tuple都轉發到一個JVM實例上,可能會引發Storm集羣中某個JVM或服務器出現性能瓶頸或崩潰。

      none grouping(不分組):在功能上和隨機分組相同,是爲未來預留的。

      direct grouping(指向性分組):數據源會調用emitDirect()方法來判斷一個tuple應該由哪一個Storm組件來接收。

      local or shuffle grouping(本地或隨機分組):和隨機分組相似,可是會將tuple分發給同一個worker內的bolt task(若是workder內有接收數據的bolt task),其它狀況下,則採用隨機分組的方式。本地或隨機分組取決於

      topology的併發度,能夠減小網絡傳輸,從而提升topology性能。

      partial key grouping:與按字段分組相似,根據指定字段的一部分進行分組分發,可以很好的實現負載均衡,將元組發送給下游的bolt對應的任務,特別是存在數據傾斜的狀況下,使用partial key grouping可以很好的 

      提升資源利用率。

 

   三、Storm併發

      Storm集羣中真正運行topology的主要有三個實體:worker(工做進程),executor(線程)和task(任務)。

 

    參考資料:《離線和實時大數據開發實戰》

相關文章
相關標籤/搜索