Apache Storm 官方文檔 —— 在生產環境中運行拓撲
在生產環境集群中運行拓撲的方式與本地模式非常相似,主要包括以下幾個步驟:
1) 定義拓撲(如果使用 Java 進行開發就可以使用 TopologyBuilder)
2) 使用 StormSubmitter 向集群提交拓撲。StormSubmitter
接收拓撲名稱、拓撲配置信息以及拓撲對象本身作為參數,如下所示:
Config conf = new Config(); conf.setNumWorkers(20); conf.setMaxSpoutPending(5000); StormSubmitter.submitTopology("mytopology", conf, topology);
3) 將你的拓撲程序以及相關依賴庫(除了 Storm 本身的依賴 —— 這些依賴已經添加到 Storm 的工作節點的 classpath 中了)打包為一個 jar 文件。
如果你使用 Maven 進行開發,可以使用 Maven Assembly Plugin 來打包,你需要做的僅僅是將下述插件配置添加到你的 pom.xml 中:
<plugin> <artifactId>maven-assembly-plugin</artifactId> <configuration> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> <archive> <manifest> <mainClass>com.path.to.main.Class</mainClass> </manifest> </archive> </configuration> </plugin>
然後就可以運行 mvn assembly:assembly
來打包。請確保你已經在 dependencies 中排除了 Storm 本身的 jar 包。
4) 使用 storm
客戶端向集群提交拓撲,在提交時需要指定好你的 jar 包的相關路徑、主函數所在類名稱以及其他一些需要的參數,下麵是一個提交拓撲的例子:
storm jar path/to/allmycode.jar org.me.MyTopology arg1 arg2 arg3
storm jar
會將 jar 提交到集群中,同時配置 StormSubmitter
類來與正確的集群建立連接。在上麵的例子裏,上傳 jar 包之後,storm jar
就會使用 “arg1”、“arg2”、“arg3” 三個參數來運行 org.me.MyTopology
的 main 函數。
關於如何配置 Storm 客戶端與 Storm 集群的交互的詳細信息,請參閱配置開發環境一文。
常用配置
拓撲中有很多參數可以設置。你可以在這裏找到完整的配置項列表。其中,以 “TOPOLOGY” 開頭的參數可以被拓撲中的對應配置項覆蓋(其他參數是集群的配置參數,不能被直接覆蓋)。以下是拓撲中的一些常用參數:
- Config.TOPOLOGY_WORKERS:此項設置了可以用於執行拓撲的 worker 進程數。例如,如果你將該參數值設置為 25,那麼在集群中就會有 25 個可以執行任務的 Java 進程。另外,如果你將拓撲的並行度設置成了 150,那麼每個 worker 進程就會執行 6 個任務線程。
- Config.TOPOLOGY_ACKERS:此項設置了用於跟蹤 spout 發送的 tuple 樹的 ack 任務數。Ackers 是 Storm 可靠性模型的重要組成部分,你可以在消息的可靠性保障一文中了解更多相信信息。
- Config.TOPOLOGY_MAX_SPOUT_PENDING:此項設置了單個 Spout 任務能夠掛起的最大的 tuple 數(tuple 掛起表示該 tuple 已經被發送但是尚未被 ack 或者 fail)。強烈建議設置此參數來防止消息隊列的爆發性增長。
- Config.TOPOLOGY_MESSAGE_TIMEOUT_SECS:此項設置了 ackers 跟蹤 tuple 的超時時間。默認值是 30 秒,對於大部分拓撲而言這個值基本上是不需要改動的。關於 Storm 的消息可靠性模型請參考消息的可靠性保障一文。
- Config.TOPOLOGY_SERIALIZATIONS:此項用於在 Storm 中注冊更多的序列化工具,這樣你就可以使用自定義的序列化類型來處理 tuple。
Kill 拓撲
執行以下命令來 kill 拓撲:
storm kill {topologyname}
其中 topologyname
就是你提交拓撲時使用的拓撲名稱。
不過,在執行該命令後 Storm 不會馬上 kill 掉該拓撲。Storm 會先停止所有 spouts 的活動,使得他們不能繼續發送 tuple,然後 Storm 會等待 Config.TOPOLOGY_MESSAGE_TIMEOUT_SECS
參數表示的一段時間,然後才會結束所有的 worker 進程。這可以保證拓撲在被 kill 之前可以有足夠的時間完成已有的 tuple 的處理。
更新運行中的拓撲
目前隻能通過先 kill 掉當前的拓撲再重新提交新拓撲的方式來更新運行中的拓撲。不過社區計劃在將來實現一個 storm swap
命令來將一個運行中的拓撲替換為一個新的拓撲,盡可能減少停機時間,同時確保不會有兩個拓撲同時處理 tuple 的情況發生。
監控拓撲
監控拓撲運行的最好方式是使用 Storm UI。Storm UI 可以顯示任務中的錯誤信息以及每個運行中拓撲中每個組件的吞吐量與端到端延時的性能信息。
當然,你也可以通過查看在工作節點機器上的日誌信息來了解拓撲運行情況。
最後更新:2017-05-22 14:02:26