1. 程式人生 > >大資料(十四)

大資料(十四)

storm是一個分散式實時計算引擎 storm/Jstorm的安裝、配置、啟動幾乎一模一樣 storm是twitter開源的

storm的特點 storm支援熱部署,即時上限或下線app 可以在storm上使用各種程式語言如clojure、java、ruby、python等 本地模式:storm有一個本地模式,可以在處理過程中完全模擬storm叢集,便於開發和測試。 storm使用場景     1、流聚合:把兩個或多個數據流聚合成一個數據流:基於一些共同的tuple欄位     2、批處理:因為效能或其他原因     3、BasicBolt:太常見的一種場景,所以storm內建了實現     4、記憶體內快取+fields grouping組合     5、計算top N     6、TImecachemapping     7、分散式DRPC 基本概念
Topology:計算拓撲,即一個應用程式app(通過storm jar釋出),因為各個元件間的訊息流動形成邏輯上的一個拓撲結構,因此得名。     TopologyBuilder是拓撲構建器,將spout、bolt等組合起來 spout:訊息流的源頭,訊息生產者。 bolt:訊息處理者 Reliability:可靠性,storm保證每個tuple都會被處理。 task:任務,每個spout和bolt都是一個任務,每個任務預設是一個執行緒。 worker:工作程序,每個工作程序都有多個task Values:資料容器 Tuple  英[tʌpl]:一個訊息傳遞的基本單元,傳送的資料封裝到tuple中,實際就是一個value list
        JStorm將流中資料抽象為tuple,一個tuple就是一個值列表value list,list中的每個value都有一個name,並且該value可以是基本型別,字元型別,位元組陣列等,當然也可以是其他可序列化的型別。 Stream:訊息流,源源不斷的tuple組成了stream stream grouping:訊息分發策略,一共6種,定義每個bolt接收什麼樣的訊息。 Cofig:設定一些配置資訊 StormSubmitter/LocalCluster拓撲提交器 tuple在傳輸過程中需要序列化和反序列化 spout從外部資料來源讀取tuple,emit到topology裡 spout分可靠的和非可靠的兩種,對可靠的,還支援ack和fail方法 Storm Topology是基於Thrift結構, 並且Nimbus是個Thrift server, 所以對於Topology可以用任何語言實現, 最終都是轉化為Thrift結構 重要的是, nimbus和supervisor的fail或restart不會影響worker的工作 打比方
Nimbus是老總,下放程式碼 zookeeper是專案經理,管理叢集中的元件,管理任務task,負責nimbus和supervisor協調工作 supervisor是工程主管或技術主管,管理工作程序worker work是工人,工作程序,他們處理任務task task即任務,worker程序中每一個spout、bolt、actor的執行緒都是一個task任務 actor負責跟蹤監控任務spout、bolt的執行,他也是任務task executor是執行緒,一個task預設由一個executor執行緒執行,當然一個executor執行緒裡可以處理多個task storm叢集結構 叢集由一個主節點和多個子節點(控制節點和工作節點)組成。 1、主節點/控制節點:執行著一個叫做Nimbus的守護程序,負責分配程式碼、佈置任務、故障將側。 2、子節點/工作節點,執行著一個名為Supervisor的守護程序,負責監聽工作,開始並終止工作程序worker nimubus和storm ui需要在同一臺機子上 tuple流的分組機制,即訊息分發策略(以下是常用的策略)     shuffle grouping:隨機分組,隨機派發stream裡的tuple,保證每個bolt收到的tuple數量相同。     field grouping:按欄位分組,如userid,具有相同uiserid的tuple會被分到相同的bolt。(相同userid的tuple會分到相同的bolt中,但是這個bolt中可以有多種tuple)     all grouping:廣播發送,針對一個tuple,所有bolt都會受到(謹慎使用)     global grouping:全域性分組,指全部流都發送到Bolt的同一個任務中,再具體一點,是傳送給ID最小的任務。     non grouping:不分組,不需要關心怎麼分組,目前等效於隨機分組 storm元件生命週期 Spout方法呼叫順序     declareOutputFields     topology提交過程中會呼叫spout和bolt的這個方法     open     類似bolt的prepare方法,而且引數也類似,可以處理配置資訊,做準備工作     activate     nextTuple    迴圈呼叫     deactivate Bolt方法呼叫順序     declareOutputFields     prepare     execute    迴圈呼叫 storm可靠性 storm有預設的配置檔案,在storm jar包裡 storm.yaml storm有一種機制可以保證從spout發出的每個tuple都會被完全處理。 什麼樣的訊息被認為完整處理了:     1、tuple tree不再生長     2、樹中的任何訊息都標識為"已處理" storm配置

storm.zookeeper.servers

ZooKeeper伺服器列表

storm.zookeeper.port

ZooKeeper連線埠

storm.local.dir

storm使用的本地檔案系統目錄(必須存在並且storm程序可讀寫)

storm.cluster.mode

Storm叢集執行模式([distributed|local])

storm.local.mode.zmq

Local模式下是否使用ZeroMQ作訊息系統,如果設定為false則使用java訊息系統。預設為false

storm.zookeeper.root

ZooKeeperStorm的根目錄位置

storm.zookeeper.session.timeout

客戶端連線ZooKeeper超時時間

storm.id

執行中拓撲的id,storm name和一個唯一隨機陣列成。

nimbus.host

