1. 程式人生 > >Storm學習筆記(4)- Storm架構及部署

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包的