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 執行正常問題解決