最近做的项目中用到了Flume,现学现卖,请多多指教。

Flume介绍

  Flume是一个分布式、可靠和高可用的海量日志采集、配合和传输的系统。Flume可以采集文件、socket数据包等各种形式源数据,又可以将采集到的数据输出到HDFS、HBASE、HIVE、kaflka等众多外部存储系统中。一般的采集需求,通过对Flume的简单配置即可实现。Flume针对特殊场景也具备良好的自定义扩展能力,因此,Flume可以适用于大部分的日常数据采集场景。
  事件(Event)是Flume的基本数据单元,Flume的数据由Event贯穿始终。它携带日志数据(字节数组形式)并且携带有头信息,这些Event由Agent外部的Source生成,当Source捕获事件后会进行特定的格式化,然后Source会把事件推入(单个或多个)Channel中。可以把Channel看作是一个缓冲区,它将保存事件直到Sink处理完该事件。Sink负责持久化日志或者把事件推向另一个Source。

配置文件

#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.source.r1.command=tail -F /home/hadoop/log/test.log
a1.source.r1.channels=c1

#Describe the sink
a1.sinks.k1.type=hdfs
a1.sinks.k1.channel=c1
a1.sinks.k1.hdfs.path=/flume/events/%y-%m-%d/%H%M/
a1.sinks.k1.hdfs.filePrefix=events-
a1.sinks.k1.hdfs.round=true
a1.sinks.k1.hdfs.roundValue=10
a1.sinks.k1.hdfs.roundUnit=minute
a1.sinks.k1.hdfs.rollInterval=3//文件滚动周期(秒)
a1.sinks.k1.hdfs.rollSize=500//文件滚动的大小限制(bytes)
a1.sinks.k1.hdfs.rollCount=20//写入多少个event数据后滚动文件(事件个数)
a1.sinks.k1.hdfs.batchSize=1
a1.sinks.k1.hdfs.useLocalTimeStamp=true
a1.sinks.k1.hdfs.fileType=DataStream//生成的文件类型,默认是Sequencefile,可用DataStream,则为普通文本

#Use a channel which buffers events in memory
a1.channels.c1.type=memory
a1.channels.c1.capacity=1000
a1.channels.c1.transactionCapacity=100

Channel参数中的capacity是默认该通道中最大的可以存储的event数量。transactionCapacity是每次可以从source中拿到或者送到sink中的event数量。keep-alive是event添加到通道中或者移出的允许时间。

$ bin/flume-ng agent -c conf -f conf/tail-hdfs.conf -n a1  //启动命令
$ bin/flume-ng agent -c ./conf -f ./conf/spool-logger.conf -n a1 -Dflume.root.logger=INFO,console  //监视文件夹,启动命令

运行机制

  Flume分布式系统中最核心的角色是agent。Flume采集系统是由一个个agent所连接起来形成的。每一个agent相当于一个数据传递员,内部有三个组件:
  1)Source:采集源,用于跟数据源对接,以获取数据
  2)Sink:下沉地,采集数据的传送目的,用于往下一级agent传递数据或者往最终存储系统传递数据
  3)Channel:agent内部的数据传输通道,用于从source将数据传递到sink
  Channel可以用于内存缓存也可以用于文件缓存。Source有一个统一的抽象父类,Sink也有一个统一的抽象父类。下面应该有各种各样的实现类。比如:对接kaflka,有一个对接kaflka的实现类。对接socket源,有一个对接socket源的实现类。根据源的类型选择一个实现实现类,配置在配置文件中。
  Flume 使用事务性的方式保证传送Event整个过程的可靠性。 Sink 必须在Event 被存入 Channel 后,或者已经被传达到下一站agent里,又或者已经被存入外部数据目的地之后,才能把 Event 从 Channel 中 remove 掉。这样数据流里的 event 无论是在一个 agent 里还是多个 agent 之间流转,都能保证可靠。 Flume支持在本地保存一份文件 channel 作为备份,而memory channel 将event存在内存 queue 里,速度快,但丢失的话无法恢复。

多级Agent串联

Flume解析
Flume解析

相关文章: