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

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