Storm學習筆記(4)- Storm架構及部署
文章目錄
Storm架構詳解
Storm架構
類似於Hadoop的架構,主從(Master/Slave)
Nimbus: 主
叢集的主節點,負責任務(task)的指派和分發、資源的分配
Supervisor: 從
可以啟動多個Worker,具體幾個呢?可以通過配置來指定(後面筆記整理)
一個Topo可以執行在多個Worker之上,也可以通過配置來指定
叢集的從節點,(負責幹活的),負責執行任務的具體部分
啟動和停止自己管理的Worker程序
無狀態,在他們上面的資訊(元資料)會儲存在ZK中
Worker: 執行具體元件邏輯(Spout/Bolt)的程序
task:
Spout和Bolt
Worker中每一個Spout和Bolt的執行緒稱為一個Task
executor: spout和bolt可能會共享一個執行緒
(並行度筆記會有對worker、task、executor的整理)
架構圖解
Storm單機部署
官方連結
http://storm.apache.org/releases/1.2.2/Setting-up-a-Storm-cluster.html
Storm部署的前置條件
jdk7+
python2.6.6+(python3.x也是可以的;但是有些測試用例是會出錯的)
Storm部署
下載
解壓到~/app
新增到系統環境變數:~/.bash_profile
export STORM_HOME=/home/hadoop/app/apache-storm-1.1.1 export PATH=$STORM_HOME/bin:$PATH 使其生效: source ~/.bash_profile
目錄結構
bin
examples
conf
lib
Storm啟動
$STORM_HOME/bin/storm 如何使用 執行storm就能看到很多詳細的命令 dev-zookeeper 啟動zk(storm自帶zk) storm dev-zookeeper -->前臺啟動 nohup sh storm dev-zookeeper & -->後臺啟動 jps : dev_zookeeper nimbus 啟動主節點 nohup sh storm nimbus & supervisor 啟動從節點 nohup sh storm supervisor & ui 啟動UI介面 nohup sh storm ui & //預設8080埠 logviewer 啟動日誌檢視服務 nohup sh storm logviewer &
storm的ui
supervisor 啟動後
注意事項
1) 為什麼是4個slot (預設)
2) 為什麼有2個Nimbus(1.X之後就解決了單點故障問題;所以會預設有兩個nimbus)
改寫Storm作業並提交到Storm單節點叢集執行
官方連結:
http://storm.apache.org/releases/1.2.2/Running-topologies-on-a-production-cluster.html
主要是main方法裡的
import org.apache.storm.Config;
import org.apache.storm.LocalCluster;
import org.apache.storm.StormSubmitter;
import org.apache.storm.generated.AlreadyAliveException;
import org.apache.storm.generated.AuthorizationException;
import org.apache.storm.generated.InvalidTopologyException;
import org.apache.storm.spout.SpoutOutputCollector;
import org.apache.storm.task.OutputCollector;
import org.apache.storm.task.TopologyContext;
import org.apache.storm.topology.OutputFieldsDeclarer;
import org.apache.storm.topology.TopologyBuilder;
import org.apache.storm.topology.base.BaseRichBolt;
import org.apache.storm.topology.base.BaseRichSpout;
import org.apache.storm.tuple.Fields;
import org.apache.storm.tuple.Tuple;
import org.apache.storm.tuple.Values;
import org.apache.storm.utils.Utils;
import java.util.Map;
/**
* 使用Storm實現積累求和的操作
*/
public class ClusterSumStormTopology {
***************************************************
**************main方法之前的程式碼和之前原生代碼一樣******
***************************************************
public static void main(String[] args) {
// TopologyBuilder根據Spout和Bolt來構建出Topology
// Storm中任何一個作業都是通過Topology的方式進行提交的
// Topology中需要指定Spout和Bolt的執行順序
TopologyBuilder builder = new TopologyBuilder();
builder.setSpout("DataSourceSpout", new DataSourceSpout());
builder.setBolt("SumBolt", new SumBolt()).shuffleGrouping("DataSourceSpout");
// 程式碼提交到Storm叢集上執行
String topoName = ClusterSumStormTopology.class.getSimpleName();
try {
StormSubmitter.submitTopology(topoName,new Config(), builder.createTopology());
} catch (Exception e) {
e.printStackTrace();
}
}
}
打包 mvn clean package -DskipTests
(如果按照官方打包;所有的包都會打進去;比較大)
將包放入伺服器中
執行
Storm如何執行我們自己開發的應用程式呢?
給出的官方連結有詳細講解
Syntax: storm jar topology-jar-path class args0 args1 args2
storm jar /home/hadoop/lib/storm-1.0.jar com.imooc.bigdata.ClusterSumStormTopology
問題: 3個executor,那麼頁面就看到spout1個和bolt1個,那麼還有一個去哪了?
Storm常用命令介紹
list
Syntax: storm list 或者在UI上檢視
List the running topologies and their statuses.
如何停止作業
kill
Syntax: storm kill topology-name [-w wait-time-secs]
也可以再ui中點選停止
如何停止叢集
hadoop: stop-all.sh
kill -9 pid,pid....
Storm叢集部署規劃
官方文件:
http://storm.apache.org/releases/1.2.2/Setting-up-a-Storm-cluster.html
Storm叢集的部署規劃
hadoop000 192.168.199.102
hadoop001 192.168.199.247
hadoop002 192.168.199.138
每臺機器的host對映:/etc/hosts
192.168.199.102 hadoop000
192.168.199.247 hadoop001
192.168.199.138 hadoop002
//zk配置一般是奇數的
hadoop000: zk nimbus supervisor
hadoop001: zk supervisor
hadoop002: zk supervisor
如果配置主備
hadoop000: zk nimbus supervisor
hadoop001: zk nimbus supervisor
hadoop002: zk supervisor
安裝包的分發: 從hadoop000機器做為出發點
scp xxxx [email protected]:~/software
scp xxxx [email protected]:~/software
jdk的安裝
解壓
配置到系統環境變數
驗證
ZK分散式環境的安裝//zoo.zfg
server.1=ctgexh01:2888:3888
server.2=ctgexh03:2888:3888
server.3=ctgexh04:2888:3888
hadoop000的dataDir目錄: 檔案myid的值1
hadoop001的dataDir目錄: 檔案myid的值2
hadoop002的dataDir目錄: 檔案myid的值3
在每個節點上啟動zk: zkServer.sh start
在每個節點上檢視當前機器zk的狀態: zkServer.sh status
Storm叢集
$STORM_HOME/conf/storm.yaml [storm-env.sh下的jdk環境變數也需要配置一下]
storm.zookeeper.servers:
- "hadoop000"
- "hadoop001"
- "hadoop002"
storm.local.dir: "/home/hadoop/app/tmp/storm" //注意冒號後要有空格
supervisor.slots.ports:
- 6700
- 6701
- 6702
- 6703
啟動
hadoop000: nimbus supervisor(ui,logviewer)
hadoop001: supervisor(logviewer)
hadoop002: supervisor(logviewer)
nimbus 啟動主節點 在bin目錄下
nohup sh storm nimbus &
supervisor 啟動從節點
nohup sh storm supervisor &
ui 啟動UI介面
nohup sh storm ui &
logviewer 啟動日誌檢視服務
nohup sh storm logviewer &
啟動完所有的程序之後,檢視
[[email protected] bin]$ jps
7424 QuorumPeerMain
8164 Supervisor
7769 nimbus
8380 logviewer
7949 core
[[email protected] bin]$ jps
3142 logviewer
2760 QuorumPeerMain
2971 Supervisor
[[email protected] bin]$ jps
3106 logviewer
2925 Supervisor
2719 QuorumPeerMain
執行作業後;進入storm.local.dir目錄輸入命令tree就可以看到執行作業的目錄結構
storm jar /home/hadoop/lib/storm-1.0.jar com.imooc.bigdata.ClusterSumStormTopology
目錄樹
storm.local.dir
nimbus/inbox:stormjar-....jar //正在執行的Topology資訊
supervisor/stormdist
ClusterSumStormTopology-1-1511599690
│ │ ├── stormcode.ser //序列化的 程式碼的
│ │ ├── stormconf.ser //配置檔案的
│ │ └── stormjar.jar //jar包的