新聞中心
JStorm 是參考 Apache Storm 實現(xiàn)的實時流式計算框架,在網(wǎng)絡(luò)IO、線程模型、資源調(diào)度、可用性及穩(wěn)定性上做了持續(xù)改進(jìn),已被越來越多企業(yè)使用。

成都創(chuàng)新互聯(lián)專業(yè)為企業(yè)提供靖安網(wǎng)站建設(shè)、靖安做網(wǎng)站、靖安網(wǎng)站設(shè)計、靖安網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計與制作、靖安企業(yè)網(wǎng)站模板建站服務(wù),十年靖安做網(wǎng)站經(jīng)驗,不只是建網(wǎng)站,更提供有價值的思路和整體網(wǎng)絡(luò)服務(wù)。
從應(yīng)用的角度,JStorm應(yīng)用是一種遵守某種編程規(guī)范的分布式應(yīng)用。從系統(tǒng)角度, JStorm是一套類似MapReduce的調(diào)度系統(tǒng)。 從數(shù)據(jù)的角度,JStorm是一套基于流水線的消息處理機(jī)制。
實時計算現(xiàn)在是大數(shù)據(jù)領(lǐng)域中最火爆的一個方向,因為人們對數(shù)據(jù)的要求越來越高,實時性要求也越來越快,傳統(tǒng)的Hadoop MapReduce,逐漸滿足不了需求,因此在這個領(lǐng)域需求不斷。
Storm組件和Hadoop組件對比
| JStorm | Hadoop | |
|---|---|---|
| 角色 | Nimbus | JobTracker |
| Supervisor | TaskTracker | |
| Worker | Child | |
| 應(yīng)用名稱 | Topology | Job |
| 編程接口 | Spout/Bolt | Mapper/Reducer |
優(yōu)點
在Storm和JStorm出現(xiàn)以前,市面上出現(xiàn)很多實時計算引擎,但自Storm和JStorm出現(xiàn)后,基本上可以說一統(tǒng)江湖: 究其優(yōu)點:
-
開發(fā)非常迅速:接口簡單,容易上手,只要遵守Topology、Spout和Bolt的編程規(guī)范即可開發(fā)出一個擴(kuò)展性極好的應(yīng)用,底層RPC、Worker之間冗余,數(shù)據(jù)分流之類的動作完全不用考慮
-
擴(kuò)展性極好:當(dāng)一級處理單元速度,直接配置一下并發(fā)數(shù),即可線性擴(kuò)展性能
-
健壯強:當(dāng)Worker失效或機(jī)器出現(xiàn)故障時, 自動分配新的Worker替換失效Worker
-
數(shù)據(jù)準(zhǔn)確性:可以采用Ack機(jī)制,保證數(shù)據(jù)不丟失。 如果對精度有更多一步要求,采用事務(wù)機(jī)制,保證數(shù)據(jù)準(zhǔn)確。
-
實時性高: JStorm 的設(shè)計偏向單行記錄,因此,在時延較同類產(chǎn)品更低
應(yīng)用場景
JStorm處理數(shù)據(jù)的方式是基于消息的流水線處理, 因此特別適合無狀態(tài)計算,也就是計算單元的依賴的數(shù)據(jù)全部在接受的消息中可以找到, 并且最好一個數(shù)據(jù)流不依賴另外一個數(shù)據(jù)流。
因此,常常用于:
-
日志分析,從日志中分析出特定的數(shù)據(jù),并將分析的結(jié)果存入外部存儲器如數(shù)據(jù)庫。目前,主流日志分析技術(shù)就使用JStorm或Storm
-
管道系統(tǒng), 將一個數(shù)據(jù)從一個系統(tǒng)傳輸?shù)搅硗庖粋€系統(tǒng), 比如將數(shù)據(jù)庫同步到Hadoop
-
消息轉(zhuǎn)化器, 將接受到的消息按照某種格式進(jìn)行轉(zhuǎn)化,存儲到另外一個系統(tǒng)如消息中間件
-
統(tǒng)計分析器, 從日志或消息中,提煉出某個字段,然后做count或sum計算,最后將統(tǒng)計值存入外部存儲器。中間處理過程可能更復(fù)雜。
-
實時推薦系統(tǒng), 將推薦算法運行在jstorm中,達(dá)到秒級的推薦效果
基本概念
首先,JStorm有點類似于Hadoop的MR(Map-Reduce),但是區(qū)別在于,hadoop的MR,提交到hadoop的MR job,執(zhí)行完就結(jié)束了,進(jìn)程就退出了,而一個JStorm任務(wù)(JStorm中稱為topology),是7*24小時永遠(yuǎn)在運行的,除非用戶主動kill。
JStorm組件
接下來是一張比較經(jīng)典的Storm的大致的結(jié)構(gòu)圖(跟JStorm一樣):
圖中的水龍頭(好吧,有點俗)就被稱作spout,閃電被稱作bolt。
在JStorm的topology中,有兩種組件:spout和bolt。
# spout
spout代表輸入的數(shù)據(jù)源,這個數(shù)據(jù)源可以是任意的,比如說kafaka,DB,HBase,甚至是HDFS等,JStorm從這個數(shù)據(jù)源中不斷地讀取數(shù)據(jù),然后發(fā)送到下游的bolt中進(jìn)行處理。
# bolt
bolt代表處理邏輯,bolt收到消息之后,對消息做處理(即執(zhí)行用戶的業(yè)務(wù)邏輯),處理完以后,既可以將處理后的消息繼續(xù)發(fā)送到下游的bolt,這樣會形成一個處理流水線(pipeline,不過更精確的應(yīng)該是個有向圖);也可以直接結(jié)束。
通常一個流水線的最后一個bolt,會做一些數(shù)據(jù)的存儲工作,比如將實時計算出來的數(shù)據(jù)寫入DB、HBase等,以供前臺業(yè)務(wù)進(jìn)行查詢和展現(xiàn)。
組件的接口
JStorm框架對spout組件定義了一個接口:nextTuple,顧名思義,就是獲取下一條消息。執(zhí)行時,可以理解成JStorm框架會不停地調(diào)這個接口,以從數(shù)據(jù)源拉取數(shù)據(jù)并往bolt發(fā)送數(shù)據(jù)。
同時,bolt組件定義了一個接口:execute,這個接口就是用戶用來處理業(yè)務(wù)邏輯的地方。
每一個topology,既可以有多個spout,代表同時從多個數(shù)據(jù)源接收消息,也可以多個bolt,來執(zhí)行不同的業(yè)務(wù)邏輯。
調(diào)度和執(zhí)行
接下來就是topology的調(diào)度和執(zhí)行原理,對一個topology,JStorm最終會調(diào)度成一個或多個worker,每個worker即為一個真正的操作系統(tǒng)執(zhí)行進(jìn)程,分布到一個集群的一臺或者多臺機(jī)器上并行執(zhí)行。
而每個worker中,又可以有多個task,分別代表一個執(zhí)行線程。每個task就是上面提到的組件(component)的實現(xiàn),要么是spout要么是bolt。
用戶在提交一個topology的時候,會指定以下的一些執(zhí)行參數(shù):
#總worker數(shù)
即總的進(jìn)程數(shù)。舉例來說,我提交一個topology,指定worker數(shù)為3,那么最后可能會有3個進(jìn)程在執(zhí)行。之所以是可能,是因為根據(jù)配置,JStorm有可能會添加內(nèi)部的組件,如_acker或者_(dá)_topology_master(這兩個組件都是特殊的bolt),這樣會導(dǎo)致最終執(zhí)行的進(jìn)程數(shù)大于用戶指定的進(jìn)程數(shù)。我們默認(rèn)是如果用戶設(shè)置的worker數(shù)小于10個,那么__topology_master 只是作為一個task存在,不獨占worker;如果用戶設(shè)置的worker數(shù)量大于等于10個,那么__topology_master作為一個task將獨占一個worker
#每個component的并行度
上面提到每個topology都可以包含多個spout和bolt,而每個spout和bolt都可以單獨指定一個并行度(parallelism),代表同時有多少個線程(task)來執(zhí)行這個spout或bolt。
JStorm中,每一個執(zhí)行線程都有一個task id,它從1開始遞增,每一個component中的task id是連續(xù)的。
還是上面這個topology,它包含一個spout和一個bolt,spout的并行度為5,bolt并行度為10。那么我們最終會有15個線程來執(zhí)行:5個spout執(zhí)行線程,10個bolt執(zhí)行線程。
這時spout的task id可能是1~5,bolt的task id可能是6~15,之所以是可能,是因為JStorm在調(diào)度的時候,并不保證task id一定是從spout開始,然后到bolt的。但是同一個component中的task id一定是連續(xù)的。
#每個component之間的關(guān)系
即用戶需要去指定一個特定的spout發(fā)出的數(shù)據(jù)應(yīng)該由哪些bolt來處理,或者說一個中間的bolt,它發(fā)出的數(shù)據(jù)應(yīng)該被下游哪些bolt處理。
還是以上面的topology為例,它們會分布在3個進(jìn)程中。JStorm使用了一種均勻的調(diào)度算法,因此在執(zhí)行的時候,你會看到,每個進(jìn)程分別都各有5個線程在執(zhí)行。當(dāng)然,由于spout是5個線程,不能均勻地分配到3個進(jìn)程中,會出現(xiàn)一個進(jìn)程只有1個spout線程的情況;同樣地,也會出現(xiàn)一個進(jìn)程中有4個bolt線程的情況。
在一個topology的運行過程中,如果一個進(jìn)程(worker)掛掉了,JStorm檢測到之后,會不斷嘗試重啟這個進(jìn)程,這就是7*24小時不間斷執(zhí)行的概念。
消息的通信
上面提到,spout的消息會發(fā)送給特定的bolt,bolt也可以發(fā)送給其他的bolt,那這之間是如何通信的呢?
首先,從spout發(fā)送消息的時候,JStorm會計算出消息要發(fā)送的目標(biāo)task id列表,然后看目標(biāo)task id是在本進(jìn)程中,還是其他進(jìn)程中,如果是本進(jìn)程中,那么就可以直接走進(jìn)程內(nèi)部通信(如直接將這個消息放入本進(jìn)程中目標(biāo)task的執(zhí)行隊列中);如果是跨進(jìn)程,那么JStorm會使用netty來將消息發(fā)送到目標(biāo)task中。
實時計算結(jié)果輸出
JStorm是7*24小時運行的,外部系統(tǒng)如果需要查詢某個特定時間點的處理結(jié)果,并不會直接請求JStorm(當(dāng)然,DRPC可以支持這種需求,但是性能并不是太好)。一般來說,在JStorm的spout或bolt中,都會有一個定時往外部存儲寫計算結(jié)果的邏輯,這樣數(shù)據(jù)可以按照業(yè)務(wù)需求被實時或者近實時地存儲起來,然后直接查詢外部存儲中的計算結(jié)果即可。
以上內(nèi)容直接粘貼JStorm官網(wǎng),切勿吐槽
二、 Jstorm 集群安裝
1、系統(tǒng)環(huán)境準(zhǔn)備
# 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
2、安裝目錄自定義
jstorm : /opt/jstorm (源碼安裝);
zookeeper : /opt/zookeeper(源碼安裝);
java : /usr/java/jdk1.7.0_79 (rpm包安裝)
3、zookeeper 集群安裝
zookeeper 集群參考(http://blog.csdn.net/wh211212/article/details/56014983)
4、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
5、jzmq安裝
cd /opt && git clone https://github.com/nathanmarz/jzmq.git
./autogen.sh && ./configure && make && make install
6、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中的根目錄,當(dāng)多個JStorm共享一個zookeeper時,需要設(shè)置該選項,默認(rèn)即為“/jstorm”;
storm.local.dir: 表示JStorm臨時數(shù)據(jù)存放目錄,需要保證JStorm程序?qū)υ撃夸浻袑憴?quán)限;
java.library.path: Zeromq 和java zeromq library的安裝目錄,默認(rèn)”/usr/local/lib:/opt/local/lib:/usr/lib”;
supervisor.slots.ports: 表示Supervisor 提供的端口Slot列表,注意不要和其他端口發(fā)生沖突,默認(rèn)是68xx,而Storm的是67xx;
topology.enable.classloader: false, 默認(rèn)關(guān)閉classloader,如果應(yīng)用的jar與JStorm的依賴的jar發(fā)生沖突,比如應(yīng)用使用thrift9,但jstorm使用thrift7時,就需要打開classloader。建議在集群級別上默認(rèn)關(guān)閉,在具體需要隔離的topology上打開這個選項。
# 下面命令只需要在安裝 jstorm_ui 和提交jar節(jié)點的機(jī)器上面執(zhí)行即可
mkdir ~/.jstorm
cp -f $JSTORM_HOME/conf/storm.yaml ~/.jstorm
7、安裝JStorm Web UI
強制使用tomcat7.0或以上版本,切記拷貝**~/.jstorm/storm.yaml,** Web UI 可以和Nimbus在同一個節(jié)點上
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
8、JStorm啟動
1.在nimbus 節(jié)點(10.1.1.78)上執(zhí)行 “nohup jstorm nimbus &”, 查看$JSTORM_HOME/logs/nimbus.log檢查有無錯誤
2.在supervisor節(jié)點(10.1.1.78,10.1.1.80,10.1.1.97)上執(zhí)行 “nohup jstorm supervisor &”, 查看$JSTORM_HOME/logs/supervisor.log檢查有無錯誤
9、JStorm Web UI
JStorm集群啟動成功截圖如下:
CentOS 6.8 實戰(zhàn)部署JStorm集群CentOS 6.8 實戰(zhàn)部署JStorm集群
# JStorm 集群安裝問題總結(jié)
1、注意/etc/hosts設(shè)置,添加相對應(yīng)的ip hostname
2、設(shè)置ssh免密操作(此步驟在zookeeper集群完成)
3、注意各服務(wù)的環(huán)境變量設(shè)置
分享標(biāo)題:CentOS6.8安裝并使用JStorm集群
網(wǎng)站路徑:http://www.dlmjj.cn/article/djgpigp.html


咨詢
建站咨詢
