常見的幾種Flume日志收集場(chǎng)景實(shí)戰(zhàn)

這里主要介紹幾種常見的日志的source來源秸滴,包括監(jiān)控文件型武契,監(jiān)控文件內(nèi)容增量,TCP和HTTP。

Spool類型

用于監(jiān)控指定目錄內(nèi)數(shù)據(jù)變更咒唆,若有新文件届垫,則將新文件內(nèi)數(shù)據(jù)讀取上傳

教你一步搭建Flume分布式日志系統(tǒng)最后有介紹此案例

Exec

EXEC執(zhí)行一個(gè)給定的命令獲得輸出的源,如果要使用tail命令,必選使得file足夠大才能看到輸出內(nèi)容

創(chuàng)建agent配置文件

vi /usr/local/flume170/conf/exec_tail.conf

[
復(fù)制代碼

](javascript:void(0); "復(fù)制代碼")

<pre style="margin: 0px; padding: 0px; white-space: pre-wrap; word-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;">a1.sources = r1
a1.channels = c1 c2
a1.sinks = k1 k2 # Describe/configure the source
a1.sources.r1.type = exec a1.sources.r1.channels = c1 c2
a1.sources.r1.command = tail -F /var/log/haproxy.log # Use a channel which buffers events in memory
a1.channels.c1.type = memory
a1.channels.c1.capacity = 1000 a1.channels.c1.transactionCapacity = 100 a1.channels.c2.type = file
a1.channels.c2.checkpointDir = /usr/local/flume170/checkpoint
a1.channels.c2.dataDirs = /usr/local/flume170/data # Describe the sink
a1.sinks.k1.type = logger
a1.sinks.k1.channel =c1

a1.sinks.k2.type = FILE_ROLL
a1.sinks.k2.channel = c2
a1.sinks.k2.sink.directory = /usr/local/flume170/files
a1.sinks.k2.sink.rollInterval = 0</pre>

[
復(fù)制代碼

](javascript:void(0); "復(fù)制代碼")

啟動(dòng)flume agent a1

  # /usr/local/flume170/bin/flume-ng agent -c . -f /usr/local/flume170/conf/exec_tail.conf -n a1 -Dflume.root.logger=INFO,console
  生成足夠多的內(nèi)容在文件里
  # for i in {1..100};do echo "exec tail$i" >> /usr/local/flume170/log_exec_tail;echo $i;sleep 0.1;done
  在H32的控制臺(tái)全释,可以看到以下信息:

image
image

Http

JSONHandler型

基于HTTP POST或GET方式的數(shù)據(jù)源装处,支持JSON、BLOB表示形式

創(chuàng)建agent配置文件

vi /usr/local/flume170/conf/post_json.conf

[
復(fù)制代碼

](javascript:void(0); "復(fù)制代碼")

<pre style="margin: 0px; padding: 0px; white-space: pre-wrap; word-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;">a1.sources = r1
a1.channels = c1
a1.sinks = k1 # Describe/configure the source
a1.sources.r1.type = org.apache.flume.source.http.HTTPSource
a1.sources.r1.port = 5142 a1.sources.r1.channels = c1 # Use a channel which buffers events in memory
a1.channels.c1.type = memory
a1.channels.c1.capacity = 1000 a1.channels.c1.transactionCapacity = 100

Describe the sink

a1.sinks.k1.type = logger
a1.sinks.k1.channel = c1</pre>

[
復(fù)制代碼

](javascript:void(0); "復(fù)制代碼")

啟動(dòng)flume agent a1

/usr/local/flume170/bin/flume-ng agent -c . -f /usr/local/flume170/conf/post_json.conf -n a1 -Dflume.root.logger=INFO,console

生成JSON 格式的POST request

curl -X POST -d '[{ "headers" :{"a" : "a1","b" : "b1"},"body" : "idoall.org_body"}]' http://localhost:8888

在H32的控制臺(tái)浸船,可以看到以下信息:

image
image
image

Tcp

Syslogtcp監(jiān)聽TCP的端口做為數(shù)據(jù)源

創(chuàng)建agent配置文件

vi /usr/local/flume170/conf/syslog_tcp.conf

