-
简单介绍
flume是一个高可用的,高可靠的,分布式的海量日志采集、聚合、传输系统。
可以采集文件、socket数据包等多种形式源数据,又可以将采集到的数据输出到HDFS、kafka、hive、hbase等存储系统中。
flume是属于生产者和消费者模式,目前不支持高可用,需要编写相应的脚本来监听,当agent挂掉时,脚本自动启动agent。agent会记录上一次的收集位置。 -
运行机制
核心角色是agent,一个agent包含source、channel、sink三个组件。
source:采集源,用于和数据源对接,获取数据
channel:数据传输通道
sink:采集数据的传送目的
flume的传输过程:
source监控某个文件或数据流,数据源产生数据,拿到该数据后,将数据封装成一个event,并put到channel后commit提交,channel队列是FIFO,sink去队列中拉取数据,然后写出去。 -
source、channel、sink的类型
这里每个组件的类型,我们不会详细的一一介绍,只介绍一些常用的。剩余的,读者可自行百度。
source类型:
- [ ] exec:监控文件内容变化
- [ ] netcat:监控端口变化
- [ ] spooldir:监控目录下文件变化
- [ ] avro:rpc协议下的传输格式
channel类型:
- [ ] memory:把事件存储在一个内存队列中
- [ ] file:把时间存储在一个本地系统上
- [ ] jdbc:将事件存储在数据库中
sink类型:
- [ ] avro:通过一个avro rpc发送事件到一个avro source中
- [ ] logger:使用slf4j记录info级别的时间
- [ ] thrift:通过thrift rpc发送事件到thrift source
- [ ] hbase:发送到hbase中
- [ ] hdfs:写到hdfs上 -
简单案例展示
<-----------------flume简单监听目录下文件变化展示--------------------->
//一个agent中包含的组件
a1.sources=r1
a1.channels=c1
a1.sinks=k1
//source的配置
a1.sources.r1.type=spooldir
a1.sources.r1.spoolDir=/tmp/test
//channel的配置
a1.channels.c1.type=memory
//sink的配置
//sinks的类型
a1.sinks.k1.type=hdfs
//sinks的hdfs上的路径以及分区策略(按照天数划分,一天生成一个文件夹)
a1.sinks.k1.hdfs.path=/tmp/flume/year=%Y/month=%m/day=%d
//sinks的文件前缀
a1.sinks.k1.hdfs.filePrefix=events
//sinks的文件后缀
a1.sinks.k1.hdfs.fileSuffix=.log
//sinks的文件格式
a1.sinks.k1.hdfs.fileType=DataStream
//sources的输出位置和sinks的数据拉取位置(因为一个sink只能去一个channel里拉取数据,所以是channel,而source可以将数据发送到多个channel中,所以是channels)
a1.sources.r1.channels=c1
a1.sinks.k1.channel=c1
- 补充知识
spooling directory source导入文件的方式是把文件按行拆分,并为每行创建一个flume事件。事件是由一个可选的header和一个二进制的body组成。文件被source重命名为.completed,表名flume已经完成文件的处理,不会再操作这个文件。
如果由于特殊原因导致channel到sink事件的传递过程中,使得事件无法记录,name事务会回滚,事件仍然保留在channel中,等待重新传送。
如果channel的类型是file,代理重新启动,事件也不会丢失,因为已经持久化到本地disk,
如果是memory,因为是在内存中,代理重新启动后,事件会丢失。
总的来说,source产生的每个事件都会到达sink,每个事件到达sink至少一个,也就是有可能重复到达,比如代理重启前部分事件或全部事件已被提交到channel中,代理重启后,spooling directory source还是会为所有未完成的时间重新传递事件。
代理分发,通过avro实现,将多个agent串起来,这样可以减轻hdfs上的压力,提高mr程序的效率。
sink组的概念,将多个sink当做一个sink来处理,以实现故障转移或负载均衡。sink组合代理分发读者可通过自行百度了解。