一、Apache Storm
Storm是一個分布式的,可靠的,容錯的數據流處理系統。Storm集群的輸入流由一個被稱作spout的組件管理,spout把數據傳遞給bolt,bolt要么把數據保存到某種存儲器,要么把數據傳遞給其它的bolt。一個Storm集群就是在一連串的bolt之間轉換spout傳過來的數據。
1、Storm組件
在Storm集群中、有兩類節點:主節點master node和工作節點worker nodes。主節點運行Nimbus守護進程,這個守護進程負責在集群中分發代碼,為工作節點分配任務,并監控故障。Supervisor守護進程作為拓撲的一部分運行在工作節點上。一個Storm拓撲結構在不同的機器上運行著眾多的工作節點。每個工作節點都是topology中一個子集的實現。而Nimbus和Supervisor之間的協調則通過Zookeeper系統或者集群。
2、Zookeeper
Zookeeper是完成Supervisor和Nimbus之間協調的服務。而應用程序實現實時的邏輯則被封裝進Storm中的“topology”。topology則是一組由Spouts(數據源)和Bolts(數據操作)通過Stream Groupings進行連接的圖。
3、Spout
Spout從來源處讀取數據并放入topology。Spout分成可靠和不可靠兩種;當Storm接收失敗時,可靠的Spout會對tuple(元組,數據項組成的列表)進行重發;而不可靠的Spout不會考慮接收成功與否只發射一次。而Spout中最主要的方法就是nextTuple(),該方法會發射一個新的tuple到topology,如果沒有新tuple發射則會簡單的返回。
4、Bolt
Topology中所有的處理都由Bolt完成。Bolt從Spout中接收數據并進行處理,如果遇到復雜流的處理也可能將tuple發送給另一個Bolt進行處理。而Bolt中最重要的方法是execute(),以新的tuple作為參數接收。不管是Spout還是Bolt,如果將tuple發射成多個流,這些流都可以通過declareStream()來聲明。
5、Stream Groupings
Stream Grouping定義了一個流在Bolt任務中如何被切分。Shuffle grouping:隨機分發tuple到Bolt的任務,保證每個任務獲得相等數量的tuple。
Fields grouping:根據指定字段分割數據流,并分組。例如,根據“user-id”字段,相同“user-id”的元組總是分發到同一個任務,不同“user-id”的元組可能分發到不同的任務。
Partial Key grouping:根據指定字段分割數據流,并分組。類似Fields grouping。
All grouping:tuple被復制到bolt的所有任務。這種類型需要謹慎使用。
Global grouping:全部流都分配到bolt的同一個任務。明確地說,是分配給ID最小的那個task。
None grouping:無需關心流是如何分組。目前,無分組等效于隨機分組。但最終,Storm將把無分組的Bolts放到Bolts或Spouts訂閱它們的同一線程去執行(如果可能)。
Direct grouping:這是一個特別的分組類型。元組生產者決定tuple由哪個元組處理者任務接收。
Local or shuffle grouping:如果目標bolt有一個或多個任務在同一工作進程,tuples 會打亂這些進程內的任務。否則,這就像一個正常的 Shuffle grouping。
二、Apache-strom 必須要求Python 2.6以上
1、升級 Python 官方下載地址:
https://www.python.org/ftp/python/
wget http://www.python.org/ftp/python/2.7.6/Python-2.7.6.tgz
wget https://www.python.org/ftp/python/3.6.0/Python-3.6.0.tgz
# tar -xf Python-3.6.0.tgz
# mv Python-3.6.0 /usr/local/python
# cd /usr/local/python
# ./configure --prefix=/usr/local/python
# make
# make install
# mv /usr/bin/python /usr/bin/python_old
# ln -s /usr/local/python/bin/python3.6 /usr/bin/python
# python -V
2、如發現yum 異常則, 編輯 /usr/bin/yum 文件
將文件頭部的
#!/usr/bin/python
改為以下:(因為系統默認是2.6)
#!/usr/bin/python2.6
三、storm 安集群配置;(具體根據線上環境資源進行設置)
系統:Centos6.7
內核:2.6.32-573.el6.x86_64
安裝目錄:/opt/storm
數據日志目錄:/opt/storm/{data,logs}
用戶組權限:deploy
機器hostname需要在hosts里面配置關系映射:
zoo1 - 10.207.101.101
zoo2 - 10.207.101.102
zoo3 - 10.207.101.103
四、集群說明
主節點(nimbus)
zks1
任務節點(supervisor)
zks2 zks3 等
注:storm主節點、任務節點安裝配置完全一致。
1、下載安裝配置:官方下載地址:
http://mirrors.hust.edu.cn/apache/storm/ http://www-eu.apache.org/dist/storm/apache-storm-1.0.3/apache-storm-1.0.3.tar.gz http://mirrors.hust.edu.cn/apache/storm/apache-storm-1.0.2/apache-storm-1.0.2.tar.gz # tar -xf apache-storm-1.0.2.tar.gz # cd apache-storm# cat apache-storm-0.9.6/conf/storm.yaml |grep -v ^# |grep -v ^$storm.zookeeper.servers: - "10.207.101.101" - "10.207.101.102" - "10.207.101.103" nimbus.host: "10.207.101.101" storm.zookeeper.port: 2181 ui.port: 8090 storm.local.dir: "/opt/apache-storm-0.9.6/data" supervisor.slots.ports: - 6700 - 6701 - 6702 - 6703 - 6704 worker.childopts: "-Xmx2g"# worker.heap.memory.mb: 2048 /** 調整分配給每個 worker 的內存,關于內存的調節,上文已有描述 */logviewer.port: 18090 topology.max.spout.pending: 1000 topology.message.timeout.secs: 300 storm.messaging.netty.server_worker_threads: 10
2、主節點啟動測驗:
啟動nimbus
# nohup ./bin/storm nimbus >/dev/null 2>&1 &
啟動 UI
# nohup ./bin/storm ui >/dev/null 2>&1 &
3、任務節點啟動腳步
# cat supervisor_logviewer.shnohup ./bin/storm supervisor >/dev/null 2>&1 &
nohup ./bin/storm logviewer >/dev/null 2>&1 &
4、進程檢測
# ps -ef|grep storm
# netstat -ano |grep 8090
wKioL1j7QCmz-bBgAAEEFLYWMiA134.jpg-wh_50