flume三种方式收集日志的案例

exec

监测某个单一的文件

# user_action_log_src 这个名字可以任意取
agent1.sources = user_action_log_src
# memoryChannel 也是随便取的
agent1.channels = memoryChannel
# hdfs_sink 发送到hdfs的
agent1.sinks = hdfs_sink

# For each one of the sources, the type is defined
# exec 方式来收集
agent1.sources.user_action_log_src.type = exec
# tail -fn0  通过查看最后一行来获取日志
agent1.sources.user_action_log_src.command = tail -fn0 /home/hadoop-jrq/dw-course/streaming-etl/logs/user-action.log

# 可以指定用什么样的shell来执行命令脚
#agent1.sources.user_action_log_src.shell = /bin/bash -c
#agent1.sources.user_action_log_src.command = for i in /path/*.txt; do cat $i; done
# 表示当cmd挂掉的时候,是否需要重启cmd, 默认是false
# 就是当 tail -fn0 挂掉的时候,需不需要重启
agent1.sources.user_action_log_src.restart = true
# 重启之前需要等待的时间长度,默认是10000毫秒  等待是因为等错误消失
agent1.sources.user_action_log_src.restartThrottle = 10000
# 表示一次性批量的将多少条event发送channel, 默认是20条,一条条发,性能会差
agent1.sources.user_action_log_src.batchSize = 20
# 如果等待了3000毫秒,还没有达到上面配置的batchSize,则将所有的event发往channel
agent1.sources.user_action_log_src.batchTimeout = 3000

# 给user_action_log_src这个source指定channel  memoryChannel 和上面的agent1.channels = memoryChannel一致
agent1.sources.user_action_log_src.channels = memoryChannel

# Each sink's type must be defined
# hdfs 数据保存到hdfs中去
agent1.sinks.hdfs_sink.type = hdfs
# 保存到hdfs的目录
agent1.sinks.hdfs_sink.hdfs.path = hdfs://mycluster/user/hadoop-jrq/dw-course/user-action-allfile/%y-%m-%d/%H%M/%S
# 上面匹配时间的话,需要打开这个开关,这个配置默认是false
agent1.sinks.hdfs_sink.hdfs.useLocalTimeStamp = true
# For example, an event with timestamp 11:54:34 AM, June 12, 2012 will cause
# the hdfs path to become /flume/events/2012-06-12/1150/00.
# 下面三个参数的含义: 11.54的数据写到11.50中去,意思就是在这10分钟之类的数据都放到10的倍数文件中去
agent1.sinks.hdfs_sink.hdfs.round = true
agent1.sinks.hdfs_sink.hdfs.roundValue = 10
agent1.sinks.hdfs_sink.hdfs.roundUnit = minute
# 表示文件名的前缀,默认为FlumeData  events就是文件的前缀
agent1.sinks.hdfs_sink.hdfs.filePrefix = events
# 表示文件名的后缀,默认没有后缀  .txt是自定义的文件后缀名
agent1.sinks.hdfs_sink.hdfs.fileSuffix = .txt

# 下面的参数都是为了把大文件合并成小文件
# 数据先写到临时文件,然后在合并成大文件

# 表示写临时文件的文件名的前缀,默认没有值  
agent1.sinks.hdfs_sink.hdfs.inUsePrefix = events-tmp
# 表示写临时文件的文件名的后缀,默认就是.tmp
agent1.sinks.hdfs_sink.hdfs.inUseSuffix = .tmp

# 表示数据每次flush到hdfs的event数,默认就是100   到100条的时候才会写到文件中去
agent1.sinks.hdfs_sink.hdfs.batchSize = 100

# 利用下面的规则,合并成大文件
# 下面的条件达到一条就写最终的文件,实际中根据实际的数据量(频率)来决定
# 表示达到了30秒就将临时文件合并成最终文件,默认就是30秒,如果是0的话则表示不按照时间的多少来合并临时文件  如果是0不管多少,都不会把临时文件合并成最终的文件
agent1.sinks.hdfs_sink.hdfs.rollInterval = 30
# 表示文件的大小达到了1024 bytes,则将临时文件合并成最终文件,默认就是1024字节,如0则表示不按照文件大小合并 如果是0不管多少,都不会把临时文件合并成最终的文件
agent1.sinks.hdfs_sink.hdfs.rollSize =1024
# 表示写入event的数量达到10条的话,则将临时文件合并成最终文件,默认就是10条,如0则表示不按照event条数合并
agent1.sinks.hdfs_sink.hdfs.rollCount =10
# 如果临时文件在这个时间内没有写数据的话,则将这个文件关闭掉,默认等于0,表示不关闭闲文件  比如10  10S没有数据,就关闭临时文件,写成最终文件
agent1.sinks.hdfs_sink.hdfs.idleTimeout = 0


