本節內容:
- Apache Storm是什么
- Apache Storm核心概念
- Storm原理架構
- Storm集群安裝部署
- 啟動storm ui、Nimbus和Supervisor
一、Apache Storm是什么
Apache Storm是自由開源的分布式實時計算系統,擅長處理海量數據,適用於數據實時處理而非批處理。
批處理使用的大多是鼎鼎大名的hadoop或者hive,作為一個批處理系統,hadoop以其吞吐量大、自動容錯等優點,在海量數據處理上得到了廣泛的使用。但是,hadoop不擅長實時計算,因為它天然就是為批處理而生的,這也是業界一致的共識。否則最近幾年也不會有s4,storm,puma這些實時計算系統如雨后春筍般冒出來啦。
舉個搜索場景中的例子,當一個賣家發布了一條寶貝信息時,他希望的當然是這個寶貝馬上就可以被賣家搜索出來、點擊、購買啦,相反,如果這個寶貝要等到第二天或者更久才可以被搜出來,估計就會有不少損失了。 再舉一個推薦的例子,如果用戶昨天在淘寶上買了一雙襪子,今天想買一副泳鏡去游泳,但是卻發現系統在不遺余力地給他推薦襪子、鞋子,根本對他今天尋找泳鏡的行為視而不見,這樣商家的利益就有所損失。這是因為后台系統做的是每天一次的全量處理,而且大多是在夜深人靜之時做的,那么客戶今天白天做的事情要到明天才能反映出來。這也就是為什么需要實時處理的原因。
二、Apache Storm核心概念
- Nimbus:Storm集群主節點,負責資源分配和任務調度。我們提交任務和截止任務都是在Nimbus上操作的。一個Storm集群只有一個Nimbus節點。
- Supervisor:Storm集群工作節點,接受Nimbus分配任務,管理所有Worker。
- Worker:工作進程,每個工作進程中都有多個Task。
- Task:任務,每個Spout和Bolt都是一個任務,每個任務都是一個線程。
- Topology:計算拓撲,包含了應用程序的邏輯。
- Stream:消息流,關鍵抽象,是沒有邊界的Tuple序列。
- Spout:消息流的源頭,Topology的消息生產者。
- Bolt:消息處理單元,可以過濾、聚合、查詢數據庫。
- Stream grouping:消息分發策略,一共6種,定義每個Bolt接受何種輸入。
- Reliability:可靠性,Storm保證每個Tuple都會被處理。
三、Storm原理架構
1. Storm集群架構圖
Zookeeper集群在Storm集群中的作用:
Zookeeper集群負責Nimbus節點和Supervior節點之間的通信,監控各個節點之間的狀態。比如通常我們提交任務的時候是在Nimbus節點上執行的,Nimbus節點通過zk集群將任務分發下去,而Supervisor是真正執行任務的地方。Nimbus節點通過zk集群監控各個Supervisor節點的狀態,當某個Supervisor節點出現故障的時候,Nimbus節點就會通過zk集群將那個Supervisor節點上的任務重新分發,在其他Supervisor節點上執行。這就意味着Storm集群也是高可用集群,如果Nimbus節點出現故障的時候,整個任務並不會停止,但是任務的管理會出現影響,通常這種情況下我們只需要將Nimbus節點恢復就可以了。Nimbus節點不支持高可用,這也是Storm目前面臨的問題之一。不過一般情況下,Nimbus節點的壓力不大,通常不會出現問題。
一般情況下,Zookeeper集群的壓力並不大,一般只需要部署3台就夠了。Zookeeper集群在Storm集群中邏輯上是獨立的,但在實際部署的時候,一般會將zk節點部署在Nimbus節點或Supervisor節點上。
2. 數據處理流程圖
storm處理數據的特點:數據源源不斷,不斷處理。
3. 拓撲圖分析
storm中是沒有數據存儲結構的,我們需要自己設計數據落地接口,指明數據存儲到哪一部分中。Storm本身是不存儲數據的。
四、Storm集群安裝部署
1. 環境信息
主機名 | 操作系統版本 | IP地址 | 安裝軟件 |
log1 | CentOS 7.0 | 114.55.29.86 | JDK1.7、zookeeper-3.4.6、apache-storm-1.0.0 |
log1 | CentOS 7.0 | 114.55.29.241 | JDK1.7、zookeeper-3.4.6、apache-storm-1.0.0 |
log3 | CentOS 7.0 | 114.55.253.15 | JDK1.7、zookeeper-3.4.6、apache-storm-1.0.0 |
2. 安裝Zookeeper集群
參見之前的文章《Zookeeper介紹及安裝部署》。
3. 安裝Storm集群
log1、log2和log3部署storm集群,log1作為Nimbus節點,log2和log3作為surpervisor節點。
(1)下載安裝軟件並解壓
[root@log1 local]# wget http://apache.fayea.com/storm/apache-storm-1.0.0/apache-storm-1.0.0.tar.gz [root@log1 local]# tar zxf apache-storm-1.0.0.tar.gz
(2)配置storm
[root@log1 ~]# cd /usr/local/apache-storm-1.0.0/ [root@log1 apache-storm-1.0.0]# vim conf/storm.yaml
- 配置Zookeeper地址(配置Zookeeper的主機名,注意: 如果Zookeeper集群使用的不是默認端口,那么還需要配置storm.zookeeper.port)
- storm.local.dir: The Nimbus and Supervisor daemons require a directory on the local disk to store small amounts of state (like jars, confs, and things like that). 在配置文件里添加一行:
storm.local.dir: "/usr/local/apache-storm-1.0.0/status"
這個status目錄在storm啟動的時候會自動創建,當然也可以提前創建好。
- 配置nimbus.seeds:用於配置主控節點的地址,可以配置多個。
- 配置supervisor.slots.ports
supervisor.slots.ports: - 6700 - 6701 - 6702 - 6703
配置工作節點上的進程端口。你配置一個端口,意味着工作節點上啟動一個worker,在實際的生產環境中,我們需要根據實際的物理配置以及每個節點上的負載情況來配置這個端口的數量。在這里每個節點我象征性的配置4個端口。
注意:以上配置,凡是有冒號的地方,冒號后都要有個空格。
log2和log3主機也是同樣的配置。拷貝這台機器的storm包到log2和log3主機:
[root@log1 local]# scp -pr apache-storm-1.0.0 root@114.55.29.241:/usr/local/ [root@log1 local]# scp -pr apache-storm-1.0.0 root@114.55.253.15:/usr/local/
- 對於兩台supervisor node,我們額外開啟JMX支持,在配置文件中加入如下配置:
supervisor.childopts: -verbose:gc -XX:+PrintGCTimeStamps -XX:+PrintGCDetails -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.port=9998
9998就是用於通過JMX收集supervisior JVM指標的端口。
(3)配置storm環境變量
[root@log1 apache-storm-0.10.0]# vim /etc/profile export STORM_HOME=/usr/local/apache-storm-0.10.0 export PATH=$STORM_HOME/bin:$PATH [root@log1 apache-storm-0.10.0]# source /etc/profile
五、啟動storm ui、Nimbus和Supervisor
log1節點啟動nimbus和storm ui:
[root@log1 ~]# nohup storm ui >/dev/null 2>&1 & [root@log1 ~]# nohup storm nimbus >/dev/null 2>&1 &
log2和log3主機啟動Supervisor節點:
[root@log2 ~]# nohup storm supervisor >/dev/null 2>&1 & [root@log3 ~]# nohup storm supervisor >/dev/null 2>&1 &
訪問ui頁面: http://114.55.29.86:8080/
界面簡單介紹:
- Used slots:使用的worker數。
- Free slots:空閑的worker數。
- Executors:每個worker的物理線程數。