[
復(fù)制代碼

](javascript:void(0); "復(fù)制代碼")

<pre style="margin: 0px; padding: 0px; white-space: pre-wrap; word-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;">a1.sources = r1
a1.channels = c1
a1.sinks = k1 # Describe/configure the source
a1.sources.r1.type = syslogtcp
a1.sources.r1.port = 5140 a1.sources.r1.host = H32
a1.sources.r1.channels = c1 # Use a channel which buffers events in memory
a1.channels.c1.type = memory
a1.channels.c1.capacity = 1000 a1.channels.c1.transactionCapacity = 100

Describe the sink

a1.sinks.k1.type = logger
a1.sinks.k1.channel = c1</pre>

[
復(fù)制代碼

](javascript:void(0); "復(fù)制代碼")

啟動(dòng)flume agent a1

/usr/local/flume170/bin/flume-ng agent -c . -f /usr/local/flume170/conf/syslog_tcp.conf -n a1 -Dflume.root.logger=INFO,console

測(cè)試產(chǎn)生syslog

echo "hello idoall.org syslog" | nc localhost 5140

在H32的控制臺(tái)妄迁,可以看到以下信息:

image
image

Flume Sink Processors和Avro類型

Avro可以發(fā)送一個(gè)給定的文件給Flume,Avro 源使用AVRO RPC機(jī)制李命。

failover的機(jī)器是一直發(fā)送給其中一個(gè)sink登淘,當(dāng)這個(gè)sink不可用的時(shí)候,自動(dòng)發(fā)送到下一個(gè)sink封字。channel的transactionCapacity參數(shù)不能小于sink的batchsiz
  在H32創(chuàng)建Flume_Sink_Processors配置文件
  # vi /usr/local/flume170/conf/Flume_Sink_Processors.conf

[
復(fù)制代碼

](javascript:void(0); "復(fù)制代碼")

<pre style="margin: 0px; padding: 0px; white-space: pre-wrap; word-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;">a1.sources = r1
a1.channels = c1 c2
a1.sinks = k1 k2 # Describe/configure the source
a1.sources.r1.type = syslogtcp
a1.sources.r1.port = 5140 a1.sources.r1.channels = c1 c2
a1.sources.r1.selector.type = replicating # Use a channel which buffers events in memory
a1.channels.c1.type = memory
a1.channels.c1.capacity = 1000 a1.channels.c1.transactionCapacity = 100 a1.channels.c2.type = memory
a1.channels.c2.capacity = 1000 a1.channels.c2.transactionCapacity = 100

Describe the sink

a1.sinks.k1.type = avro
a1.sinks.k1.channel = c1
a1.sinks.k1.hostname = H32
a1.sinks.k1.port = 5141 a1.sinks.k2.type = avro
a1.sinks.k2.channel = c2
a1.sinks.k2.hostname = H33
a1.sinks.k2.port = 5141

這個(gè)是配置failover的關(guān)鍵黔州,需要有一個(gè)sink group

a1.sinkgroups = g1
a1.sinkgroups.g1.sinks = k1 k2 # 處理的類型是failover
a1.sinkgroups.g1.processor.type = failover # 優(yōu)先級(jí),數(shù)字越大優(yōu)先級(jí)越高阔籽,每個(gè)sink的優(yōu)先級(jí)必須不相同
a1.sinkgroups.g1.processor.priority.k1 = 5 a1.sinkgroups.g1.processor.priority.k2 = 10

設(shè)置為10秒流妻,當(dāng)然可以根據(jù)你的實(shí)際狀況更改成更快或者很慢

a1.sinkgroups.g1.processor.maxpenalty = 10000
</pre>

[
復(fù)制代碼

](javascript:void(0); "復(fù)制代碼")

在H32創(chuàng)建Flume_Sink_Processors_avro配置文件

  # vi /usr/local/flume170/conf/Flume_Sink_Processors_avro.conf

[
復(fù)制代碼

](javascript:void(0); "復(fù)制代碼")

<pre style="margin: 0px; padding: 0px; white-space: pre-wrap; word-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;">a1.sources = r1
a1.channels = c1
a1.sinks = k1 # Describe/configure the source
a1.sources.r1.type = avro
a1.sources.r1.channels = c1
a1.sources.r1.bind = 0.0.0.0 a1.sources.r1.port = 5141

