原文地址:http://woodding2008.iteye.com/blog/2326677
簡介
storm1.0版本的重要功能都在1.0.0版本中發(fā)布势腮,1.0.1版本中以fixed bug為主,調(diào)研使用1.0.1版本.
storm1.0.0 :http://storm.apache.org/2016/04/12/storm100-released.html
Pacemaker
默認(rèn)情況下使用zookeeper來存儲(chǔ)心跳信息陆错,需要修改配置箩兽。
storm.cluster.state.store "org.apache.storm.pacemaker.pacemaker_state_factory"
參考資料: https://storm.apache.org/releases/1.0.1/Pacemaker.html
官方性能指標(biāo)
1、max 270 supervisor
2、2000-3000 nodes (max:6000nodes)
3棒呛、70% CPU、1G RAM (4core域携、24GRAM)
容錯(cuò)
1簇秒、pacemaker 掛掉:worker繼續(xù)運(yùn)行
2、網(wǎng)絡(luò)分區(qū)(腦裂):與nimbus+pacemaker在同一側(cè)的worker繼續(xù)運(yùn)行秀鞭,另一側(cè)重新分配趋观。
測試Case
1扛禽、直接關(guān)閉Pacemaker,180分鐘后重新啟動(dòng)pacemaker
結(jié)果:任務(wù)繼續(xù)運(yùn)行拆内,期間沒有發(fā)生飄移旋圆,一直嘗試重試。
現(xiàn)場分析:
Nimbus與Worker一直嘗試連接pacemaker麸恍。
重試策略采用:PacemakerClient.StormBoundedExponentialBackoffRetry【有限指數(shù)退避重試策略】
2、將其中一臺(tái)機(jī)器的網(wǎng)卡數(shù)據(jù)攔截(腦裂)搀矫,持續(xù)5-10分鐘
HA Nimbus
HA 機(jī)制
1抹沪、Leader選舉:通過curator提供的分布式鎖來實(shí)現(xiàn),誰獲取鎖誰是Leader瓤球。com.netflix.curator.framework.recipes.locks.InterProcessMutex
2融欧、Topology codes:異步線程(Timer)檢測本地不存在的任務(wù)代碼,通過RPC向當(dāng)前Leader下載任務(wù)代碼卦羡。
3噪馏、Nimbus Leader:StormSubmitter,Supervisor,Non-leader Nimbus and Storm UI 角色通過zookeeper獲取Nimbus Leader地址。
參考資料: https://github.com/apache/storm/pull/61
測試Case
1绿饵、直接停掉Nimbus Leader
結(jié)果:正在運(yùn)行的任務(wù)沒有飄移情況欠肾。
2、啟動(dòng)任務(wù)后拟赊,立刻停掉Nimbus Leader
結(jié)果:任務(wù)啟動(dòng)失敗
3刺桃、storm kill 任務(wù)后,立刻停掉Nimbus Leader
結(jié)果:任務(wù)關(guān)閉失敗吸祟,任務(wù)一直處于KILLED狀態(tài)【僵尸任務(wù)瑟慈,不執(zhí)行】。
重啟全部nimbus任務(wù)停止屋匕。
4葛碧、storm kill 任務(wù)后,過30秒[延遲任務(wù)關(guān)閉時(shí)間过吻,可以配置进泼,建議保持30],立刻停掉Nimbus Leader
結(jié)果:任務(wù)關(guān)閉成功疮装。
5缘琅、關(guān)閉worker所在機(jī)器的supervisor進(jìn)程(默認(rèn)3秒檢測一次worker進(jìn)程)--> Kill -9 $workerPid ---> 關(guān)閉Nimbus Leader --->worker沒有重新啟動(dòng)/飄走-->1分鐘后啟動(dòng)supervisor --->worker飄移走
結(jié)果:worker成功飄移。
Automatic Backpressure
反壓機(jī)制
1廓推、worker executor的接收隊(duì)列大于高水位刷袍,通知反壓線程
2、worker反壓線程通知zookeeper樊展,executor繁忙事件
3呻纹、所有worker監(jiān)聽zookeeper executor繁忙的事件
4堆生、worker spouts降低發(fā)送tuple速度
參考資料: https://github.com/apache/storm/pull/700
https://issues.apache.org/jira/browse/STORM-886
測試Case
1、基數(shù)分鐘雷酪,前8秒淑仆,bolt處理消息邏輯sleep(1ms), spout一直全力發(fā)送數(shù)據(jù)。
backpressure.disruptor.high.watermark 0.9
backpressure.disruptor.low.watermark 0.4
topology.max.spout.pending null
結(jié)果:觸發(fā)高水位哥力,執(zhí)行反壓蔗怠,經(jīng)過幾次反壓,任務(wù)永久組塞吩跋,可以確認(rèn)[bolt消息處理量==spout消息發(fā)送量]
2寞射、bolt的TickTuple TOPOLOGY_TICK_TUPLE_FREQ_SECS設(shè)置為10秒,bolt處理邏輯為Utils.sleep(100ms)锌钮,spout一直全力發(fā)送數(shù)據(jù)桥温。
backpressure.disruptor.high.watermark 0.9
backpressure.disruptor.low.watermark 0.4
topology.max.spout.pending 1000
結(jié)果:觸發(fā)高水位,執(zhí)行反壓梁丘,反復(fù)執(zhí)行反壓侵浸,任務(wù)正常。
Native Streaming Window API
storm 1.0.X支持在窗口里處理一組tuple,窗口需要給定兩個(gè)參數(shù):窗口長度和滑動(dòng)間隔氛谜。窗口計(jì)算的典型例子是可用于計(jì)算過去一小時(shí)最熱門的Twitter話題
storm提供兩種類型的窗口:
Sliding Window:一組Tuple被包含在一個(gè)窗口里掏觉,隨著滑動(dòng)間隔窗口不斷滑動(dòng)。一個(gè)tuple可能屬于多個(gè)窗口混蔼。
Tumbling Window:一組Tuple被包含在單獨(dú)一個(gè)基于時(shí)間或Tuple個(gè)數(shù)的窗口里履腋,任意一個(gè)Tuple僅屬于一個(gè)窗口。
用戶使用窗口計(jì)算時(shí)需要繼承BaseWindowedBolt類惭嚣。
測試case
滑動(dòng)窗口main方法
滑動(dòng)窗口slide類
滑動(dòng)窗口
Dynamic Log Levels
Storm 1.0允許用戶和管理員通過Storm UI和命令行來更改運(yùn)行中的Topology的日志級(jí)別的設(shè)置遵湖。用戶可以指定一個(gè)可選的超時(shí)時(shí)間,超時(shí)時(shí)間過后晚吞,這些更改將被自動(dòng)恢復(fù)延旧。生成的日志文件也可以通過Storm UI和logviewer服務(wù)很容易的被搜索到。
測試Case
1.配置/Storm_home/log4j2/worker.xml槽地,用戶可以自定義Logger迁沫,
<RollingFile name="CUSTOM" immediateFlush="false"
fileName="${sys:storm.log.dir}/custom.log"
filePattern="${sys:storm.log.dir}/custom.log.%i.gz">
<PatternLayout>
<pattern>${pattern}</pattern>
</PatternLayout>
</RollingFile>
<Logger name="custom" level="warn" additivity="false"> /*自定義一個(gè)名為“custom”、warn級(jí)別的Logger捌蚊,輸出日志到custom.log文件中*/
<AppenderRef ref="CUSTOM"/>
</Logger>
2.Topology業(yè)務(wù)類中測試代碼如下:
Logger logger=LoggerFactory.getLogger("custom");
logger.trace("trace........");
logger.debug("debug........");
logger.info("info..........");
logger.warn("warn..........");
logger.error("error........");
3.在Topology UI界面進(jìn)行操作
這里對Log Level作如下說明:
Level
描述
ALL
各級(jí)包括自定義級(jí)別
TRACE
指定細(xì)粒度比DEBUG更低的信息事件
DEBUG
指定細(xì)粒度信息事件是最有用的應(yīng)用程序調(diào)試
INFO
指定能夠突出在粗粒度級(jí)別的應(yīng)用程序運(yùn)行情況的信息的消息
WARN
指定具有潛在危害的情況
ERROR
錯(cuò)誤事件可能仍然允許應(yīng)用程序繼續(xù)運(yùn)行
FATAL
指定非常嚴(yán)重的錯(cuò)誤事件集畅,這可能導(dǎo)致應(yīng)用程序中止
OFF
這是最高等級(jí),為了關(guān)閉日志記錄
它們的級(jí)別關(guān)系是All<Trace<Debug<Info<Warn<Error<Fatal<Off缅糟。
4.測試結(jié)果分析
事例中未使用動(dòng)態(tài)Level時(shí)挺智,custom.log中只打印出warn級(jí)別以上的信息,設(shè)置Level為info窗宦、Timeout為60時(shí)赦颇,打印出info二鳄、warn、error級(jí)別的信息媒怯,60秒后回歸到原始級(jí)別狀態(tài)订讼。
UI界面上的“clear”按鈕則用于清除這個(gè)Logger,不再打印日志信息扇苞。
Tuple Sampling and Debugging
在調(diào)試Topology的過程中欺殿,很多Strom用戶添加了“debug”Bolt或者Trident功能,以記錄流經(jīng)Topology的數(shù)據(jù)信息鳖敷,在生產(chǎn)部署的時(shí)候移除或者禁用它們祈餐。如今Storm UI包含這一功能,可以使你直接通過Storm UI對流經(jīng)Topology或者單個(gè)組件的數(shù)據(jù)進(jìn)行取樣哄陶。被取樣的事件可以通過Storm UI直接觀察到,并被保存到磁盤哺壶。
使用說明
1.由于輕微的性能消耗屋吨,Storm默認(rèn)沒有開啟這項(xiàng)功能,可以在cronf/storm.yaml中進(jìn)行參數(shù)配置山宾。
Parameter
Meaning
When to use
topology.eventlogger.executors: 0
No event logger tasks are created (default).
|If you don’t intend to inspect tuples and don’t want the slight performance hit.
topology.eventlogger.executors: 1
One event logger task for the topology.
If you want to sample a low percentage of tuples from a specific spout or a bolt. This could be the most common use case.
topology.eventlogger.executors: nil
One event logger task per worker.
If you want to sample entire topology (all spouts and bolt) at a very high sampling percentage and the tuple rate is very high.
Distributed Log Search
這是一個(gè)分布式日志搜索功能至扰,用戶通過Storm UI界面可以在指定Topology的所有日志文件中進(jìn)行搜索,包括存檔日志资锰。搜索結(jié)果包含來自所有Supervisor節(jié)點(diǎn)的匹配敢课。
在Storm UI首頁點(diǎn)擊指定的Topology Name后,在頁面上方搜索框中輸入關(guān)鍵詞搜索即可绷杜≈备眩或者點(diǎn)擊首頁右上角的搜索圖標(biāo),輸入Topology ID和關(guān)鍵詞后即可搜索鞭盟。
Dynamic Worker Profiling
Storm 1.0最后一個(gè)改進(jìn)是動(dòng)態(tài)worker剖析圾结。這個(gè)新功能可以讓用戶直接從Storm UI獲取worker剖析數(shù)據(jù),包括:
Heap Dumps
JStack Output
JProfile Recordings
生成的文件齿诉,可以下載筝野,使用各種調(diào)試工具離線分析,storm1.0.x可以通過Storm UI重啟worker。