# flume写文件只支持,文本和二进制文件,如下
# DataStream表示没有压缩的text文件,默认是SequenceFile,还有CompressedStream表示压缩的文本文件,需要设置hdfs.codeC 
agent1.sinks.hdfs_sink.hdfs.fileType = DataStream
# 如果是压缩的,就需要设置压缩的算法
# agent1.sinks.hdfs_sink.hdfs.codeC = snappy
# 可以为:gzip, bzip2, lzo, lzop

# 给hdfs_sink这个sink指定channel
agent1.sinks.hdfs_sink.channel = memoryChannel

# 定义channel
agent1.channels.memoryChannel.type = memory
#  这个内存channel中最多能存储的event的数量为100,默认为100
agent1.channels.memoryChannel.capacity = 100

spooldir

监测一个目录

# 检测指定的目录的新文件,将新文件数据直接导入到hdfs里去

agent1.sources = spooldir_src
agent1.channels = memoryChannel
agent1.sinks = hdfs_sink

# For each one of the sources, the type is defined
agent1.sources.spooldir_src.type = spooldir
# 在这个下面会有一个.flumespool 里面是flume存储的元数据信息,这样在flume挂掉的时候,启动的时候就会去读元数据信息,就不会丢失数据了
# 有新文件,就会把这个新文件读出来,放到hdfs中去
agent1.sources.spooldir_src.spoolDir = /home/hadoop-jrq/dw-course/streaming-etl/logs/minute/bak
# 开启这个就会为每个事件增加一个文件的全路径名,这是值
agent1.sources.spooldir_src.fileHeader = true
# 这是key,可以随便写
agent1.sources.spooldir_src.fileHeaderKey = file
agent1.sources.spooldir_src.basenameHeader = true
agent1.sources.spooldir_src.basenameHeaderKey  = basename

# The channel can be defined as follows.
agent1.sources.spooldir_src.channels = memoryChannel

# Each sink's type must be defined
agent1.sinks.hdfs_sink.type = hdfs
agent1.sinks.hdfs_sink.hdfs.path = hdfs://mycluster/user/hadoop-jrq/dw-course/user-action-minute
agent1.sinks.hdfs_sink.hdfs.useLocalTimeStamp = true 
# 上面匹配时间的话,需要打开这个开关,这个配置默认是false

agent1.sinks.hdfs_sink.hdfs.round = true
agent1.sinks.hdfs_sink.hdfs.roundValue = 10
agent1.sinks.hdfs_sink.hdfs.roundUnit = minute
# For example, an event with timestamp 11:54:34 AM, June 12, 2012 will cause the hdfs path to become /flume/events/2012-06-12/1150/00.

agent1.sinks.hdfs_sink.hdfs.filePrefix = events 
# 表示文件名的前缀,默认为FlumeData

agent1.sinks.hdfs_sink.hdfs.fileSuffix = .txt 
# 表示文件名的后缀,默认没有后缀

agent1.sinks.hdfs_sink.hdfs.idleTimeout = 0 
# 如果临时文件在这个时间内没有写数据的话,则将这个文件关闭掉,默认等于0,表示不关闭闲文件

agent1.sinks.hdfs_sink.hdfs.batchSize = 100 
# 表示数据每次flush到hdfs的event数,默认就是100

agent1.sinks.hdfs_sink.hdfs.inUsePrefix = events-tmp 
# 表示写临时文件的文件名的前缀,默认没有值

agent1.sinks.hdfs_sink.hdfs.inUseSuffix = .tmp 
# 表示写临时文件的文件名的后缀,默认就是.tmp

agent1.sinks.hdfs_sink.hdfs.rollInterval =30 
# 表示达到了30秒就将临时文件合并成最终文件,默认就是30秒,如果是0的话则表示不按照时间的多少来合并临时文件

