1. 程式人生 > >storm學習(一):搭建storm單機除錯環境

storm學習(一):搭建storm單機除錯環境

最近工作需要,學習storm的使用。

這裡做一下單機環境的搭建備忘:

官方文件說明:

storm有兩種操作模式:本地單機模式和遠端模式。 本地模式可以用來開發以及測試topologies使用,本地模式模擬叢集環境在本地的一個程序中。遠端模式是將自己的topologies程式打包後提交到遠端的叢集環境中執行。

下面說一下本地單機模式環境的搭建:

單機模式主要是在程式碼中加入:

import backtype.storm.LocalCluster;

LocalCluster cluster = new LocalCluster();
用LocalCluster來模擬叢集環境,所以單機環境的開發環境其實只需要講storm的jar包放在classpath就可以了。

這裡建議使用maven來管理依賴的jar包,pom.xml的例子,可以點選這裡

官方給出了一個storm-starter 例子。大家下載之後可以把專案匯入到eclipse裡匯入之前把專案中的m2-pom.xml改成pom.xml,這樣就可以被eclipse匯入。

如果在eclipse裡只要可以執行storm.starter.WordCountTopology 可以看到程式執行的效果。也可以使用maven來執行專案,執行如下命令:

$ mvn -f m2-pom.xml compile exec:java -Dexec.classpathScope=compile -Dexec.mainClass=storm.starter.WordCountTopology

這裡我在實際操作過程中遇到兩個問題說明一下,

第一,storm-starter依賴的jar包找不到。 報 twitter4j-stream,twitter4j-core 這兩個jar找不到,原因是資源庫被牆獲取不到,一個可以使用代理翻牆。另外可以修改版本設定有些版本的jar可以獲取也不影響使用。修改pom.xml

<dependency>
<groupId>org.twitter4j</groupId>
<artifactId>twitter4j-core</artifactId>
<version>[2.2,)</version>
</dependency>
<dependency>
<groupId>org.twitter4j</groupId>
<artifactId>twitter4j-stream</artifactId>
<version>[2.2,)</version>
</dependency>

第二,是在執行的時候報錯,錯誤提示某段python程式碼出錯。 這個和我的本機環境有關,我本機安裝了Python2.7 python3.3兩個版本而這個程式碼報錯的原因是使用了python3來執行python指令碼。 我用ln -s修改了 python的預設連結指向python2.7再執行可以順利執行。(這個例子裡面為什麼使用了python。由於剛剛接觸還沒有讀程式碼也不太清楚)。

執行的截圖如下:



最後再說一下本地安裝storm。這個也算作開發環境一部分。使用場景是在本地上傳jar包到叢集環境下執行。

首先下載最新版本storm。解壓到本地任何目錄,解壓後將storm目錄裡面bin 目錄設定在環境變數path中。保證storm下bin/storm是可以執行的。

之後就可以使用storm命令進行jar包釋出。不過需要修改storm的客戶端配置。

在storm目錄下conf/storm.yaml檔案,設定nimbus.host: 為storm叢集中nimbus所在的伺服器ip地址 冒號後面注意要有空格。

這裡在實際操作的過程中遇到幾個問題:

1.storm修改配置之後沒有生效,原因是storm指令碼的問題。

CONF_DIR = os.path.expanduser("~/.storm")  這個說明storm配置檔案設定在使用者目錄下的.storm資料夾中。

解決辦法一個是把配置檔案放在~/.storm目錄中。另外一個方法是修改這段程式碼路徑到配置檔案所在的目錄。之後儲存推出問題解決。

2.執行storm list的時候報錯

Exception in thread "main" java.lang.RuntimeException: org.apache.thrift7.protocol.TProtocolException: Required field 'supervisor_id' is unset! Struct:SupervisorSummary(host:hslave1, uptime_secs:531, num_workers:8, num_used_workers:0, supervisor_id:null)
at storm.starter.ReachTopology.main(ReachTopology.java:194)
Caused by: org.apache.thrift7.protocol.TProtocolException: Required field 'supervisor_id' is unset! Struct:SupervisorSummary(host:hslave1, uptime_secs:531, num_workers:8, num_used_workers:0, supervisor_id:null)
at backtype.storm.generated.SupervisorSummary.validate(SupervisorSummary.java:682)
at backtype.storm.generated.SupervisorSummary.read(SupervisorSummary.java:597)
at backtype.storm.generated.ClusterSummary.read(ClusterSummary.java:456)
at backtype.storm.generated.Nimbus$getClusterInfo_result.read(Nimbus.java:10648)
at org.apache.thrift7.TServiceClient.receiveBase(TServiceClient.java:78)
at backtype.storm.generated.Nimbus$Client.recv_getClusterInfo(Nimbus.java:451)
at backtype.storm.generated.Nimbus$Client.getClusterInfo(Nimbus.java:439)
at storm.starter.ReachTopology.main(ReachTopology.java:184)

原因是伺服器用的storm版本與客戶端使用的storm版本不一致,統一storm版本後問題解決

3.用storm jar執行storm-starter專案時發現還是在本地執行

執行的命令如下:

storm jar storm-starter-0.0.1-SNAPSHOT-jar-with-dependencies.jar storm.starter.WordCountTopology 

結果執行顯示在本地執行

因為配置檔案已經修改,排除配置檔案的問題。

最後檢視WordCountTopology的程式碼發現

    if (args != null && args.length > 0) {
      conf.setNumWorkers(3);

      StormSubmitter.submitTopology(args[0], conf, builder.createTopology());
    }
    else {
      conf.setMaxTaskParallelism(3);

      LocalCluster cluster = new LocalCluster();
      cluster.submitTopology("word-count", conf, builder.createTopology());

      Thread.sleep(10000);

      cluster.shutdown();
    }

原來執行的時候需要後面加上引數否則就是在本地環境下執行

執行命令:

storm jar storm-starter-0.0.1-SNAPSHOT-jar-with-dependencies.jar storm.starter.WordCountTopology wordCountTopology 執行正常問題解決