【採集層】Kafka 與 Flume 如何選擇html
http://my.oschina.net/frankwu/blog/355298 mysql
Flume -- 開源分佈式日誌收集系統
nginx
http://www.cnblogs.com/hanganglin/articles/4224928.html sql
Flume 收集Nginx日誌到Hdfs Tail-to-hdfs sink
數據庫
http://blog.csdn.net/luyee2010/article/details/22159445 緩存
flume是作收集的,能夠把它理解爲一個數據的轉換者,從本地把數據讀取,而後轉化到hdfs分佈式文件系統上,目的是把兩個系統的文件作一個對接;相似於sqoop作數據庫的對接,它把mysql的數據庫轉到hdfs上或Hbase上。
服務器
Flume至關於一根管子,裏面流的是數據 ,進去的目錄-source(本地目錄),Flume進來監控的是本地目錄;出去的目錄-sink(HDFS目錄,分佈式文件系統上);分佈式
Flume進來監控的是本地目錄,本地裏有一個監控的目錄,本地目錄中的文件要是變化才能夠。不能直接監控到nginx服務器,它上面會產生日誌,它一直在讀寫,nginx產生日誌,進行真正滾動後,好比10分鐘生成一個文件,這時,你把它mv 或 copy到 本地要監控的目錄,flume不能監控目錄中文件內容是一直變化的,只能監控文件的個數的變化,flume一看個數變化,它才把日誌抓過來。oop
最近兩天,仔細的看了一下Flume中央日誌系統(版本號:1.3.X),Flume在本人看來,仍是一個很是不錯的日誌收集系統的,其設計理念很是易用,簡潔。而且是一個開源項目,基於Java語言開發,能夠進行一些自定義的功能開發。運行Flume時,機器必須安裝裝JDK6.0以上的版本,而且,Flume目前只有Linux系統的啓動腳本,沒有Windows環境的啓動腳本。
spa
Flume主要由3個重要的組件購成:
Source:完成對日誌數據的收集,分紅transtion 和 event 打入到channel之中。
Channel:主要提供一個隊列的功能,對source提供中的數據進行簡單的緩存。
Sink:取出Channel中的數據,進行相應的存儲文件系統,數據庫,或者提交到遠程服務器。
對現有程序改動最小的使用方式是使用是直接讀取程序原來記錄的日誌文件,基本能夠實現無縫接入,不須要對現有程序進行任何改動。
對於直接讀取文件Source,有兩種方式:
ExecSource:以運行Linux命令的方式,持續的輸出最新的數據,如tail -F 文件名指令,在這種方式下,取的文件名必須是指定的。
SpoolSource:是監測配置的目錄下新增的文件,並將文件中的數據讀取出來。
須要注意兩點:
一、拷貝到spool目錄下的文件不能夠再打開編輯。
2、spool目錄下不可包含相應的子目錄。 在實際使用的過程當中,能夠結合log4j使用,使用log4j的時候,將log4j的文件分割機制設爲1分鐘一次,將文件拷貝到spool的監控目錄。log4j有一個TimeRolling的插件,能夠把log4j分割的文件到spool目錄。基本實現了實時的監控。Flume在傳完文件以後,將會修改文件的後綴,變爲.COMPLETED(後綴也能夠在配置文件中靈活指定)
ExecSource,SpoolSource對比:
ExecSource能夠實現對日誌的實時收集,可是存在Flume不運行或者指令執行出錯時,將沒法收集到日誌數據,沒法何證日誌數據的完整性。
SpoolSource雖然沒法實現實時的收集數據,可是可使用以分鐘的方式分割文件,趨近於實時。若是應用沒法實現以分鐘切割日誌文件的話,能夠兩種收集方式結合使用。
Channel有多種方式:有MemoryChannel,JDBC Channel,MemoryRecoverChannel,FileChannel。
MemoryChannel能夠實現高速的吞吐,可是沒法保證數據的完整性。
MemoryRecoverChannel在官方文檔的建議上已經建義使用FileChannel來替換。
FileChannel保證數據的完整性與一致性。
在具體配置實現的FileChannel時,建議FileChannel設置的目錄和程序日誌文件保存的目錄設成不一樣的磁盤,以便提升效率。
Sink在設置存儲數據時,能夠向文件系統中,數據庫中,hadoop中儲數據(HDFS、HBase),在日誌數據較少時,能夠將數據存儲在文件系中,而且設定必定的時間間隔保存數據。在日誌數據較多時,能夠將相應的日誌數據存儲到Hadoop中,便於往後進行相應的數據分析。