agent1.sinks.hdfs_sink.hdfs.rollSize =0 
# 表示文件的大小达到了1024 bytes,则将临时文件合并成最终文件,默认就是1024字节,如0则表示不按照文件大小合并

agent1.sinks.hdfs_sink.hdfs.rollCount =0 
# 表示写入event的数量达到10条的话,则将临时文件合并成最终文件,默认就是10条,如0则表示不按照文件大小合并

agent1.sinks.hdfs_sink.hdfs.fileType = DataStream  
# 表示没有压缩的text文件,默认是SequenceFile,还有CompressedStream表示压缩的文本文件,需要设置hdfs.codeC

# agent1.sinks.hdfs_sink.hdfs.codeC = snappy 
# 可以为:gzip, bzip2, lzo, lzop

#Specify the channel the sink should use
agent1.sinks.hdfs_sink.channel = memoryChannel

# Each channel's type is defined.
agent1.channels.memoryChannel.type = memory

# Other config values specific to each type of channel(sink or source)
# can be defined as well
# In this case, it specifies the capacity of the memory channel
agent1.channels.memoryChannel.capacity = 100

TAILDIR

监测多个文件目录下的文件

agent1.sources = taildir_src
agent1.channels = memoryChannel
agent1.sinks = hdfs_sink

# For each one of the sources, the type is defined
# TAILDIR 1.8.0才开始有的,之前的都是实验版本  和exec也是一样的实时收集,但是不一样的是这些目录下的文件全部实时的写,也是可以的
# 这个不会丢数据,因为他会实时的写哪个文件处理到了哪里到taildir_position.json文件中去,exec就不会,只会监听新的数据  
agent1.sources.taildir_src.type = TAILDIR

# json文件是放的flume的处理文件
# 这个文件需要在目录下创建好,主要是记录flume处理文件处理到哪一条了
# 会报文件找不到,但是数据依旧会在里面,不需要先创建,会自动先创建
agent1.sources.taildir_src.positionFile = /home/hadoop-jrq/dw-course/streaming-etl/taildir_position.json
# 监控两个目录
agent1.sources.taildir_src.filegroups = f1 f2
# 第一个文件目录的数据
agent1.sources.taildir_src.filegroups.f1 = /home/hadoop-jrq/dw-course/streaming-etl/logs/daily/.*log
# app1其实就是对应着f1,下面的%{headerKey1},app2同理,因此这个APP可以随意命名
agent1.sources.taildir_src.headers.f1.headerKey1 = app1
# 第二个文件目录的数据
agent1.sources.taildir_src.filegroups.f2 = /home/hadoop-jrq/dw-course/streaming-etl/logs/daily2/.*log

agent1.sources.taildir_src.headers.f2.headerKey1 = app2
agent1.sources.taildir_src.headers.f2.headerKey2 = app2-2
# 打开这两个开关就会拿到文件的全路径名,默认是关闭了的,这样就会为每个header增加一个header  就是事件所在的文件全名
agent1.sources.taildir_src.fileHeader = true
# key是file,这个值可以任意写
agent1.sources.taildir_src.fileHeaderKey  = file

# The channel can be defined as follows.
agent1.sources.taildir_src.channels = memoryChannel

# Each sink's type must be defined
agent1.sinks.hdfs_sink.type = hdfs
# agent1.sinks.hdfs_sink.hdfs.path = hdfs://mycluster/user/hadoop-jrq/dw-course/user-action-daily
# 演示header的用处
# 这个数据本身是存储在hdfs://mycluster/user/hadoop-jrq/dw-course/user-action-daily/下,但是后面加了header就会把数据只放在app1和app2下
# header的作用就是,监控的数据分开写在hdfs中,这样就可以区分开来了
agent1.sinks.hdfs_sink.hdfs.path = hdfs://mycluster/user/hadoop-jrq/dw-course/user-action-daily/%{headerKey1}

agent1.sinks.hdfs_sink.hdfs.useLocalTimeStamp = true 
# 上面匹配时间的话,需要打开这个开关,这个配置默认是false