Use a channel which buffers events in memory

a1.channels.c1.type = memory
a1.channels.c1.capacity = 1000 a1.channels.c1.transactionCapacity = 100

Describe the sink

a1.sinks.k1.type = logger
a1.sinks.k1.channel = c1</pre>

[
復(fù)制代碼

](javascript:void(0); "復(fù)制代碼")

將2個(gè)配置文件復(fù)制到H33上一份

/usr/local/flume170# scp -r /usr/local/flume170/conf/Flume_Sink_Processors.conf   H33:/usr/local/flume170/conf/Flume_Sink_Processors.conf
  /usr/local/flume170# scp -r /usr/local/flume170/conf/Flume_Sink_Processors_avro.conf   H33:/usr/local/flume170/conf/Flume_Sink_Processors_avro.conf
  打開4個(gè)窗口,在H32和H33上同時(shí)啟動(dòng)兩個(gè)flume agent
  # /usr/local/flume170/bin/flume-ng agent -c . -f /usr/local/flume170/conf/Flume_Sink_Processors_avro.conf -n a1 -Dflume.root.logger=INFO,console
  # /usr/local/flume170/bin/flume-ng agent -c . -f /usr/local/flume170/conf/Flume_Sink_Processors.conf -n a1 -Dflume.root.logger=INFO,console
  然后在H32或H33的任意一臺(tái)機(jī)器上笆制,測(cè)試產(chǎn)生log
  # echo "idoall.org test1 failover" | nc H32 5140

因?yàn)镠33的優(yōu)先級(jí)高绅这,所以在H33的sink窗口,可以看到以下信息在辆,而H32沒有:

image

這時(shí)我們停止掉H33機(jī)器上的sink(ctrl+c)君躺,再次輸出測(cè)試數(shù)據(jù)
  # echo "idoall.org test2 failover" | nc localhost 5140
  可以在H32的sink窗口,看到讀取到了剛才發(fā)送的兩條測(cè)試數(shù)據(jù):

image

我們?cè)僭贖33的sink窗口中开缎,啟動(dòng)sink:
  # /usr/local/flume170/bin/flume-ng agent -c . -f /usr/local/flume170/conf/Flume_Sink_Processors_avro.conf -n a1 -Dflume.root.logger=INFO,console
  輸入兩批測(cè)試數(shù)據(jù):
  # echo "idoall.org test3 failover" | nc localhost 5140 && echo "idoall.org test4 failover" | nc localhost 5140
  在H33的sink窗口棕叫,我們可以看到以下信息,因?yàn)閮?yōu)先級(jí)的關(guān)系奕删,log消息會(huì)再次落到H33上:

image

Load balancing Sink Processor

load balance type和failover不同的地方是俺泣,load balance有兩個(gè)配置,一個(gè)是輪詢完残,一個(gè)是隨機(jī)伏钠。兩種情況下如果被選擇的sink不可用,就會(huì)自動(dòng)嘗試發(fā)送到下一個(gè)可用的sink上面谨设。
  在H32創(chuàng)建Load_balancing_Sink_Processors配置文件
  # vi /usr/local/flume170/conf/Load_balancing_Sink_Processors.conf

[
復(fù)制代碼

](javascript:void(0); "復(fù)制代碼")

<pre style="margin: 0px; padding: 0px; white-space: pre-wrap; word-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;">a1.sources = r1
a1.channels = c1
a1.sinks = k1 k2 # Describe/configure the source
a1.sources.r1.type = syslogtcp
a1.sources.r1.port = 5140 a1.sources.r1.channels = c1 # Use a channel which buffers events in memory
a1.channels.c1.type = memory
a1.channels.c1.capacity = 1000 a1.channels.c1.transactionCapacity = 100

Describe the sink

a1.sinks.k1.type = avro
a1.sinks.k1.channel = c1
a1.sinks.k1.hostname = H32
a1.sinks.k1.port = 5141 a1.sinks.k2.type = avro
a1.sinks.k2.channel = c1
a1.sinks.k2.hostname = H33
a1.sinks.k2.port = 5141

