準備開始學習storm。storm是最有名的實時流處理,spark雖然也有spark streaming,出來得比較晚,要趟的坑比storm要多,首選還是storm。
storm是核心是Clojure編寫的,號稱可以支持任何一種語言來編寫拓撲。
由于只會玩python,所以還是得從python中選擇對應的庫文件。
Python目前有兩個庫,一個是pyleus,一個是streamparse。前者在github上已經有兩年都不更新了,只支持到storm 0.9。后者一直在更新,所以對于最新的strom 1.1.0, 沒有多的選項了。
storm本地偽集群我采用了官網配置
storm.zookeeper.servers:
- "127.0.0.1"
nimbus.seeds: ["127.0.0.1"]
ui.port: 9090
nimbus.host: "localhost"
supervisor.slots.ports:
- 6700
- 6701
- 6702
- 6703
由于ui默認的8080端口被我用來搞polipo了,這里設置網頁端口為9090.
然后按如下順序啟動storm即可:
cd /xxx/yyy/apache-storm-1.1.0/bin
./storm nimbus &
./storm supervisor &
./storm ui &
打開localhost:9090,如果沒啥問題,就能看到storm的管理頁面。
然后開始安裝streamparse,因為我使用了虛擬環境,所以無需sudo:
pip install streamparse
然后開始跑demo:
sparse quickstart wordcount
cd wordcount
sparse run
結果直接跳錯,告訴我缺少lein,搞得我一臉懵逼。google了一下,才知道這是Clojure的包管理工具。于是直接去lein官網
lein的安裝有兩種方式,一種是用腳本下載安裝,一種是要加PPA。原本lein也提供apt直接的安裝了,結果各種歷史原因,所以呵呵了。。。
作為懶人,首選腳本下載。結果速度奇慢無比。。??粗惭b進度需要一天,我果斷放棄。。。
只能選擇PPA添加apt安裝了:
sudo add-apt-repository ppa:mikegedelman/leiningen-git-stable
sudo apt-get update
sudo apt-get install lein
完成后繼續跑sparse run命令。。結果還是不行,去stackoverflow翻了一通后發現,需要配置config.json。但是streamparse的demo里沒提,說創建完項目直接就能跑,我頓時感覺有點坑啊。。。
配置config.json如下:
{
"serializer": "json",
"topology_specs": "topologies/",
"virtualenv_specs": "virtualenvs/",
"envs": {
"prod": {
"user": "user_xxx",
"ssh_password": "password",
"nimbus": "localhost",
"workers": ["localhost"],
"log": {
"path": "",
"max_bytes": 1000000,
"backup_count": 10,
"level": "info"
},
"virtualenv_root": "/path_xx/virtualenvs"
}
}
}
然后試著運行:
sparse run
然后立刻被打臉,說ssh user_xxx@localhost要輸入密碼,如果sshd_config如果沒配置,即便輸入正確的密碼也會失敗。這里可以參考我之前寫的如何ssh本地主機
配置完免密碼登錄后,連密碼一欄都不用搞了,再次運行。
機器會花一定時間來編譯JAR文件,然后就能看到實時流的輸出了。
但是這只是試運行,如果要發布拓撲到storm集群上,則要運行:
sparse submit
結果又跳了一個錯,說pip版本太低。。。
streamparse會在節點上構建python的虛擬環境, 然后在節點上安裝好所有需要的python庫??茨_本執行的順序,會在生成虛擬環境后自動升級pip。但是不知道為何沒有執行成功。所以我只能手動去對應的路徑里升級pip:
cd /path_xx/virtualenvs/wordcount/bin
source activate
pip install --upgrade pip
deactivate
最后再次運行:
sparse submit
沒有報錯就表示已經提交拓撲到storm上了,打開ui地址,可以看到拓撲一欄里已經顯示有wordcount的拓撲在運行。