WebServer/ApplicationServer分散在各個機器上,然而咱們依舊想在Hadoop平臺上進行統計分析,如何將日誌收集到Hadoop平臺呢?html
shell cp hadoop集羣的機器上;
hadoop fs -put ... /複製代碼
顯然該法面臨着容錯、負載均衡、高延遲、數據壓縮等一系列問題這顯然已經沒法知足需求了!java
不如問問神奇的Flume呢???node
只須要配置文件,輕鬆解決以上問題!web
其餘的還有好比:shell
順便來看看官方文檔apache
指定數據源(Avro, Thrift, Spooling, Kafka, Exec)服務器
把數據暫存(Memory, File, Kafka等用的比較多)網絡
把數據寫至某處(HDFS, Hive, Logger, Avro, Thrift, File, ES, HBase, Kafka等)架構
爲了跨多個代理或跳數據流,先前代理的接收器和當前跳的源須要是avro類型,接收器指向源的主機名(或IP地址)和端口。負載均衡
日誌收集中很是常見的狀況是大量日誌生成客戶端將數據發送到鏈接到存儲子系統的少數消費者代理。 例如,從數百個Web服務器收集的日誌發送給寫入HDFS集羣的十幾個代理。這能夠經過使用avro接收器配置多個第一層代理在Flume中實現,全部這些代理都指向單個代理的avro源(一樣,您能夠在這種狀況下使用thrift源/接收器/客戶端)。 第二層代理上的此源將接收的事件合併到單個信道中,該信道由信宿器消耗到其最終目的地。
Flume支持將事件流多路複用到一個或多個目的地。 這是經過定義能夠複製或選擇性地將事件路由到一個或多個信道的流複用器來實現的。上面的例子顯示了來自代理「foo」的源代碼將流程擴展到三個不一樣的通道。 扇出能夠複製或多路複用。 在複製流的狀況下,每一個事件被髮送到全部三個通道。 對於多路複用狀況,當事件的屬性與預配置的值匹配時,事件將被傳遞到可用通道的子集。 例如,若是一個名爲「txnType」的事件屬性設置爲「customer」,那麼它應該轉到channel1和channel3,若是它是「vendor」,那麼它應該轉到channel2,不然轉到channel3。 能夠在代理的配置文件中設置映射。
export FLUME_VERSION=1.9.0
export FLUME_HOME=/usr/local/Cellar/flume/1.9.0/libexec
export FLUME_CONF_DIR=$FLUME_HOME/conf
export PATH=$FLUME_HOME/bin:$PATH複製代碼
安裝成功
看看官網的第一個案例
# example.conf: A single-node Flume configuration
# Name the components on this agent
a1.sources = r1
a1.sinks = k1
a1.channels = c1
# Describe/configure the source
a1.sources.r1.type = netcat
a1.sources.r1.bind = localhost
a1.sources.r1.port = 44444
# Describe the sink
a1.sinks.k1.type = logger
# Use a channel which buffers events in memory
a1.channels.c1.type = memory
a1.channels.c1.capacity = 1000
a1.channels.c1.transactionCapacity = 100
# Bind the source and sink to the channel
a1.sources.r1.channels = c1
a1.sinks.k1.channel = c1複製代碼
a1:agent名稱r1:Source名稱k1:Sink名稱c1:Channel名稱
看看其中的
相似於netcat的源,它偵聽給定端口並將每行文本轉換爲事件。 像nc -k -l [host] [port]這樣的行爲。 換句話說,它打開一個指定的端口並偵聽數據。 指望是提供的數據是換行符分隔的文本。 每行文本都轉換爲Flume事件,並經過鏈接的通道發送。
必需屬性以粗體顯示。
在INFO級別記錄事件。 一般用於測試/調試目的。 必需屬性以粗體顯示。 此接收器是惟一的例外,它不須要在「記錄原始數據」部分中說明的額外配置。
事件存儲在具備可配置最大大小的內存中隊列中。 它很是適用於須要更高吞吐量的流量,而且在代理髮生故障時準備丟失分階段數據。 必需屬性以粗體顯示。
在conf目錄下
使用名爲flume-ng
的shell腳本啓動代理程序,該腳本位於Flume發行版的bin目錄中。 您須要在命令行上指定代理名稱,config目錄和配置文件:
bin/flume-ng agent -n $agent_name -c conf -f conf/flume-conf.properties.template複製代碼
bin/flume-ng agent \
--name a1 \
--conf $FLUME_HOME/conf \
--conf-file $FLUME_HOME/conf/example.conf \
-Dflume.root.logger=INFO,console複製代碼
如今,代理將開始運行在給定屬性文件中配置的源和接收器。
telnet 127.0.0.1 44444複製代碼
2019-06-12 17:52:39,711 (SinkRunner-PollingRunner-DefaultSinkProcessor)
[INFO - org.apache.flume.sink.LoggerSink.process(LoggerSink.java:95)]
Event: { headers:{} body: 4A 61 76 61 45 64 67 65 0D JavaEdge. }複製代碼
其中的Event是Fluem數據傳輸的基本單元Event = 可選的header + byte array
Exec源在啓動時運行給定的Unix命令,並指望該進程在標準輸出上連續生成數據(stderr被簡單地丟棄,除非屬性logStdErr設置爲true)。 若是進程因任何緣由退出,則源也會退出而且不會生成其餘數據。 這意味着諸如cat [named pipe]或tail -F [file]之類的配置將產生所需的結果,而日期可能不會 - 前兩個命令產生數據流,然後者產生單個事件並退出
exec source + memory channel + logger sink
# example.conf: A single-node Flume configuration
# Name the components on this agent
a1.sources = r1
a1.sinks = k1
a1.channels = c1
# Describe/configure the source
a1.sources.r1.type = exec
a1.sources.r1.command = tail -F /Volumes/doc/data/data.log
a1.sources.r1.shell = /bin/sh -c
# Describe the sink
a1.sinks.k1.type = logger
# Use a channel which buffers events in memory
a1.channels.c1.type = memory
a1.channels.c1.capacity = 1000
a1.channels.c1.transactionCapacity = 100
# Bind the source and sink to the channel
a1.sources.r1.channels = c1
a1.sinks.k1.channel = c1複製代碼
在conf下新建配置文件以下:
exec s + memory c + avro savro s + memory c + loger s
exec-memory-avro.conf
# Name the components on this agent
exec-memory-avro.sources = exec-source
exec-memory-avro.sinks = avro-sink
exec-memory-avro.channels = memory-channel
# Describe/configure the source
exec-memory-avro.sources.exec-source.type = exec
exec-memory-avro.sources.exec-source.command = tail -F /Volumes/doc/data/data.log
exec-memory-avro.sources.exec-source.shell = /bin/sh -c
# Describe the sink
exec-memory-avro.sinks.avro-sink.type = avro
exec-memory-avro.sinks.avro-sink.hostname = localhost
exec-memory-avro.sinks.avro-sink.port = 44444
# Use a channel which buffers events in memory
exec-memory-avro.channels.memory-channel.type = memory
exec-memory-avro.channels.memory-channel.capacity = 1000
exec-memory-avro.channels.memory-channel.transactionCapacity = 100
# Bind the source and sink to the channel
exec-memory-avro.sources.exec-source.channels = memory-channel
exec-memory-avro.sinks.avro-sink.channel = memory-channel複製代碼
# Name the components on this agent
exec-memory-avro.sources = exec-source
exec-memory-avro.sinks = avro-sink
exec-memory-avro.channels = memory-channel
# Describe/configure the source
exec-memory-avro.sources.exec-source.type = exec
exec-memory-avro.sources.exec-source.command = tail -F /Volumes/doc/data/data.log
exec-memory-avro.sources.exec-source.shell = /bin/sh -c
# Describe the sink
exec-memory-avro.sinks.avro-sink.type = avro
exec-memory-avro.sinks.avro-sink.hostname = localhost
exec-memory-avro.sinks.avro-sink.port = 44444
# Use a channel which buffers events in memory
exec-memory-avro.channels.memory-channel.type = memory
exec-memory-avro.channels.memory-channel.capacity = 1000
exec-memory-avro.channels.memory-channel.transactionCapacity = 100
# Bind the source and sink to the channel
exec-memory-avro.sources.exec-source.channels = memory-channel
exec-memory-avro.sinks.avro-sink.channel = memory-channel複製代碼
https://tech.meituan.com/2013/12/09/meituan-flume-log-system-architecture-and-design.html