CentOS 6.8 實戰部署JStorm集羣

CentOS 6.8 實戰部署JStorm集羣CentOS 6.8 實戰部署JStorm集羣

JStorm 是一個分佈式實時計算引擎html

JStorm 是一個相似Hadoop MapReduce的系統, 用戶按照指定的接口實現一個任務,而後將這個任務遞交給JStorm系統,JStorm將這個任務跑起來,而且按7 * 24小時運行起來,一旦中間一個Worker 發生意外故障, 調度器當即分配一個新的Worker替換這個失效的Worker。java

所以,從應用的角度,JStorm應用是一種遵照某種編程規範的分佈式應用。從系統角度, JStorm是一套相似MapReduce的調度系統。 從數據的角度,JStorm是一套基於流水線的消息處理機制。linux

實時計算如今是大數據領域中最火爆的一個方向,由於人們對數據的要求愈來愈高,實時性要求也愈來愈快,傳統的Hadoop MapReduce,逐漸知足不了需求,所以在這個領域需求不斷。git

Storm組件和Hadoop組件對比github

  JStorm Hadoop
角色 Nimbus JobTracker
Supervisor TaskTracker
Worker Child
應用名稱 Topology Job
編程接口 Spout/Bolt Mapper/Reducer

優勢web

在Storm和JStorm出現之前,市面上出現不少實時計算引擎,但自Storm和JStorm出現後,基本上能夠說一統江湖: 究其優勢:算法

  • 開發很是迅速:接口簡單,容易上手,只要遵照Topology、Spout和Bolt的編程規範便可開發出一個擴展性極好的應用,底層RPC、Worker之間冗餘,數據分流之類的動做徹底不用考慮
  • 擴展性極好:當一級處理單元速度,直接配置一下併發數,便可線性擴展性能
  • 健壯強:當Worker失效或機器出現故障時, 自動分配新的Worker替換失效Worker
  • 數據準確性:能夠採用Ack機制,保證數據不丟失。 若是對精度有更多一步要求,採用事務機制,保證數據準確。
  • 實時性高: JStorm 的設計偏向單行記錄,所以,在時延較同類產品更低

應用場景數據庫

JStorm處理數據的方式是基於消息的流水線處理, 所以特別適合無狀態計算,也就是計算單元的依賴的數據所有在接受的消息中能夠找到, 而且最好一個數據流不依賴另一個數據流。apache

所以,經常用於:編程

  • 日誌分析,從日誌中分析出特定的數據,並將分析的結果存入外部存儲器如數據庫。目前,主流日誌分析技術就使用JStorm或Storm
  • 管道系統, 將一個數據從一個系統傳輸到另一個系統, 好比將數據庫同步到Hadoop
  • 消息轉化器, 將接受到的消息按照某種格式進行轉化,存儲到另一個系統如消息中間件
  • 統計分析器, 從日誌或消息中,提煉出某個字段,而後作count或sum計算,最後將統計值存入外部存儲器。中間處理過程可能更復雜。
  • 實時推薦系統, 將推薦算法運行在jstorm中,達到秒級的推薦效果

基本概念

首先,JStorm有點相似於Hadoop的MR(Map-Reduce),可是區別在於,hadoop的MR,提交到hadoop的MR job,執行完就結束了,進程就退出了,而一個JStorm任務(JStorm中稱爲topology),是7*24小時永遠在運行的,除非用戶主動kill。

JStorm組件

接下來是一張比較經典的Storm的大體的結構圖(跟JStorm同樣):

CentOS 6.8 實戰部署JStorm集羣CentOS 6.8 實戰部署JStorm集羣

圖中的水龍頭(好吧,有點俗)就被稱做spout,閃電被稱做bolt。

在JStorm的topology中,有兩種組件:spout和bolt。

# spout

spout表明輸入的數據源,這個數據源能夠是任意的,好比說kafaka,DB,HBase,甚至是HDFS等,JStorm從這個數據源中不斷地讀取數據,而後發送到下游的bolt中進行處理。

# bolt

bolt表明處理邏輯,bolt收到消息以後,對消息作處理(即執行用戶的業務邏輯),處理完之後,既能夠將處理後的消息繼續發送到下游的bolt,這樣會造成一個處理流水線(pipeline,不過更精確的應該是個有向圖);也能夠直接結束。

一般一個流水線的最後一個bolt,會作一些數據的存儲工做,好比將實時計算出來的數據寫入DB、HBase等,以供前臺業務進行查詢和展示。

組件的接口

JStorm框架對spout組件定義了一個接口:nextTuple,顧名思義,就是獲取下一條消息。執行時,能夠理解成JStorm框架會不停地調這個接口,以從數據源拉取數據並往bolt發送數據。

