storm
一、概述
離線計算
批量獲取數據、批量傳輸數據、週期性批量計算數據、數據展示
代表技術
Sqoop批量導入數據、HDFS批量存儲數據、MapReduce批量計算數據、Hive批量計算數據
流式計算
數據實時產生、數據實時傳輸、數據實時計算、實時展示
代表技術
Flume實時獲取數據、Kafka實時數據存儲、Storm/JStorm實時數據計算、Redis實時結果緩存、持久化存儲(mysql)
storm
Storm是一個分佈式計算框架,主要使用Clojure與Java語言編寫
Storm是一個免費開源的分佈式實時計算系統。Storm能輕鬆可靠地處理無界的數據流,就像Hadoop對數據進行批處理
Storm能用到很多場景中,包括:實時分析、在線機器學習、連續計算等
1)推薦系統:實時推薦,根據下單或加入購物車推薦相關商品
2)金融系統:實時分析股票信息數據
3)預警系統:根據實時採集數據,判斷是否到了預警閾值
4)網站統計:實時銷量、流量統計,如淘寶雙11效果圖
二、編程模型
1、元組(Tuple)
元組(Tuple),是消息傳遞的基本單元,是一個命名的值列表,元組中的字段可以是任何類型的對象。Storm使用元組作爲其數據模型,元組支持所有的基本類型、字符串和字節數組作爲字段值,只要實現類型的序列化接口就可以使用該類型的對象。元組本來應該是一個key-value的Map,但是由於各個組件間傳遞的元組的字段名稱已經事先定義好,所以只要按序把元組填入各個value即可,所以元組是一個value的List
2、流(Stream)
流是Storm的核心抽象,是一個無界的元組系列。源源不斷傳遞的元組就組成了流,在分佈式環境中並行地進行創建和處理
3、水龍頭(Spout)
Spout是拓撲的流的來源,是一個拓撲中產生源數據流的組件。通常情況下,Spout會從外部數據源中讀取數據,然後轉換爲拓撲內部的源數據。
Spout可以是可靠的,也可以是不可靠的。如果Storm處理元組失敗,可靠的Spout能夠重新發射,而不可靠的Spout就儘快忘記發出的元組。
Spout可以發出超過一個流。
Spout的主要方法是nextTuple()。NextTuple()會發出一個新的Tuple到拓撲,如果沒有新的元組發出,則簡單返回。
Spout的其他方法是ack()和fail()。當Storm檢測到一個元組從Spout發出時,ack()和fail()會被調用,要麼成功完成通過拓撲,要麼未能完成。Ack()和fail()僅被可靠的Spout調用。
IRichSpout是Spout必須實現的接口
4、轉接頭(Bolt)
在拓撲中所有處理都在Bolt中完成,Bolt是流的處理節點,從一個拓撲接收數據,然後執行進行處理的組件。Bolt可以完成過濾、業務處理、連接運算、連接與訪問數據庫等任何操作。
Bolt是一個被動的角色,七接口中有一個execute()方法,在接收到消息後會調用此方法,用戶可以在其中執行自己希望的操作。
Bolt可以完成簡單的流的轉換,而完成複雜的流的轉換通常需要多個步驟,因此需要多個Bolt。
Bolt可以發出超過一個的流
5、拓撲(Topology)
拓撲(Topology)是Storm中運行的一個實時應用程序,因爲各個組件間的消息流動而形成邏輯上的拓撲結構。
把實時應用程序的運行邏輯打成jar包後提交到Storm的拓撲(Topology)。Storm的拓撲類似於MapReduce的作業(Job)。其主要的區別是,MapReduce的作業最終會完成,而一個拓撲永遠都在運行直到它被殺死。一個拓撲是一個圖的Spout和Bolt的連接流分組
三、核心組件
nimbus是整個集羣的控管核心,負責topology的提交、運行狀態監控、任務重新分配等工作。
zk就是一個管理者,監控者。
總體描述:nimbus下命令(分配任務),zk監督執行(心跳監控,worker、supurvisor的心跳都歸它管),supervisor領旨(下載代碼),招募人馬(創建worker和線程等),worker、executor就給我幹活!task就是具體要乾的活
1、主控節點與工作節點
Storm集羣中有兩類節點:主控節點(Master Node)和工作節點(Worker Node)。其中,主控節點只有一個,而工作節點可以有多個
2、Nimbus進程與Supervisor進程
主控節點運行一個稱爲Nimbus的守護進程類似於Hadoop的JobTracker。Nimbus負責在集羣中分發代碼,對節點分配任務,並監視主機故障。
每個工作節點運行一個稱爲Supervisor的守護進程。Supervisor監聽其主機上已經分配的主機的作業,啓動和停止Nimbus已經分配的工作進程
3、流分組(Stream grouping)
流分組,是拓撲定義中的一部分,爲每個Bolt指定應該接收哪個流作爲輸入。流分組定義了流/元組如何在Bolt的任務之間進行分發。
Storm內置了8種流分組方式
4、工作進程(Worker)
Worker是Spout/Bolt中運行具體處理邏輯的進程。一個worker就是一個進程,進程裏面包含一個或多個線程
5、執行器(Executor)
一個線程就是一個executor,一個線程會處理一個或多個任務
6、任務(Task)
一個任務就是一個task
實時流計算常見架構圖
1)Flume獲取數據。
2)Kafka臨時保存數據。
3)Strom計算數據。
4)Redis是個內存數據庫,用來保存數據。
四、集羣搭建
環境準備
下載jar包http://storm.apache.org/
虛擬機準備
安裝jdk
安裝zookeeper
配置
1)拷貝jar包到hadoop102的/opt/software目錄下
2)解壓jar包到/opt/module目錄下
[root@hlh001 software]$ tar -zxvf apache-storm-1.1.0.tar.gz -C /opt/module/
3)修改解壓後的apache-storm-1.1.0.tar.gz文件名稱爲storm
[root@hlh001 module]$ mv apache-storm-1.1.0/ storm
4)在/opt/module/storm/目錄下創建data文件夾
[root@hlh001 storm]$ mkdir data
5)修改配置文件storm.yaml
# 設置Zookeeper的主機名稱
storm.zookeeper.servers:
- "hlh001"
- "hlh002"
- "hlh003"
# 設置主節點的主機名稱
nimbus.seeds: ["hlh001"]
# 設置Storm的數據存儲路徑
storm.local.dir: "/opt/module/storm/data"
# 設置Worker的端口號
supervisor.slots.ports:
- 6700
- 6701
- 6702
- 6703
6)配置環境變量
#STORM_HOME
export STORM_HOME=/opt/module/storm
export PATH=$PATH:$STORM_HOME/bin
7)啓動集羣
(1)後臺啓動nimbus 123臺分別啓動
bin/storm nimbus &
(2)後臺啓動supervisor 123臺分別啓動
bin/storm supervisor &
(3)啓動Storm ui
bin/storm ui
8)通過瀏覽器查看集羣狀態
http://hlh001:8080/index.html
五、日誌信息查看
1)查看nimbus的日誌信息
在nimbus的服務器上
cd /opt/module/storm/logs
tail -100f /opt/module/storm/logs/nimbus.log
2)查看ui運行日誌信息
在ui的服務器上,一般和nimbus一個服務器
cd /opt/module/storm/logs
tail -100f /opt/module/storm/logs/ui.log
3)查看supervisor運行日誌信息
在supervisor服務上
cd /opt/module/storm/logs
tail -100f /opt/module/storm/logs/supervisor.log
4)查看supervisor上worker運行日誌信息
在supervisor服務上
cd /opt/module/storm/logs
tail -100f /opt/module/storm/logs/worker-6702.log
5)logviewer,可以在web頁面點擊相應的端口號即可查看日誌http://hlh001:8000
分別在supervisor節點上執行:
[root@hlh001 storm]$ bin/storm logviewer &
[root@hlh001 storm]$ bin/storm logviewer &
[root@hlh001 storm]$ bin/storm logviewer &
六、命令行操作
1)nimbus:啓動nimbus守護進程
storm nimbus
2)supervisor:啓動supervisor守護進程
storm supervisor
3)ui:啓動UI守護進程。
storm ui
4)list:列出正在運行的拓撲及其狀態
storm list
5)logviewer:Logviewer提供一個web接口查看Storm日誌文件。
storm logviewer
6)jar:
storm jar 【jar路徑】 【拓撲包名.拓撲類名】 【拓撲名稱】
7)kill:殺死名爲Topology-name的拓撲
storm kill topology-name [-w wait-time-secs]
-w:等待多久後殺死拓撲
8)active:激活指定的拓撲spout。
storm activate topology-name
9)deactivate:禁用指定的拓撲Spout。
storm deactivate topology-name
10)help:打印一條幫助消息或者可用命令的列表。
storm help
storm help <command>