Flume小結

Web/Application Server(Nginx)========>HDFS
collect
日誌類型:access日誌:訪問、請求、客戶端、agent信息,與業務無關的;
ugc日誌:業務相關日誌;

collect方法:
1. 只要這臺機器有GATEWAY,通過 hdfs dfs -put 傳上去,通過 crontab 封裝一下,定時去發送
缺點:這樣的數據傳遞具有延時性;
採用壓縮方式會比較麻煩;
提交log的機器是客戶機器,不可能有GATEWAY

2. Flume 大規模數據採集框架 
collecting, aggregating, and moving large amounts of log data 
  收集        聚合               移動
  源端	      臨時存儲          目標端去
 Source      Channel            Sink
	from many different sources to a centralized data store
	Flume在採集的過程中可以幹很多事情:壓縮、容錯、監控
	Flume可以將(日誌)
3. Stream流處理:
	Flume==>Kafka==>Streaming系統
		Kafka作爲一個緩衝區
		Flume和Streaming之間需要一個消息隊列
		和Flume功能相近的框架還有ElasticSearch棧的logstash以及FileBeat,
						這兩個相對於Flume來說更加輕量級

	Flume==>Streaming 是可以的。數據量少是可以的,但是數據量大了以後,
					   直接從Flume到Steaming端,數據來不及處理
					   會產生數據的積壓,甚至把Streaming端幹爆掉。
					   生產太多,消費不及時

學習Flume就是查字典

Agent 可以看做是Flume的配置文件
Source:
Avro Source:定義端口來接收客戶端信息
Avro是一個序列化的框架
Thrift Source:序列化框架

Exec Source:命令行

Spooling Directory:監控目錄的

Taildir Source:

Channels:緩存在哪裏
Memory Channel:
JDBC Channel:
File Channel:

Sinks:
HDFS Sink
Hive Sink
Logger Sink 寫到控制檯
HBase Sink
Kafka Sink

例1. 從網絡指定端口上收集數據,下沉到控制檯

1. 對Agent技術選型
	NetCat Source :監聽一個指定的端口,把text的每一行當做一個事件發出來
	Memory Channel :因爲數據量不大
	Logger Sink:輸出到控制檯
   *****用Flume的關鍵點是 編寫Flume配置文件
2. 對Agent起名;對Source/Channel/Sink起名
	a1.sources = exec-source
	a1.sinks = hdfs-sink
	a1.channels = memory-channel
3. 配置Source
	a1.sources.exec-source.type=netcat
	a1.sources.exec-source.bind=hadoop001	綁定的HostName或者IP
	a1.sources.exec-source.port=44444
4. 配置Channel
	a1.channels.memory-channel.type=memory
5. 配置Sink
	a1.sinks.hdfs-sink.type=logger
6. 配置Source、Sink關聯的Channel
	a1.sources.exec-source.channels=memory-channel
	a1.sinks.hdfs-sink.channel=memory-channel

配置conf
a1.sources = exec-source
a1.sinks = hdfs-sink
a1.channels = memory-channel

a1.sources.exec-source.type=netcat
a1.sources.exec-source.bind=hadoop001
a1.sources.exec-source.port=44444

a1.channels.memory-channel.type=memory

a1.sinks.hdfs-sink.type=logger
a1.sources.exec-source.channels=memory-channel
a1.sinks.hdfs-sink.channel=memory-channel

使用:
flume-ng agent -n a1
-c $FLUME_HOME/conf
-f $FLUME_HOME/conf/flume-simple.conf
-Dflume.root.log nger=INFO,console
Event:是Flume數據傳輸的基本單元
headers + body

例2. WebServer -->Flume–>HDFS
log tail-F
採用 ExecSource 運行一個linux命令
MemoryChannel
HDFS Sink

exec-hdfs-agent.sources = exec-source
exec-hdfs-agent.sinks = hdfs-sink
exec-hdfs-agent.channels = memory-channel

exec-hdfs-agent.sources.exec-source.type=exec
exec-hdfs-agent.sources.exec-source.command=tail -F /home/hadoop/data/g6/data.log
exec-hdfs-agent.sources.exec-source.shell=/bin/sh -c

exec-hdfs-agent.channels.memory-channel.type=memory