同時,bolt組件定義了一個接口:execute,這個接口就是用戶用來處理業務邏輯的地方。

每個topology,既能夠有多個spout,表明同時從多個數據源接收消息,也能夠多個bolt,來執行不一樣的業務邏輯。

調度和執行

接下來就是topology的調度和執行原理,對一個topology,JStorm最終會調度成一個或多個worker,每一個worker即爲一個真正的操做系統執行進程,分佈到一個集羣的一臺或者多臺機器上並行執行。

而每一個worker中,又能夠有多個task,分別表明一個執行線程。每一個task就是上面提到的組件(component)的實現,要麼是spout要麼是bolt。

用戶在提交一個topology的時候,會指定如下的一些執行參數:

#總worker數

即總的進程數。舉例來講,我提交一個topology,指定worker數爲3,那麼最後可能會有3個進程在執行。之因此是可能,是由於根據配置,JStorm有可能會添加內部的組件,如_acker或者__topology_master(這兩個組件都是特殊的bolt),這樣會致使最終執行的進程數大於用戶指定的進程數。咱們默認是若是用戶設置的worker數小於10個,那麼__topology_master 只是做爲一個task存在,不獨佔worker;若是用戶設置的worker數量大於等於10個,那麼__topology_master做爲一個task將獨佔一個worker

#每一個component的並行度

上面提到每一個topology均可以包含多個spout和bolt,而每一個spout和bolt均可以單獨指定一個並行度(parallelism),表明同時有多少個線程(task)來執行這個spout或bolt。

JStorm中,每個執行線程都有一個task id,它從1開始遞增,每個component中的task id是連續的。

仍是上面這個topology,它包含一個spout和一個bolt,spout的並行度爲5,bolt並行度爲10。那麼咱們最終會有15個線程來執行:5個spout執行線程,10個bolt執行線程。

這時spout的task id多是1~5,bolt的task id多是6~15,之因此是可能,是由於JStorm在調度的時候,並不保證task id必定是從spout開始,而後到bolt的。可是同一個component中的task id必定是連續的。

#每一個component之間的關係

即用戶須要去指定一個特定的spout發出的數據應該由哪些bolt來處理,或者說一箇中間的bolt,它發出的數據應該被下游哪些bolt處理。

仍是以上面的topology爲例,它們會分佈在3個進程中。JStorm使用了一種均勻的調度算法,所以在執行的時候,你會看到,每一個進程分別都各有5個線程在執行。固然,因爲spout是5個線程,不能均勻地分配到3個進程中,會出現一個進程只有1個spout線程的狀況;一樣地,也會出現一個進程中有4個bolt線程的狀況。

在一個topology的運行過程當中,若是一個進程(worker)掛掉了,JStorm檢測到以後,會不斷嘗試重啓這個進程,這就是7*24小時不間斷執行的概念。

消息的通訊

上面提到,spout的消息會發送給特定的bolt,bolt也能夠發送給其餘的bolt,那這之間是如何通訊的呢?

首先,從spout發送消息的時候,JStorm會計算出消息要發送的目標task id列表,而後看目標task id是在本進程中,仍是其餘進程中,若是是本進程中,那麼就能夠直接走進程內部通訊(如直接將這個消息放入本進程中目標task的執行隊列中);若是是跨進程,那麼JStorm會使用netty來將消息發送到目標task中。

實時計算結果輸出

JStorm是7*24小時運行的,外部系統若是須要查詢某個特定時間點的處理結果,並不會直接請求JStorm(固然,DRPC能夠支持這種需求,可是性能並非太好)。通常來講,在JStorm的spout或bolt中,都會有一個定時往外部存儲寫計算結果的邏輯,這樣數據能夠按照業務需求被實時或者近實時地存儲起來,而後直接查詢外部存儲中的計算結果便可。

以上內容直接粘貼JStorm官網,切勿吐槽

2、 Jstorm 集羣安裝

一、系統環境準備

# OS: CentOS 6.8 mininal
# host.ip: 10.1.1.78 aniutv-1
# host.ip: 10.1.1.80 aniutv-2
# host.ip: 10.1.1.97 aniutv-5

二、安裝目錄自定義

jstorm : /opt/jstorm (源碼安裝);

zookeeper : /opt/zookeeper(源碼安裝);

java : /usr/java/jdk1.7.0_79 (rpm包安裝)

三、zookeeper 集羣安裝