nimbus伺服器地址

nimbus.thrift.port

nimbusthrift監聽埠

nimbus.childopts

通過storm-deploy專案部署時指定給nimbus程序的jvm選項

nimbus.task.timeout.secs

心跳超時時間,超時後nimbus會認為task死掉並重分配給另一個地址。

nimbus.monitor.freq.secs

nimbus檢查心跳和重分配任務的時間間隔.注意如果是機器宕掉nimbus會立即接管並處理。

nimbus.supervisor.timeout.secs

supervisor的心跳超時時間,一旦超過nimbus會認為該supervisor已死並停止為它分發新任務.

nimbus.task.launch.secs

task啟動時的一個特殊超時設定.在啟動後第一次心跳前會使用該值來臨時替代nimbus.task.timeout.secs.

nimbus.reassign

當發現task失敗時nimbus是否重新分配執行。預設為真,不建議修改。

nimbus.file.copy.expiration.secs

nimbus判斷上傳/下載連結的超時時間,當空閒時間超過該設定時nimbus會認為連結死掉並主動斷開

ui.port

Storm UI的服務埠

drpc.servers

DRPC伺服器列表,以便DRPCSpout知道和誰通訊

drpc.port

Storm DRPC的服務埠

supervisor.slots.ports

supervisor上能夠執行workers的埠列表.每個worker佔用一個埠,且每個埠只執行一個worker.通過這項配置可以調整每臺機器上執行的worker.(調整slot/每機)

supervisor.childopts

storm-deploy專案中使用,用來配置supervisor守護程序的jvm選項

supervisor.worker.timeout.secs

supervisor中的worker心跳超時時間,一旦超時supervisor會嘗試重啟worker程序.

supervisor.worker.start.timeout.secs

supervisor初始啟動時,worker的心跳超時時間,當超過該時間supervisor會嘗試重啟worker。因為JVM初始啟動和配置會帶來的額外消耗,從而使得第一次心跳會超過supervisor.worker.timeout.secs的設定

supervisor.enable

supervisor是否應當執行分配給他的workers.預設為true,該選項用來進行Storm的單元測試,一般不應修改.

supervisor.heartbeat.frequency.secs

supervisor心跳傳送頻率(多久傳送一次)

supervisor.monitor.frequency.secs

supervisor檢查worker心跳的頻率

worker.childopts

supervisor啟動worker時使用的jvm選項.所有的”%ID%”字串會被替換為對應worker的識別符號

worker.heartbeat.frequency.secs

worker的心跳傳送時間間隔

task.heartbeat.frequency.secs

task彙報狀態心跳時間間隔

task.refresh.poll.secs

task與其他tasks之間連結同步的頻率.(如果task被重分配,其他tasks向它傳送訊息需要重新整理連線).一般來講,重分配發生時其他tasks會理解得到通知。該配置僅僅為了防止未通知的情況。

topology.debug

如果設定成trueStorm將記錄發射的每條資訊。

topology.optimize

master是否在合適時機通過在單個執行緒內執行多個task以達到優化topologies的目的.

topology.workers

執行該topology叢集中應當啟動的程序數量.每個程序內部將以執行緒方式執行一定數目的tasks.topology的元件結合該引數和並行度提示來優化效能

topology.ackers

topology中啟動的acker任務數.Acker儲存由spout傳送的tuples的記錄,並探測tuple何時被完全處理.Acker探測到tuple被處理完畢時會向spout傳送確認資訊.通常應當根據topology的吞吐量來確定acker的數目, 但一般不需要太多.當設定為0,相當於禁用了訊息可靠性,storm會在spout傳送tuples後立即進行確認.

topology.message.timeout.secs

topologyspout傳送訊息的最大處理超時時間.如果一條訊息在該時間視窗內未被成功ack,Storm會告知spout這條訊息失敗。而部分spout實現了失敗訊息重播功能。

topology.kryo.register

註冊到Kryo(Storm底層的序列化框架)的序列化方案列表.序列化方案可以是一個類名,或者是com.esotericsoftware.kryo.Serializer的實現.

topology.skip.missing.kryo.registrations

Storm是否應該跳過它不能識別的kryo序列化方案.如果設定為否task可能會裝載失敗或者在執行時丟擲錯誤.

topology.max.task.parallelism

在一個topology中能夠允許的最大元件並行度.該項配置主要用在本地模式中測試執行緒數限制.

topology.max.spout.pending

一個spout task中處於pending狀態的最大的tuples數量.該配置應用於單個task,而不是整個spoutstopology.

topology.state.synchronization.timeout.secs

元件同步狀態源的最大超時時間(保留選項,暫未使用)

topology.stats.sample.rate

用來產生task統計資訊的tuples抽樣百分比

topology.fall.back.on.java.serialization

topology中是否使用java的序列化方案

zmq.threads

每個worker程序內zeromq通訊用到的執行緒數

zmq.linger.millis

當連線關閉時,連結嘗試重新發送訊息到目標主機的持續時長.這是一個不常用的高階選項,基本上可以忽略.

java.library.path

JVM啟動(Nimbus,Supervisorworkers)時的java.library.path設定.該選項告訴JVM在哪些路徑下定位本地庫.


命令 釋出啟動任務     storm jar jar包名 包含main方法的類     storm jar jar包名 包含main方法的類  拓撲名 檢視任務     storm list 停止任務     storm kill 任務名稱