這個(gè)是配置failover的關(guān)鍵熟掂,需要有一個(gè)sink group

a1.sinkgroups = g1
a1.sinkgroups.g1.sinks = k1 k2 # 處理的類型是load_balance
a1.sinkgroups.g1.processor.type = load_balance
a1.sinkgroups.g1.processor.backoff = true
a1.sinkgroups.g1.processor.selector = round_robin </pre>

[
復(fù)制代碼

](javascript:void(0); "復(fù)制代碼")

在H32創(chuàng)建Load_balancing_Sink_Processors_avro配置文件

# vi /usr/local/flume170/conf/Load_balancing_Sink_Processors_avro.conf

[
復(fù)制代碼

](javascript:void(0); "復(fù)制代碼")

<pre style="margin: 0px; padding: 0px; white-space: pre-wrap; word-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;">a1.sources = r1
a1.channels = c1
a1.sinks = k1 # Describe/configure the source
a1.sources.r1.type = avro
a1.sources.r1.channels = c1
a1.sources.r1.bind = 0.0.0.0 a1.sources.r1.port = 5141

Use a channel which buffers events in memory

a1.channels.c1.type = memory
a1.channels.c1.capacity = 1000 a1.channels.c1.transactionCapacity = 100

Describe the sink

a1.sinks.k1.type = logger
a1.sinks.k1.channel = c1</pre>

[
復(fù)制代碼

](javascript:void(0); "復(fù)制代碼")

將2個(gè)配置文件復(fù)制到H33上一份

/usr/local/flume170# scp -r /usr/local/flume170/conf/Load_balancing_Sink_Processors.conf H33:/usr/local/flume170/conf/Load_balancing_Sink_Processors.conf
/usr/local/flume170# scp -r /usr/local/flume170/conf/Load_balancing_Sink_Processors_avro.conf H33:/usr/local/flume170/conf/Load_balancing_Sink_Processors_avro.conf

打開4個(gè)窗口,在H32和H33上同時(shí)啟動(dòng)兩個(gè)flume agent

/usr/local/flume170/bin/flume-ng agent -c . -f /usr/local/flume170/conf/Load_balancing_Sink_Processors_avro.conf -n a1 -Dflume.root.logger=INFO,console

/usr/local/flume170/bin/flume-ng agent -c . -f /usr/local/flume170/conf/Load_balancing_Sink_Processors.conf -n a1 -Dflume.root.logger=INFO,console

然后在H32或H33的任意一臺(tái)機(jī)器上扎拣,測(cè)試產(chǎn)生log赴肚,一行一行輸入素跺,輸入太快,容易落到一臺(tái)機(jī)器上

echo "idoall.org test1" | nc H32 5140

echo "idoall.org test2" | nc H32 5140

echo "idoall.org test3" | nc H32 5140

echo "idoall.org test4" | nc H32 5140

在H32的sink窗口誉券,可以看到以下信息
1. 14/08/10 15:35:29 INFO sink.LoggerSink: Event: { headers:{Severity=0, flume.syslog.status=Invalid, Facility=0} body: 69 64 6F 61 6C 6C 2E 6F 72 67 20 74 65 73 74 32 idoall.org test2 }
2. 14/08/10 15:35:33 INFO sink.LoggerSink: Event: { headers:{Severity=0, flume.syslog.status=Invalid, Facility=0} body: 69 64 6F 61 6C 6C 2E 6F 72 67 20 74 65 73 74 34 idoall.org test4 }

在H33的sink窗口指厌,可以看到以下信息:
1. 14/08/10 15:35:27 INFO sink.LoggerSink: Event: { headers:{Severity=0, flume.syslog.status=Invalid, Facility=0} body: 69 64 6F 61 6C 6C 2E 6F 72 67 20 74 65 73 74 31 idoall.org test1 }
2. 14/08/10 15:35:29 INFO sink.LoggerSink: Event: { headers:{Severity=0, flume.syslog.status=Invalid, Facility=0} body: 69 64 6F 61 6C 6C 2E 6F 72 67 20 74 65 73 74 33 idoall.org test3 }
說明輪詢模式起到了作用。

image
image

