Jstorm的性能測試
JStorm 大概是Apache Storm 4倍, Apache Flink 1.5 倍, Twitter Heron 2 ~ 10 倍web
Jstorm是一個分佈式實時計算引擎
Jstorm是一個相似Hadoop Mapreduce的系統。
7*24小時運行
其中一個worker發生失敗,調度器當即分配一個新的worker替換這個失效的worker
從系統角度,JStorm相似MapReduce的調度系統
從數據角度,JStorm是一套基於流水線的消息處理機制算法
jstorm的優勢:
一、擴展性好 (併發數設置)
二、健壯性 (worker失效後,worker會進行故障轉移)
三、數據準確性 (Ack機制)
四、實時性高數據庫
應用場景:
JStorm處理數據的方式是基於消息的流水線處理,特別適合無狀態計算(計算單元的依賴的數據所有在接收的消息中找到),而且最好的是一個數據流不依賴另一個數據流
日誌分析:從日誌中分析出特定的數據,並將分析的結果存儲到外部存儲器例如數據庫
管道系統:將一個數據從一個系統傳輸到另一個系統, 好比將數據庫同步到Hadoop
消息轉化器, 將接受到的消息按照某種格式進行轉化,存儲到另一個系統如消息中間件
統計分析器, 從日誌或消息中,提煉出某個字段,而後作count或sum計算,最後將統計值存入外部存儲器
實時推薦系統, 將推薦算法運行在jstorm中,達到秒級的推薦效果apache
JStorm架構
一個典型的調度系統
nimbus:做爲調度器的角色
supervisor:做爲worker的代理角色,負責殺死worker和運行worker
worker:task運行容器
task:真正任務的執行者
zk:整個系統中協調者api
Worker/Task
worker和task是jstorm中任務執行單元,一個worker表示一個進程,一個task表明一個線程,一個worker能夠運行多個task
backtype.storm.Config.setNumWorkers(int workers)是設置worker數目,表示這個Topology運行在多個個jvm(一個jvm是一個進程,即一個worker);
backtype.storm.topology.TopologyBuilder.setSpout(String id, IRichSpout spout, Number parallelism_hint)和setBolt(String id, IRichBolt bolt,Number parallelism_hint)中的參數
parallelism_hint表示這個spout或bolt有多少個實例,即對應多少個線程執行,一個實例對應一個線程。
資源slot
在JStorm中,資源類型分爲4種, CPU, Memory,Disk, Port, 再也不侷限於Storm的port。
即一個supervisor能夠提供多少個CPU slot,多少個Memory slot, 多少個Disk slot, 多少個Port slottomcat
一個worker就消耗一個Port slot, 默認一個task會消耗一個CPU slot和一個Memory slot
當task執行任務較重時,能夠申請更多的CPU slot,
當task須要更多內存時,能夠申請更多的內存slot,
當task 磁盤讀寫較多時,能夠申請磁盤slot,則該磁盤slot給該task獨享架構
注意點:併發
一、咱們默認是若是用戶設置的worker數小於10個,那麼__topology_master 只是做爲一個task存在,不獨佔worker;
若是用戶設置的worker數量大於等於10個,那麼__topology_master做爲一個task將獨佔一個worker運維
Jstorm集羣維護jvm
一、總worker數
即總的進程數。舉例來講,我提交一個topology,指定worker數爲3,那麼最後可能會有3個進程在執行。之因此是可能,是由於根據配置,
JStorm有可能會添加內部的組件,如__acker或者__topology_master(這兩個組件都是特殊的bolt),這樣會致使最終執行的進程數大於用戶指定的進程數。
咱們默認是若是用戶設置的worker數小於10個,那麼__topology_master 只是做爲一個task存在,不獨佔worker;
若是用戶設置的worker數量大於等於10個,那麼__topology_master做爲一個task將獨佔一個worker
二、配置$JSTORM_HOME/conf/storm.yaml
storm.zookeeper.root: 表示JStorm在zookeeper中的根目錄,當多個JStorm共享一個zookeeper時,須要設置該選項,默認即爲「/jstorm」
nimbus.host: 表示nimbus的地址, 填寫ip
storm.local.dir: 表示JStorm臨時數據存放目錄,須要保證JStorm程序對該目錄有寫權限
三、關於kryo序列化
這要求傳輸的對象(及其全部非static及transient變量)須要有無參構造函數
四、修改pom.xml
<dependency> <groupId>com.alibaba.jstorm</groupId> <artifactId>jstorm-core</artifactId> <version>2.2.1</version> <!-- keep jstorm out of the jar-with-dependencies --> <!-- <scope>provided</scope> --> </dependency>
注意要註釋掉jstorm依賴中的`<scope>provided</scope>`,**而提交的時候必須記得將這行改回來!** 不然會報多個`defaults.yaml`的錯誤。
五、問題:控制檯沒有任何輸出
有幾個緣由可能致使這個問題:
1.若是在2.2.0中依賴了slf4j-log4j12,會跟jstorm自帶的log4j-over-slf4j衝突,須要將slf4j-log4j12排除掉。
2.確認你打的日誌是用slf4j-api打的,即LoggerFactory而不是log4j的Logger
六、性能
按照性能來講,
trident < transaction < 使用ack機制普通接口 < 關掉ack機制的普通接口
所以,首先要權衡一下應該選用什麼方式來完成任務。
若是「使用ack機制普通接口」時, 能夠嘗試關掉ack機制,查看性能如何,若是性能有大幅提高,
則預示着瓶頸不在spout, 有多是Acker的併發少了,或者業務處理邏輯慢了
增長併發
能夠簡單增長併發,查看是否可以增長處理能力
七、運維經驗總結 一、啓動supervisor或nimbus最好是之後臺方式啓動, 避免終端退出時向jstorm發送信號,致使jstorm莫名其妙的退出 nohup jstorm supervisor 1>/dev/null 2>&1 & 二、推薦使用admin用戶啓動全部的程序, 尤爲是不要用root用戶啓動web ui, 三、建立軟連接 在安裝目錄下,建議使用jstorm-current連接, 好比當前使用版本是jstorm 0.9.4, 則建立連接指向jstorm-0.9.4, 當之後升級時, 只須要將jstorm-current連接指向新的jstorm版本。 ln -s jstorm-0.9.4 jstorm-current 四、將JStorm的本地目錄和日誌配置到一個公共目錄下, 好比/home/admin/jstorm_data 和/home/admin/logs, 不要配置到$JSTORM_HOME/data和$JSTORM_HOME/logs,當升級時,替換整個目錄時, 容易丟失全部的本地數據和日誌。 五、建議不超過1個月,強制重啓一下supervisor, 由於supervisor是一個daemon進程, 不停的建立子進程, 當使用時間過長時, 文件打開的句柄會很是多,致使啓動worker的時間會變慢,所以,建議每隔一週,強制重啓一次supervisor 六、JStorm web ui推薦使用apache tomcat 7.x, 默認的端口是8080, 若是須要將80 端口重定向到8080時, 能夠用root執行命令: iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080 七、Jvm GC 須要使用CMS GC 方式, JStorm默認已經設置, 使用Storm的朋友須要相似的設置, worker.childopts: "-Xms1g -Xmx1g -Xmn378m -XX:SurvivorRatio=2 -XX:+UseConcMarkSweepGC -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=65" 八、對於一些重要的應用,能夠對大集羣進行分組, 修改配置文件的 「storm.zookeeper.root」 和 「nimbus.host」 九、對於應用使用ZK較頻繁的,須要將JStorm的ZK 和應用的ZK 隔離起來,不混在一塊兒使用 十、nimbus節點上建議不運行supervisor, 並建議把nimbus放置到ZK 所在的機器上運行 十一、推薦slot數爲 」CPU 核 - 1「, 假設24核CPU, 則slot爲23 十二、配置cronjob,定時檢查nimbus和supervisor,一旦進程死去,自動重啓 1三、ZK 的maxClientCnxns=500 1四、Linux對外鏈接端口數限制,TCP client對外發起鏈接數達到28000左右時,就開始大量拋異常,須要 # echo "10000 65535" > /proc/sys/net/ipv4/ip_local_port_range 八、開發經驗 推薦一個worker運行2個task