zookeeper 集羣參考(http://blog.csdn.net/wh211212/article/details/56014983)

四、zeromq 安裝

zeromq下載地址:http://zeromq.org/area:download/

下載zeromq-4.2.1.tar.gz  到/usr/local/src

cd /usr/local/src && tar -zxf zeromq-4.2.1.tar.gz -C /opt

cd /opt/zeromq-4.2.1 && ./configure && make && sudo make install && sudo ldconfig

五、jzmq安裝

cd /opt && git clone  https://github.com/nathanmarz/jzmq.git

./autogen.sh && ./configure && make && make install

六、JStorm安裝

wget https://github.com/alibaba/jstorm/releases/download/2.1.1/jstorm-2.1.1.zip -P /usr/local/src
cd /usr/local/src && unzip jstorm-2.1.1.zip -d /opt
cd /opt && mv jstorm-2.1.1 jstorm
# mkdir /opt/jstorm/jstorm_data
echo '# jstorm env' >> ~/.bashrc
echo 'export JSTORM_HOME=/opt/jstorm' >> ~/.bashrc
echo 'export PATH=$PATH:$JSTORM_HOME/bin' >> ~/.bashrc
source ~/.bashrc

# JStorm 配置

sed -i /'storm.zookeeper.servers:/a\ - "10.1.1.78"' /opt/jstorm/conf/storm.yaml
sed -i /'storm.zookeeper.servers:/a\ - "10.1.1.80"' /opt/jstorm/conf/storm.yaml
sed -i /'storm.zookeeper.servers:/a\ - "10.1.1.97"' /opt/jstorm/conf/storm.yaml
sed -i /'storm.zookeeper.root/a\ nimbus.host: "10.1.1.78"' /opt/jstorm/conf/storm.yaml<>

配置項:

storm.zookeeper.servers: 表示zookeeper 的地址;

nimbus.host: 表示nimbus的地址;

storm.zookeeper.root: 表示JStorm在zookeeper中的根目錄,當多個JStorm共享一個zookeeper時,須要設置該選項,默認即爲「/jstorm」;

storm.local.dir: 表示JStorm臨時數據存放目錄,須要保證JStorm程序對該目錄有寫權限;

java.library.path: Zeromq 和java zeromq library的安裝目錄,默認"/usr/local/lib:/opt/local/lib:/usr/lib";

supervisor.slots.ports: 表示Supervisor 提供的端口Slot列表,注意不要和其餘端口發生衝突,默認是68xx,而Storm的是67xx;

topology.enable.classloader: false, 默認關閉classloader,若是應用的jar與JStorm的依賴的jar發生衝突,好比應用使用thrift9,但jstorm使用thrift7時,就須要打開classloader。建議在集羣級別上默認關閉,在具體須要隔離的topology上打開這個選項。

# 下面命令只須要在安裝 jstorm_ui 和提交jar節點的機器上面執行便可

mkdir ~/.jstorm
cp -f $JSTORM_HOME/conf/storm.yaml ~/.jstorm

七、安裝JStorm Web UI

強制使用tomcat7.0或以上版本,切記拷貝~/.jstorm/storm.yaml, Web UI 能夠和Nimbus在同一個節點上

mkdir ~/.jstorm
cp -f $JSTORM_HOME/conf/storm.yaml ~/.jstorm
下載tomcat 7.x (以apache-tomcat-7.0.37 爲例)
tar -xzf apache-tomcat-7.0.75.tar.gz
cd apache-tomcat-7.0.75
cd webapps
cp $JSTORM_HOME/jstorm-ui-2.1.1.war ./
mv ROOT ROOT.old
ln -s jstorm-ui-2.1.1 ROOT   
# 另外不是 ln -s jstorm-ui-2.1.1.war ROOT 這個要當心
cd ../bin
./startup.sh

八、JStorm啓動

1.在nimbus 節點(10.1.1.78)上執行 「nohup jstorm nimbus &」, 查看$JSTORM_HOME/logs/nimbus.log檢查有無錯誤

2.在supervisor節點(10.1.1.78,10.1.1.80,10.1.1.97)上執行 「nohup jstorm supervisor &」, 查看$JSTORM_HOME/logs/supervisor.log檢查有無錯誤

九、JStorm Web UI

JStorm集羣啓動成功截圖以下:

CentOS 6.8 實戰部署JStorm集羣CentOS 6.8 實戰部署JStorm集羣

# JStorm 集羣安裝問題總結

一、注意/etc/hosts設置,添加相對應的ip hostname

二、設置ssh免密操做(此步驟在zookeeper集羣完成)

三、注意各服務的環境變量設置

本文地址:http://www.linuxprobe.com/centos6-8-deploy-jstorm-cluster.html

相關文章
相關標籤/搜索