1、storm是一個用於實時流式計算的分佈式計算引擎,彌補了Hadoop在實時計算方面的不足(Hadoop在本質上是一個批處理系統)。html
2、storm在實際應用場景中的位置通常以下:java
其中的編號1~5說明以下:python
一、Flume用於收集日誌信息;mysql
二、結合數據傳輸功能能夠把收集到的日誌信息實時傳輸到kafka集羣,或保存到Hadoop hdfs中保存。git
這裏之因此選擇kafka集羣是由於kafka集羣具有緩衝功能,能夠防止數據採集速度和數據處理速度不匹配致使數據丟失,這樣作能夠提升可靠性。github
三、使用storm實時處理數據;算法
四、保存storm處理的結果數據,當數據量不是特別巨大時,可使用MySQL存儲;當數據量特別巨大時,能夠選擇hdfs存儲。sql
五、用於實時展現處理結果。數據庫
3、storm的抽象運行方式:apache
其中:
spout爲數據流的源頭;
tuple爲流動中的數據承載單元;
Bolt爲數據流處理的中間狀態。
4、spout和Bolt如何造成程序運行?
storm中運行的程序稱爲Topology,Topology將spout和bolt組裝在一塊兒,完成實時計算的任務。具體操做是經過TopologyBuilder的setSpout方法和setBolt方法,例子以下:
5、如何決定數據流的流向:
(1)藉助在TopologyBuilder的setSpout方法和setBolt方法的第一個參數中爲Spout程序和Bolt程序取的名字,例如上面示例代碼中的「spout-name」以及「bolt-name-one」,「bolt-name-two」。
補充:setBolt方法原型:
setSpout方法原型:
(2)setBolt方法返回的BoltDeclarer對象利用fieldGrouping方法並結合(1)中的spout和bolt名字指定數據流的流向。
補充:fieldGrouping方法原型:
6、數據流中的數據承載單元tuple結構是什麼
官網文檔以下:
The tuple is the main data structure in Storm. A tuple is a named list of values, where each value can be any type. Tuples are dynamically typed -- the types of the fields do not need to be declared. Tuples have helper methods like getInteger and getString to get field values without having to cast the result. Storm needs to know how to serialize all the values in a tuple. By default, Storm knows how to serialize the primitive types, strings, and byte arrays. If you want to use another type, you'll need to implement and register a serializer for that type. See http://github.com/nathanmarz/storm/wiki/Serialization
for more info.
通俗的講,tuple就是一個值列表,其中的值類型能夠是任何類型,默認類型有byte,integer,short,long,float,double,string,byte[]。
tuple數據結構以下:
其中,fieldName是定義在declareOutputFields方法中的Fields對象,fieldValue值是在emit方法中發送的Values對象。
tuple都是經過spout和bolt發射(傳送)的。
例如:
spout程序以下:
bolt程序以下:
7、spout如何發射無界的數據流,bolt如何處理接收到的數據tuple
(1)如在上一部分spout的示例代碼,其中必含有nextTuple方法,在spout程序生命週期中,nextTuple方法一直運行,因此能夠一直獲取數據流中的數據並持續像bolt處理程序發射。
(2)如在上一部分bolt的示例代碼,其中必含有execute方法,在bolt程序生命週期中,只要其收到tuple數據就會處理,根據須要會把處理後的數據繼續發射出去。
8、如何保證全部發射的數據tuple都被正確處理
同一個tuple不論是處理成功仍是失敗,都由建立它的Spout發射並維護。
9、storm和Hadoop中各角色對比
10、storm比Hadoop實時是由於Hadoop在把一批數據都處理完畢後才輸出處理結果,而storm是處理一點數據就實時輸出這些數據的處理結果。
Storm與傳統關係型數據庫
傳統關係型數據庫是先存後計算,而storm則是先算後存,甚至不存
傳統關係型數據庫很難部署實時計算,只能部署定時任務統計分析窗口數據
關係型數據庫重視事務,併發控制,相對來講Storm比較簡陋
Storm不Hadoop,Spark等是流行的大數據方案
與Storm關係密切的語言:核心代碼用clojure書寫,實用程序用python開發,使用java開發拓撲
Storm集羣中有兩種節點,一種是控制節點(Nimbus節點),另外一種是工做節點(Supervisor節點)。全部Topology任務的 提交必須在Storm客戶端節點上進行(須要配置 storm.yaml文件),由Nimbus節點分配給其餘Supervisor節點進行處理。 Nimbus節點首先將提交的Topology進行分片,分紅一個個的Task,並將Task和Supervisor相關的信息提交到 zookeeper集羣上,Supervisor會去zookeeper集羣上認領本身的Task,通知本身的Worker進程進行Task的處理。 和一樣是計算框架的MapReduce相比,MapReduce集羣上運行的是Job,而Storm集羣上運行的是Topology。可是Job在運行結束以後會自行結束,Topology卻只能被手動的kill掉,不然會一直運行下去 Storm不處理計算結果的保存,這是應用代碼須要負責的事情,若是數據不大,你能夠簡單地保存在內存裏,也能夠每次都更新數據庫,也能夠採用NoSQL存儲。這部分事情徹底交給用戶。 數據存儲以後的展示,也是你須要本身處理的,storm UI 只提供對topology的監控和統計。