1)采集目录到 HDFS

采集需求:服务器的某特定目录下,会不断产生新的文件,每当有新文件出现, 就需要把文件采集到 HDFS 中去 根据需求,首先定义以下 3 大要素 采集源,即 source——监控文件目录 : spooldir 下沉目标,即 sink——HDFS 文件系统 : hdfs sink source 和 sink 之间的传递通道——channel,可用 file channel 也可以用内存 channel 配置文件编写:

a1.sources.r1.type = spooldir 
a1.sources.r1.spoolDir = /root/logs 
a1.sources.r1.fileHeader = true 
 
# Describe the sink 
a1.sinks.k1.type = hdfs 
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 = 20 
a1.sinks.k1.hdfs.rollCount = 5 
a1.sinks.k1.hdfs.batchSize = 1 
a1.sinks.k1.hdfs.useLocalTimeStamp = true 
#生成的文件类型,默认是 Sequencefile,可用 DataStream,则为普通文本 
a1.sinks.k1.hdfs.fileType = DataStream 
 
# Use a channel which buffers events in memory 
a1.channels.c1.type = memory 
a1.channels.c1.capacity = 1000 
a1.channels.c1.transactionCapacity = 100 
 
# Bind the source and sink to the channel 
a1.sources.r1.channels = c1 
a1.sinks.k1.channel = c1


roll控制写入hdfs文件 以何种方式进行滚动 a1.sinks.k1.hdfs.rollInterval = 3 以时间间隔 a1.sinks.k1.hdfs.rollSize = 20 以文件大小 a1.sinks.k1.hdfs.rollCount = 5 以event个数 如果三个都配置 谁先满足谁触发滚动 如果不想以某种属性滚动 设置为0即可

是否开启时间上的舍弃 控制文件夹以多少时间间隔滚动 以下述为例:就会每10分钟生成一个文件夹 a1.sinks.k1.hdfs.round = true a1.sinks.k1.hdfs.roundValue = 10 a1.sinks.k1.hdfs.roundUnit = minute

Channel 参数解释: capacity:默认该通道中最大的可以存储的 event 数量 trasactionCapacity:每次最大可以从 source 中拿到或者送到 sink 中的 event数量

启动命令:bin/flume-ng agent -c ./conf -f ./conf/spool-hdfs.conf -n a1 -Dflume.root.logger=INFO,console

测试: 往/root/logs2放文件,但是不要在里面生成文件

  • 注意其监控的文件夹下面不能有同名文件的产生
  • 如果有 报错且罢工 后续就不再进行数据的监视采集了
  • 在企业中通常给文件追加时间戳命名的方式保证文件不会重名

2)采集文件到 HDFS

采集需求:比如业务系统使用 log4j 生成的日志,日志内容不断增加,需要把追加到日志文件中的数据实时采集到 hdfs

根据需求,首先定义以下 3 大要素 采集源,即 source——监控文件内容更新 : exec ‘tail -F file’ 下沉目标,即 sink——HDFS 文件系统 : hdfs sink Source 和 sink 之间的传递通道——channel,可用 file channel 也可以用 内存 channel

配置文件编写:

# 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.sources.r1.command = tail -F /root/logs/test.log 
a1.sources.r1.channels = c1 
 
# Describe the sink 
a1.sinks.k1.type = hdfs 
a1.sinks.k1.hdfs.path = /flume/tailout/%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 = 20 
a1.sinks.k1.hdfs.rollCount = 5 
a1.sinks.k1.hdfs.batchSize = 1 
a1.sinks.k1.hdfs.useLocalTimeStamp = true 
#生成的文件类型,默认是 Sequencefile,可用 DataStream,则为普通文本 
a1.sinks.k1.hdfs.fileType = DataStream 
# Use a channel which buffers events in memory 
a1.channels.c1.type = memory 
a1.channels.c1.capacity = 1000 
a1.channels.c1.transactionCapacity = 100 
 
# Bind the source and sink to the channel 
a1.sources.r1.channels = c1 
a1.sinks.k1.channel = c1


启动命令:bin/flume-ng agent -c conf -f conf/tail-hdfs.conf -n a1 -Dflume.root.logger=INFO,console

使用该脚本模拟数据实时变化的过程:while true; do date >> /root/logs/test.log;done exec source 可以执行指定的linux command 把命令的结果作为数据进行收集

3)参数解析

rollInterval 默认值:30 hdfs sink 间隔多长将临时文件滚动成最终目标文件,单位:秒; 如果设置成 0,则表示不根据时间来滚动文件; 注:滚动(roll)指的是,hdfs sink 将临时文件重命名成最终目标文 件,并新打开一个临时文件来写入数据; rollSize 默认值:1024 当临时文件达到该大小(单位:bytes)时,滚动成目标文件; 如果设置成 0,则表示不根据临时文件大小来滚动文件; rollCount 默认值:10 当 events 数据达到该数量时候,将临时文件滚动成目标文件; 如果设置成 0,则表示不根据 events 数据来滚动文件; round 默认值:false 是否启用时间上的“舍弃”,这里的“舍弃”,类似于“四舍五入”。 roundValue 默认值:1 时间上进行“舍弃”的值;

roundUnit 默认值:seconds 时间上进行“舍弃”的单位,包含:second,minute,hour 示例: a1.sinks.k1.hdfs.path = /flume/events/%y-%m-%d/%H%M/%S a1.sinks.k1.hdfs.round = true a1.sinks.k1.hdfs.roundValue = 10 a1.sinks.k1.hdfs.roundUnit = minute 当时间为 2015-10-16 17:38:59 时候,hdfs.path 依然会被解析为: /flume/events/20151016/17:30/00 因为设置的是舍弃 10 分钟内的时间,因此,该目录每 10 分钟新生成一个。