简单介绍 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组合代理分发读者可通过自行百度了解。