agent1.sinks.hdfs_sink.hdfs.round = true
agent1.sinks.hdfs_sink.hdfs.roundValue = 10
agent1.sinks.hdfs_sink.hdfs.roundUnit = minute
# For example, an event with timestamp 11:54:34 AM, June 12, 2012 will cause the hdfs path to become /flume/events/2012-06-12/1150/00.

agent1.sinks.hdfs_sink.hdfs.filePrefix = events 
# 表示文件名的前缀,默认为FlumeData

agent1.sinks.hdfs_sink.hdfs.fileSuffix = .txt 
# 表示文件名的后缀,默认没有后缀

agent1.sinks.hdfs_sink.hdfs.idleTimeout = 0 
# 如果临时文件在这个时间内没有写数据的话,则将这个文件关闭掉,默认等于0,表示不关闭闲文件

agent1.sinks.hdfs_sink.hdfs.batchSize = 100 
# 表示数据每次flush到hdfs的event数,默认就是100

agent1.sinks.hdfs_sink.hdfs.inUsePrefix = events-tmp 
# 表示写临时文件的文件名的前缀,默认没有值

agent1.sinks.hdfs_sink.hdfs.inUseSuffix = .tmp 
# 表示写临时文件的文件名的后缀,默认就是.tmp

agent1.sinks.hdfs_sink.hdfs.rollInterval =30 
# 表示达到了30秒就将临时文件合并成最终文件,默认就是30秒,如果是0的话则表示不按照时间的多少来合并临时文件

agent1.sinks.hdfs_sink.hdfs.rollSize =0 
# 表示文件的大小达到了1024 bytes,则将临时文件合并成最终文件,默认就是1024字节,如0则表示不按照文件大小合并

agent1.sinks.hdfs_sink.hdfs.rollCount =0 
# 表示写入event的数量达到10条的话,则将临时文件合并成最终文件,默认就是10条,如0则表示不按照文件大小合并

agent1.sinks.hdfs_sink.hdfs.fileType = DataStream  
# 表示没有压缩的text文件,默认是SequenceFile,还有CompressedStream表示压缩的文本文件,需要设置hdfs.codeC

# agent1.sinks.hdfs_sink.hdfs.codeC = snappy 
# 可以为:gzip, bzip2, lzo, lzop

#Specify the channel the sink should use
# memoryChannel
agent1.sinks.hdfs_sink.channel = memoryChannel

# 使用Memory Channel.
agent1.channels.memoryChannel.type = memory
# 存储在channel中的最大容量  100个事件,100是默认的
agent1.channels.memoryChannel.capacity = 100
# 从一个source中去或者给一个sink,每个事务中最大的事件数   一次性能扔100个事件到sink里去
agent1.channels.memoryChannel.transactionCapacity = 100
# 增加或者删除一个event的超时时间,其实就是timeout时间
agent1.channels.memoryChannel.keep-alive = 3
# byteCapacity和预估的所有event大小之间的buffer。(为了考虑event headers的大小)
# byteCapacity的大小最多是jvm内存大小的80%  header是20%
agent1.channels.memoryChannel.byteCapacityBufferPercentage = 20
# 内存里面允许存放的所有event的字节的最大值。(只是统计event body的大小)
# 就是内存中最大只能存储80万字节
agent1.channels.memoryChannel.byteCapacity = 800000

三种收集日志的Source对比

exec方式:实时且简单,但是一旦挂了就丢数据,因为它不会写文件记录flume处理到哪里了
spooling directory方式:不会丢数据,但是只满足准实时的场景
TAILDIR方式:不会丢数据,且满足实时的场景,监控多个文件下的数据,推荐使用,但是这只是1.8.0才推出的功能,而且只用于liunx,win目前还不稳定

几种Channels的对比

Memory Channel: 优点是速度快,缺点是可能丢数据、内存是瓶颈(挂掉的时候,内存中的数据会丢失,每秒的数据量很大的时候,可能会把内存撑爆)
File Channel : 优点是不会丢数据,不会有内存瓶颈(吞吐量大),缺点是速度比memory channel慢
Spillable Memory Channel : events先放在内存中,内存不够的话则放在文件中
实验版本,不建议在生产上用

以上三种是flume自带的,不需要依赖其他就可以干活
JDBC Channel(Derby) 、Kafka Channel 在此先不做过多解释

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值