Flume是一个分布式、可靠、高可用的海量日志聚合系统。从整体上看就是source-channel-sink三层架构。类似于生产者和消费者的架构,他们之间通过channel传输解耦。
Agent:flume以agent作为最小的独立运行单位。一个agent就是一个JVM。由source、channel、sink三大构建组成。Flume支持用户建立多级流,多个agent可以协同工作
Source:捕获时间并进行特定的格式化,然后将事件推入channel中。
常见的source有:
1 avro souce
2 taildir source
3 spolling directory source
4 还有Exec source、netcat source、HDFS source等,自行上官网搜索,如果内置source无法满足,可以自定义source
Channel:可以将它看为一个缓冲区,它可以暂存事件到内存,也可以持久化到本地磁盘,直到sink处理完该事件。
Flume对于channel,提供了memory channel、jdbc channel、file channel等
1 memory channel可以实现高速的吞吐,但是无法保证数据的完整性,服务器停掉、flume进程挂掉或者重启都会导致数据丢失。大量的数据易大致OOM,内存溢出
2 fileChannel保证数据的完整性与一致性,在具体配置不限的fileChannel时,建议fileChannel设置目录和程序日志文件保存的目录设置成不同的磁盘,以提高效率
3 kafka Channel 容量大,容错性强。Kafka channel可以在日志收集层只配置Source和kafka组件,不需要再配置sink组件,减少了日志收集启动的进程数,有效降低服务器内存,磁盘等资源的使用率,
Sink:负责持久化日志,去除channel中的数据,进行相应的存储文件系统,数据库,或者提交到远程服务器,或将事件推向另一个source。
Flume提供了HDFS sink、logger sink、avro sink、file roll sink、Hbase sink等
Flume在设置存储数据时,可以向文件系统中,数据库中,hadoop中存储数据,在日志较少时,可将数据存储在文件中,设定一定的时间间隔保存。在日志较多时,可以将相应的日志数据存储到hadoop中,便于日后进行相应的数据分析。
Flume拦截器:
Source将事件写入到channel之前。可以使用拦截器对event进行各种形式的处理,source和channel之间可以有多个拦截器。(过滤source进入到channel的数据形式)
1 时间拦截器:将时间戳插入到flume的事件报头中。如果不使用任何拦截器,flume接受到的只有message。
配置:
a1.sources.r1.interceptors = timestamp
a1.sources.r1.interceptors.timestamp.type=timestamp
a1.sources.r1.interceptors.timestamp.preserveExisting=false
2 正则过滤拦截器
过滤掉不需要的日志。配置:
a1.sources.r1.interceptors = regex
a1.sources.r1.interceptors.regex.type=REGEX_FILTER
a1.sources.r1.interceptors.regex.regex=(rm)|(kill)
a1.sources.r1.interceptors.regex.excludeEvents=false
flume选择器:source发送事件通过channel选择器来选择以哪种方式写入到channel中,flume提供了三种类型的选择器:复制、复用和自定义
1 复制选择器:如果source没有指定channel选择器,则该source使用复制channel选择器。复制选择器还有一个配置参数option,option指定的所有channel都是可选的,当事件写入到这些channel时有失败发生,则忽略这些失败。写入其他channel的失败将导致source的失败将导致source抛出异常,并要求source重试。
配置:
a1.sources = r1
a1.channels = c1 c2 c3
a1.sources.r1.selector.type = replicating
a1.sources.r1.channels = c1 c2 c3
a1.sources.r1.selector.optional = c3
注:如果未能写入c3,那么不会导致channel异常抛出到source,并且会通知source前一阶段写入是正常的。
2 复用channel选择器:用于动态路由时间,通过选择时间应该写入到那个channel,基于一个特定的事件头,可结合拦截器使用
配置:
a1.sources = r1
a1.channels = c1 c2 c3 c4
a1.sources.r1.selector.type = multiplexing
a1.sources.r1.selector.header = state
a1.sources.r1.selector.mapping.CZ = c1
a1.sources.r1.selector.mapping.US = c2 c3
a1.sources.r1.selector.optional.US = c4
a1.sources.r1.selector.default = c4
注:state的值,为CZ的传入到c1,US的传入到c2,c3,如果都不满足,传入到c4
3 自定义选择器:需要用java代码,实现ChannelSelect接口,或者继承AbstartChannelSelector类
Sink组
a1.sinkgroups = g1
a1.sinkgroups.g1.sinks = k1 k2
a1.sinkgroups.g1.processor.type = load_balance
a1.sinkgroups.g1.processor.backoff = true
a1.sinkgroups.g1.processor.selector = random
注:在任何时候每个agent只有一个sink写数据
Failover sink处理器
配置:
a1.sinkgroups = g1
a1.sinkgroups.g1.sinks = k1 k2
a1.sinkgroups.g1.processor.type = failover
a1.sinkgroups.g1.processor.priority.k1 = 5
a1.sinkgroups.g1.processor.priority.k2 = 10
a1.sinkgroups.g1.processor.maxpenalty = 10000
注:指定k1,k2的优先级
Flume的负载均衡和故障转移:
设置sink组,同一个sink组内有多个子sink,某个子sink故障不影响整体运行。
Fulme调优:
1 source:
增加source个数,使用TailDir source时可以增加filegroup个数,可以增大source的读取数据能力。如:当某一个目录产生的文件过多时需要将这个文件目录拆分成多个文件目录,同时配置多个source以保证有足够的能力获取到新产生的数据
BatchSize:参数绝对source一次批量运输到channel的event条数,适当调大可提高搬运到channel的性能。
a1.sources = r1
a1.channels = c1
a1.sources.r1.type = TAILDIR
a1.sources.r1.channels = c1
a1.sources.r1.batchSize = 200
注:此处为TailDir source 其他source也可看官网配置
2 channel
Type选择memory的性能好,速度快,但flume进程意外挂掉可能会丢失数据,且不适用与大量日志数据,选择file时channel容错性好
使用file channel时dataDirs配置多个不同盘下的目录可以提高性能
Capacity参数决定channel可容纳的最大event条数。TransactionCapacity参数决定每次source往channel里面写的最大event条数和每次sink从channel里面读的最大event条数。TransactionCapacity需要大于source和sink 的batchSize参数
a1.channels = c1
a1.channels.c1.type = memory
a1.channels.c1.capacity = 10000
a1.channels.c1.transactionCapacity = 10000
a1.channels.c1.byteCapacityBufferPercentage = 20
a1.channels.c1.byteCapacity = 800000
注:此处为memory channel
3 sink
增加sink个数可以增加sink消费event的能力(使用sink组)。但sink也不是越多越好,sink过多会占用系统资源,造成资源浪费。根据实际情况处理。
bitchSize参数决定sink一次批量从channel读取的event条数,适当调大可增强sink从channel搬出event的性能。
a1.channels = c1
a1.sinks = k1
a1.sinks.k1.type = hbase
a1.sinks.k1.table = foo_table
a1.sinks.k1.columnFamily = bar_cf
a1.sinks.k1.serializer = org.apache.flume.sink.hbase.RegexHbaseEventSerializer
a1.sinks.k1.batchSize = 200
a1.sinks.k1.channel = c1
注:此处为habse sink ,bitchSink的默认条数为100