ApacheStorm官方文件——在生產環境中執行拓撲

青衫無名發表於2017-05-22

在生產環境叢集中執行拓撲的方式與本地模式非常相似,主要包括以下幾個步驟:

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” 開頭的引數可以被拓撲中的對應配置項覆蓋(其他引數是叢集的配置引數,不能被直接覆蓋)。以下是拓撲中的一些常用引數:

  1. Config.TOPOLOGY_WORKERS:此項設定了可以用於執行拓撲的 worker 程式數。例如,如果你將該引數值設定為 25,那麼在叢集中就會有 25 個可以執行任務的 Java 程式。另外,如果你將拓撲的並行度設定成了 150,那麼每個 worker 程式就會執行 6 個任務執行緒。
  2. Config.TOPOLOGY_ACKERS:此項設定了用於跟蹤 spout 傳送的 tuple 樹的 ack 任務數。Ackers 是 Storm 可靠性模型的重要組成部分,你可以在訊息的可靠性保障一文中瞭解更多相信資訊。
  3. Config.TOPOLOGY_MAX_SPOUT_PENDING:此項設定了單個 Spout 任務能夠掛起的最大的 tuple 數(tuple 掛起表示該 tuple 已經被髮送但是尚未被 ack 或者 fail)。強烈建議設定此引數來防止訊息佇列的爆發性增長。
  4. Config.TOPOLOGY_MESSAGE_TIMEOUT_SECS:此項設定了 ackers 跟蹤 tuple 的超時時間。預設值是 30 秒,對於大部分拓撲而言這個值基本上是不需要改動的。關於 Storm 的訊息可靠性模型請參考訊息的可靠性保障一文。
  5. 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 可以顯示任務中的錯誤資訊以及每個執行中拓撲中每個元件的吞吐量與端到端延時的效能資訊。

當然,你也可以通過檢視在工作節點機器上的日誌資訊來了解拓撲執行情況。


相關文章