以上均是建立在H32和H33能互通踊跟,且Flume配置都正確的情況下運(yùn)行踩验,且都是非常簡單的場(chǎng)景應(yīng)用,值得注意的一點(diǎn)是Flume說是日志收集商玫,其實(shí)還可以廣泛的認(rèn)為“日志”可以當(dāng)作是信息流箕憾,不局限于認(rèn)知的日志。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末拳昌,一起剝皮案震驚了整個(gè)濱河市袭异,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌地回,老刑警劉巖扁远,帶你破解...
    沈念sama閱讀 212,542評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件俊鱼,死亡現(xiàn)場(chǎng)離奇詭異刻像,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)并闲,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,596評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門细睡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人帝火,你說我怎么就攤上這事溜徙。” “怎么了犀填?”我有些...
    開封第一講書人閱讀 158,021評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵蠢壹,是天一觀的道長。 經(jīng)常有香客問我九巡,道長图贸,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,682評(píng)論 1 284
  • 正文 為了忘掉前任冕广,我火速辦了婚禮疏日,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘撒汉。我一直安慰自己沟优,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,792評(píng)論 6 386
  • 文/花漫 我一把揭開白布睬辐。 她就那樣靜靜地躺著挠阁,像睡著了一般宾肺。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上鹃唯,一...
    開封第一講書人閱讀 49,985評(píng)論 1 291
  • 那天爱榕,我揣著相機(jī)與錄音,去河邊找鬼坡慌。 笑死黔酥,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的洪橘。 我是一名探鬼主播擂错,決...
    沈念sama閱讀 39,107評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼儡首!你這毒婦竟也來了蔑鹦?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,845評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤弟晚,失蹤者是張志新(化名)和其女友劉穎忘衍,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體卿城,經(jīng)...
    沈念sama閱讀 44,299評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡枚钓,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,612評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了瑟押。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片搀捷。...
    茶點(diǎn)故事閱讀 38,747評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖多望,靈堂內(nèi)的尸體忽然破棺而出嫩舟,到底是詐尸還是另有隱情,我是刑警寧澤怀偷,帶...
    沈念sama閱讀 34,441評(píng)論 4 333
  • 正文 年R本政府宣布家厌,位于F島的核電站,受9級(jí)特大地震影響椎工,放射性物質(zhì)發(fā)生泄漏饭于。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,072評(píng)論 3 317
  • 文/蒙蒙 一晋渺、第九天 我趴在偏房一處隱蔽的房頂上張望镰绎。 院中可真熱鬧,春花似錦木西、人聲如沸畴栖。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,828評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽吗讶。三九已至燎猛,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間照皆,已是汗流浹背重绷。 一陣腳步聲響...
    開封第一講書人閱讀 32,069評(píng)論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留膜毁,地道東北人昭卓。 一個(gè)月前我還...
    沈念sama閱讀 46,545評(píng)論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像瘟滨,于是被迫代替她去往敵國和親候醒。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,658評(píng)論 2 350

推薦閱讀更多精彩內(nèi)容

  • 這里主要介紹幾種常見的日志的source來源杂瘸,包括監(jiān)控文件型倒淫,監(jiān)控文件內(nèi)容增量,TCP和HTTP败玉。 Spool類型...
    歡醉閱讀 1,386評(píng)論 0 10
  • Flume的官網(wǎng)地址:http://flume.apache.org/FlumeUserGuide.html#ex...
    24格的世界閱讀 902評(píng)論 0 1
  • Flume的功能和架構(gòu)特點(diǎn) ** 功能 **flume 是一個(gè)分布式的敌土,可靠的,可用的运翼,可以非常有效率的對(duì)大數(shù)據(jù)的...
    心_的方向閱讀 2,512評(píng)論 1 10
  • 常用的source1.1 nettcat1.2 Avro Source1.3 Exec Source1.4 spo...
    水他閱讀 1,742評(píng)論 0 50
  • 迭代是訪問集合元素的一種方式返干。迭代器是一個(gè)可以記住遍歷的位置的對(duì)象。迭代器對(duì)象從集合的第一個(gè)元素開始訪問南蹂,直到所有...
    流光汐舞閱讀 199評(píng)論 0 0