exec-hdfs-agent.sinks.hdfs-sink.type=hdfs
exec-hdfs-agent.sinks.hdfs-sink.hdfs.path=hdfs://hadoop001:9000/g6flume/tail
exec-hdfs-agent.sinks.hdfs-sink.hdfs.fileType=DataStream
exec-hdfs-agent.sinks.hdfs-sink.hdfs.writeFormat=Text

exec-hdfs-agent.sources.exec-source.channels=memory-channel
exec-hdfs-agent.sinks.hdfs-sink.channel=memory-channel

flume-ng agent -n exec-hdfs-agent  \
-c $FLUME_HOME/conf \
-f $FLUME_HOME/conf/flume-exec-hdfs.conf \
-Dflume.root.log nger=INFO,console

這種用execSource 直接tail -F 寫入HDFS的方式容易產生小文件,所以生產上不宜使用
而且這種方式監控的是一個文件
例3. 監控文件夾 用 ExecSource 監控指定文件夾中的文件,

exec-hdfs-agent.sources = exec-source
exec-hdfs-agent.sinks = hdfs-sink
exec-hdfs-agent.channels = memory-channel

exec-hdfs-agent.sources.exec-source.type=spooldir
exec-hdfs-agent.sources.exec-source.command=/home/hadoop/data/g6/spooldir

exec-hdfs-agent.channels.memory-channel.type=memory

exec-hdfs-agent.sinks.hdfs-sink.type=hdfs

打開時間戳,並將寫入的文件按分鐘分區(沒有的是空的)

exec-hdfs-agent.sinks.hdfs-sink.hdfs.path=hdfs://hadoop001:9000/g6flume/logs/%Y%m%d%H%M
exec-hdfs-agent.sinks.hdfs-sink.hdfs.useLocalTimeStamp=true
exec-hdfs-agent.sinks.hdfs-sink.filePrefix=access
exec-hdfs-agent.sinks.hdfs-sink.hdfs.fileType=CompressedStream
exec-hdfs-agent.sinks.hdfs-sink.hdfs.writeFormat=Text

設置HDFS,避免小文件的產生

exec-hdfs-agent.sinks.hdfs-sink.hdfs.rollInterval=30
exec-hdfs-agent.sinks.hdfs-sink.hdfs.rooSize=1000000
exec-hdfs-agent.sinks.hdfs-sink.hdfs.rollCount=0

採用gzip壓縮

exec-hdfs-agent.sinks.hdfs-sink.hdfs.codeC=gzip

exec-hdfs-agent.sources.exec-source.channels=memory-channel
exec-hdfs-agent.sinks.hdfs-sink.channel=memory-channel

flume-ng agent -n exec-hdfs-agent  \
-c $FLUME_HOME/conf \
-f $FLUME_HOME/conf/flume-exec-hdfs.conf \
-Dflume.root.log nger=INFO,console

例4. Taildir Source Apache1.7纔有 但是cdh1.6就有
ExecSource 只能tail -F 一個文件
SpoolSource雖然能監控一個文件夾下的文件,
但是不能監控到指定文件夾下的文件夾中的文件,而且掛掉了沒法處理
所以需要Taildir Source,這纔是生產上需要的

Taildir source 是可靠的,不會丟失數據。即使tail掛掉了。因爲他會週期性的寫文件
的偏移量,然後將position寫到JSON文件裏。即使掛掉了,也可以根據JSON文件
從掛掉的點開始讀

a1.sources = r1
a1.channels = c1
a1.sources.r1.type = TAILDIR
a1.sources.r1.channels = c1
a1.sources.r1.positionFile = /var/log/flume/taildir_position.json
#以空格分隔文件組列表,每個文件組表示要跟蹤的一組文件
a1.sources.r1.filegroups = f1 f2
a1.sources.r1.filegroups.f1 = /var/log/test1/example.log
a1.sources.r1.headers.f1.headerKey1 = value1
a1.sources.r1.filegroups.f2 = /var/log/test2/.log.
a1.sources.r1.headers.f2.headerKey1 = value2
a1.sources.r1.headers.f2.headerKey2 = value2-2
a1.sources.r1.fileHeader = true
a1.sources.ri.maxBatchCount = 1000

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章