轉自:http://www.tuicool.com/articles/mMrQnu7
一直以來都想接觸Storm實時計算這塊的東西,最近在羣裏看到上海一哥們羅寶寫的Flume+Kafka+Storm的實時日誌流系統的搭建文檔,自己也跟着整了一遍,之前羅寶的文章中有一些要注意點沒提到的,以後一些寫錯的點,在這邊我會做修正;內容應該說絕大部分引用羅寶的文章的,這裏要謝謝羅寶兄弟,還有寫這篇文章@晨色星空J2EE也給了我很大幫助,這裏也謝謝@晨色星空J2EE
之前在弄這個的時候,跟羣裏的一些人討論過,有的人說,直接用storm不就可以做實時處理了,用不着那麼麻煩;其實不然,做軟件開發的都知道模塊化思想,這樣設計的原因有兩方面:
一方面是可以模塊化,功能劃分更加清晰,從“數據採集--數據接入--流失計算--數據輸出/存儲”
1 ) . 數據採集
負責從各節點上實時採集數據,選用 cloudera 的 flume 來實現
2 ) . 數據接入
由於採集數據的速度和數據處理的速度不一定同步,因此添加一個消息中間件來作爲緩衝,選用 apache 的 kafka
3 ) . 流式計算
對採集到的數據進行實時分析,選用 apache 的 storm
4 ) . 數據輸出
對分析後的結果持久化,暫定用 mysql
另一方面是模塊化之後,加入當Storm掛掉了之後,數據採集和數據接入還是繼續在跑着,數據不會丟失,storm起來之後可以繼續進行流式計算;
那麼接下來我們來看下整體的架構圖
詳細介紹各個組件及安裝配置:
操作系統:ubuntu
Flume
Flume 是 Cloudera 提供的一個分佈式、可靠、和高可用的海量日誌採集、聚合和傳輸的日誌收集系統,支持在日誌系統中定製各類數據發送方,用於收集數據 ; 同時, Flume 提供對數據進行簡單處理,並寫到各種數據接受方 ( 可定製 ) 的能力。
下圖爲 flume 典型的體系結構:
Flume 數據源以及輸出方式 :
Flume 提供了從 console( 控制檯 ) 、 RPC(Thrift-RPC) 、 text( 文件 ) 、 tail(UNIX tail) 、 syslog(syslog 日誌系統,支持 TCP 和 UDP 等 2 種模式 ) , exec( 命令執行 )等數據源上收集數據的能力 , 在我們的系統中目前使用 exec 方式進行日誌採集。
Flume 的數據接受方,可以是 console( 控制檯 ) 、 text( 文件 ) 、 dfs(HDFS 文件 )、 RPC(Thrift-RPC) 和 syslogTCP(TCP syslog 日誌系統 ) 等。在我們系統中由kafka 來接收。
Flume 下載及文檔:
Flume 安裝:
$tar zxvf apache-flume-1.4.0-bin.tar.gz/usr/local
Flume 啓動命令:
$bin/flume-ng agent--conf conf --conf-file conf/flume-conf.properties --name producer-Dflume.root.logger=INFO,console
Kafka
kafka是一種高吞吐量的分佈式發佈訂閱消息系統,她有如下特性:
通過O(1)的磁盤數據結構提供消息的持久化,這種結構對於即使數以TB的消息存儲也能夠保持長時間的穩定性能。
高吞吐量:即使是非常普通的硬件kafka也可以支持每秒數十萬的消息。
支持通過kafka服務器和消費機集羣來分區消息。
支持Hadoop並行數據加載。
kafka 的目的是提供一個發佈訂閱解決方案,它可以處理消費者規模的網站中的所有動作流數據。 這種動作(網頁瀏覽,搜索和其他用戶的行動)是在現代網絡上的許多社會功能的一個關鍵因素。 這些數據通常是由於吞吐量的要求而通過處理日誌和日誌聚合來解決。 對於像Hadoop的一樣的日誌數據和離線分析系統,但又要求實時處理的限制,這是一個可行的解決方案。kafka的目的是通過Hadoop的並行加載機制來統一線上和離線的消息處理,也是爲了通過集羣機來提供實時的消費。
kafka分佈式訂閱架構如下圖:--取自Kafka官網
其實兩者沒有太大區別,官網的架構圖只是把Kafka簡潔的表示成一個Kafka Cluster,而羅寶兄弟的架構圖就相對詳細一些;
Kafka 版本: 0.8.0
Kafka 下載及文檔: http://kafka.apache.org/
Kafka 安裝:
> tar xzf kafka-<VERSION>.tgz > cd kafka-<VERSION>> ./sbt update > ./sbt package > ./sbt assembly-package-dependency
啓動及測試命令:
( 1 ) start server
> bin/zookeeper-server-start.shconfig/zookeeper.properties > bin/kafka-server-start.shconfig/server.properties
這裏是官網上的教程,kafka本身有內置zookeeper,但是我自己在實際部署中是使用單獨的zookeeper集羣,所以第一行命令我就沒執行,這裏只是些出來給大家看下。
配置獨立的zookeeper集羣需要配置server.properties文件,講zookeeper.connect修改爲獨立集羣的IP和端口
zookeeper.connect=nutch1:2181
( 2 ) Create a topic
> bin/kafka-create-topic.sh --zookeeper localhost:2181 --replica 1--partition 1 --topic test > bin/kafka-list-topic.sh --zookeeperlocalhost:2181
( 3 ) Send some messages
> bin/kafka-console-producer.sh--broker-list localhost:9092 --topic test
( 4 ) Start a consumer
> bin/kafka-console-consumer.sh--zookeeper localhost:2181 --topic test --from-beginning
kafka-console-producer.sh 和 kafka-console-cousumer.sh 只是系統提供的命令行工具。這裏啓動是爲了測試是否能正常生產消費;驗證流程正確性
在實際開發中還是要自行開發自己的生產者與消費者;
kafka的安裝也可以參考我之前寫的文章:http://blog.csdn.net/weijonathan/article/details/18075967
Storm
Twitter將Storm正式開源了,這是一個分佈式的、容錯的實時計算系統,它被託管在GitHub 上,遵循 Eclipse Public License 1.0。Storm是由BackType開發的實時處理系統,BackType現在已在Twitter麾下。GitHub上的最新版本是Storm 0.5.2,基本是用 Clojure 寫的。
Storm的主要特點如下:
簡單的編程模型。類似於 MapReduce 降低了並行批處理複雜性,Storm降低了進行實時處理的複雜性。
可以使用各種編程語言。你可以在Storm之上使用各種編程語言。默認支持Clojure、Java、Ruby和Python。要增加對其他語言的支持,只需實現一個簡單的Storm通信協議即可。
容錯性。Storm會管理工作進程和節點的故障。
水平擴展。計算是在多個線程、進程和服務器之間並行進行的。
可靠的消息處理。Storm保證每個消息至少能得到一次完整處理。任務失敗時,它會負責從消息源重試消息。
快速。系統的設計保證了消息能得到快速的處理,使用 MQ 作爲其底層消息隊列。 (0.9.0.1版本支持 MQ 和jetty兩種模式)
本地模式。Storm有一個“本地模式”,可以在處理過程中完全模擬Storm集羣。這讓你可以快速進行開發和單元測試。
由於篇幅問題,具體的安裝步驟可以參考我之前寫的文章:http://blog.csdn.net/weijonathan/article/details/17762477
接下來重頭戲開始拉!那就是框架之間的整合啦
flume 和 kafka 整合
1. 下載 flume-kafka-plus: https://github.com/beyondj2ee/flumeng-kafka-plugin
2. 提取插件中的 flume-conf.properties 文件
修改該文件: #source section
producer.sources.s.type = exec
producer.sources.s.command = tail -f -n+1 /mnt/hgfs/vmshare/test.log
producer.sources.s.channels = c
修改所有 topic 的值改爲 test
將改後的配置文件放進 flume/conf 目錄下
在該項目中提取以下 jar 包放入環境中 flume 的 lib 下:
完成上面的步驟之後,我們來測試下flume+kafka這個流程有沒有走通;
我們先啓動flume,然後再啓動kafka,啓動步驟按之前的步驟執行;接下來我們使用kafka的kafka-console-consumer.sh腳本查看是否有flume有沒有往Kafka傳輸數據;
以上這個是我的test.log文件通過flume抓取傳到kafka的數據;說明我們的flume和kafka流程走通了;
大家還記得剛開始我們的流程圖麼,其中有一步是通過flume到kafka,還有一步是到hdfs的;而我們這邊還沒有提到如何存入kafka且同時存如hdfs;
flume是支持數據同步複製,同步複製流程圖如下,取自於flume官網,官網用戶指南地址:http://flume.apache.org/FlumeUserGuide.html
怎麼設置同步複製呢,看下面的配置:
#2個channel和2個sink的配置文件 這裏我們可以設置兩個sink,一個是kafka的,一個是hdfs的;a1.sources = r1 a1.sinks = k1 k2 a1.channels = c1 c2
具體配置大夥根據自己的需求去設置,這裏就不具體舉例了
kafka和storm的整合
1. 下載 kafka-storm0.8 插件: https://github.com/wurstmeister/storm-kafka-0.8-plus
2. 使用 maven package 進行編譯,得到 flumeng-kafka-plugin.jar 包
3. 將該 jar 包及 kafka_2.9.2-0.8.0-beta1.jar、metrics-core-2.2.0.jar、scala-library-2.9.2.jar ( 這三個 jar 包在 kafka 項目中能找到 )
備註:如果開發的項目需要其他 jar ,記得也要放進 storm 的 Lib 中比如用到了mysql 就要添加 mysql-connector-java-5.1.22-bin.jar 到 storm 的 lib 下
那麼接下來我們把storm也重啓下;
完成以上步驟之後,我們還有一件事情要做,就是使用kafka-storm0.8插件,寫一個自己的Storm程序;
這裏我給大夥附上一個我弄的storm程序,百度網盤分享地址:http://pan.baidu.com/s/1bnEdgh5;
先稍微看下程序的創建Topology代碼
數據操作主要在WordCounter類中,這裏只是使用簡單JDBC進行插入處理
這裏只需要輸入一個參數作爲Topology名稱就可以了!我們這裏使用本地模式,所以不輸入參數,直接看流程是否走通;
storm-0.9.0.1/bin/storm jar storm-start-demo-0.0.1-SNAPSHOT.jar com.storm.topology.MyTopology
先看下日誌,這裏打印出來了往數據庫裏面插入數據了
然後我們查看下數據庫;插入成功了!
到這裏我們的整個整合就完成了!
但是這裏還有一個問題,不知道大夥有沒有發現。這個也是@晨色星空J2EE跟我說的,其實我也應該想到的;
由於我們使用storm進行分佈式流式計算,那麼分佈式最需要注意的是數據一致性以及避免髒數據的產生;所以我提供的測試項目只能用於測試,正式開發不能這樣處理;
@晨色星空J2EE給的建議是建立一個zookeeper的分佈式全局鎖,保證數據一致性,避免髒數據錄入!
zookeeper客戶端框架大夥可以使用Netflix Curator來完成,由於這塊我還沒去看,所以只能寫到這裏了!
這裏在一次謝謝羅寶和@晨色星空!