flume是分佈式的,可靠的,高可用的,用於對不一樣來源的大量的日誌數據進行有效收集、彙集和移動,並以集中式的數據存儲的系統。java
flume目前是apache的一個頂級項目。apache
flume須要java運行環境,要求java1.6以上,推薦java1.7.windows
將下載好的flume安裝包解壓到指定目錄便可。bash
flume 事件,被定義爲一個具備有效荷載的字節數據流和可選的字符串屬性集。curl
flume 代理,是一個進程承載從外部源事件流到下一個目的地的過程。包含source channel 和 sink。分佈式
數據源,消耗外部傳遞給他的事件,外部源將數據按照flume Source 能識別的格式將Flume 事件發送給flume Source。ide
數據通道,是一個被動的存儲,用來保持事件,直到由一個flume Sink消耗。工具
數據匯聚點,表明外部數據存放位置。發送flume event到指定的外部目標。加密
2.2. flume流動模型url
2.3. flume的特色
Flume容許用戶進行多級流動到最終目的地,也容許扇出流(一到多)、扇入流(多到一)的、故障轉移和失敗處理。
事務性的數據傳遞,保證了數據的可靠性。
通道能夠之內存或文件的方式實現,內存更快,可是不可恢復,而文件雖然比較慢但提供了可恢復性。
1.首先編寫一個配置文件:
#example.conf:單節點Flume配置 #命名Agent a1的組件 a1.sources = r1 a1.sinks = k1 a1.channels = c1 #描述/配置Source a1.sources.r1.type = netcat a1.sources.r1.bind = 0.0.0.0 a1.sources.r1.port = 44444 #描述Sink a1.sinks.k1.type = logger #描述內存Channel a1.channels.c1.type = memory a1.channels.c1.capacity = 1000 a1.channels.c1.transactionCapacity = 100 #爲Channle綁定Source和Sink a1.sources.r1.channels = c1 a1.sinks.k1.channel = c1
2.經過flume的工具啓動agent
1 | $ bin /flume-ng agent --conf conf --conf- file example.conf --name a1 -Dflume.root.logger=INFO,console |
三、發送數據
在windows中經過telnet命令鏈接flume所在機器的44444端口發送數據。
如今介紹幾種比較重要的Source
監聽AVRO端口來接受來自外部AVRO客戶端的事件流。利用Avro Source能夠實現多級流動、扇出流、扇入流等效果。另外也能夠接受經過flume提供的Avro客戶端發送的日誌信息。
!channels –
!type – 類型名稱,"AVRO"
!bind – 須要監聽的主機名或IP
!port – 要監聽的端口
threads – 工做線程最大線程數
selector.type
selector.*
interceptors – 空格分隔的攔截器列表
interceptors.*
compression-type none 壓縮類型,能夠是「none」或「default」,這個值必須和AvroSource的壓縮格式匹配
sslfalse 是否啓用ssl加密,若是啓用還須要配置一個「keystore」和一個「keystore-password」。
keystore – 爲SSL提供的java密鑰文件所在路徑。
keystore-password– 爲SSL提供的java密鑰文件 密碼。
keystore-typeJKS密鑰庫類型能夠是「JKS」或「PKCS12」。
exclude-protocolsSSLv3 空格分隔開的列表,用來指定在SSL / TLS協議中排除。SSLv3將老是被排除除了所指定的協議。
ipFilter false 若是須要爲netty開啓ip過濾,將此項設置爲true
ipFilterRules– 定義netty的ip過濾設置表達式規則
案例:
編寫配置文件 修改上面給出的配置文件,除了Source部分配置不一樣,其他部分都同樣。不一樣的地方以下:
#描述/配置Source a1.sources.r1.type = avro a1.sources.r1.bind = 0.0.0.0 a1.sources.r1.port = 44444
啓動flume:
./flume-ng agent --conf ../conf --conf-file ../conf/template2.conf --name a1 -Dflume.root.logger=INFO,console
經過flume提供的avro客戶端向指定機器指定端口發送日誌信息:
./flume-ng avro-client --conf ../conf --host 0.0.0.0 --port 44444 --filename ../mydata/log1.txt
會發現確實收集到日誌
這個Source容許你將將要收集的數據放置到"自動蒐集"目錄中。這個Source將監視該目錄,並將解析新文件的出現。事件處理邏輯是可插拔的,當一個文件被徹底讀入通道,它會被重命名或可選的直接刪除。
要注意的是,放置到自動蒐集目錄下的文件不能修改,若是修改,則flume會報錯。另外,也不能產生重名的文件,若是有重名的文件被放置進來,則flume會報錯。
屬性說明:(因爲比較長 這裏只給出了必須給出的屬性,所有屬性請參考官方文檔):
!channels –
!type – 類型,須要指定爲"spooldir"
!spoolDir – 讀取文件的路徑,即"蒐集目錄"
fileSuffix.COMPLETED對處理完成的文件追加的後綴
案例:
編寫配置文件 修改上面給出的配置文件,除了Source部分配置不一樣,其他部分都同樣。不一樣的地方以下:
123 | #描述/配置Source a1.sources.r1. type = spooldir a1.sources.r1.spoolDir= /home/park/work/apache-flume-1 .6.0-bin /mydata |
啓動flume:
./flume-ng agent --conf ../conf --conf-file ../conf/template4.conf --name a1 -Dflume.root.logger=INFO,console
向指定目錄中傳輸文件,發現flume收集到了該文件,將文件中的每一行都做爲日誌來處理
一個NetCat Source用來監聽一個指定端口,並將接收到的數據的每一行轉換爲一個事件。
!channels–
!type– 類型名稱,須要被設置爲"netcat"
!bind– 指定要綁定到的ip或主機名。
!port– 指定要綁定到的端口號
max-line-length 512單行最大字節數
案例:上面完整的例子便是
HTTP Source接受HTTP的GET和POST請求做爲Flume的事件,其中GET方式應該只用於試驗。
該Source須要提供一個可插拔的"處理器"來將請求轉換爲事件對象,這個處理器必須實現HTTPSourceHandler接口,該處理器接受一個 HttpServletRequest對象,並返回一個Flume Envent對象集合。
從一個HTTP請求中獲得的事件將在一個事務中提交到通道中。所以容許像文件通道那樣對通道提升效率。
若是處理器拋出一個異常,Source將會返回一個400的HTTP狀態碼。
若是通道已滿,沒法再將Event加入Channel,則Source返回503的HTTP狀態碼,表示暫時不可用。
!type 類型,必須爲"HTTP"
!port– 監聽的端口
bind 0.0.0.0 監聽的主機名或ip
handler org.apache.flume.source.http.JSONHandler處理器類,須要實現HTTPSourceHandler接口
handler.* – 處理器的配置參數
selector.type
selector.*
interceptors –
interceptors.*
enableSSL false 是否開啓SSL,若是須要設置爲true。注意,HTTP不支持SSLv3。
excludeProtocols SSLv3 空格分隔的要排除的SSL/TLS協議。SSLv3老是被排除的。
keystore 密鑰庫文件所在位置。
keystorePassword Keystore 密鑰庫密碼
案例:
編寫配置文件 修改上面給出的配置文件,除了Source部分配置不一樣,其他部分都同樣。不一樣的地方以下:
#描述/配置Source a1.sources.r1.type = http a1.sources.r1.port = 66666
啓動flume:
./flume-ng agent --conf ../conf --conf-file ../conf/template6.conf --name a1 -Dflume.root.logger=INFO,console
經過命令發送HTTP請求到指定端口:
curl -X POST -d '[{ "headers" :{"a" : "a1","b" : "b1"},"body" : "hello~http~flume~"}]' http://0.0.0.0:6666