Flume
Flume 概念
Flume是一种分布式,可靠且可用的服务,用于有效地收集,聚合和移动大量日志数据。Flume构建在日志流之上一个简单灵活的架构。它具有可靠的可靠性机制和许多故障转移和恢复机制,具有强大的容错性。使用Flume这套架构实现对日志流数据的实时在线分析。Flume支持在日志系统中定制各类数据发送方,用于收集数据;同时,Flume提供对数据进行简单处理,并写到各种数据接受方(可定制)的能力。当前Flume有两个版本Flume 0.9X版本的统称Flume-og,Flume1.X版本的统称Flume-ng。由于Flume-ng经过重大重构,与Flume-og有很大不同,使用时请注意区分。本次课程使用的是apache-flume-1.9.0-bin.tar.gz
Flume 架构
Flume 安装
-
安装JDK1.8 配置环境变量;
-
安装Flume下载地址http://mirrors.tuna.tsinghua.edu.cn/apache/flume/1.9.0/apache-flume-1.9.0-bin.tar.gz
-
安装Flume
[root@CentOS ~]# tar -zxf apache-flume-1.9.0-bin.tar.gz -C /usr/ [root@CentOS ~]# cd /usr/apache-flume-1.9.0-bin/ [root@CentOS apache-flume-1.9.0-bin]# ./bin/flume-ng version Flume 1.9.0 Source code repository: https://git-wip-us.apache.org/repos/asf/flume.git Revision: d4fcab4f501d41597bc616921329a4339f73585e Compiled by fszabo on Mon Dec 17 20:45:25 CET 2018 From source with checksum 35db629a3bda49d23e9b3690c80737f9
Agent 配置模板说明
# 声明组件信息
<Agent>.sources = <Source1> <Source2>
<Agent>.sinks = <Sink1> <Sink1>
<Agent>.channels = <Channel1> <Channel2>
# 组件配置
<Agent>.sources.<Source>.<someProperty> = <someValue>
<Agent>.channels.<Channel>.<someProperty> = <someValue>
<Agent>.sinks.<Sink>.<someProperty> = <someValue>
# 链接组件
<Agent>.sources.<Source>.channels = <Channel1> <Channel2> ...
<Agent>.sinks.<Sink>.channel = <Channel1>
模板结构是必须掌握的,掌握该模板的⽬的是为了便于后期的查阅和配置。
<Agent>
、<Channel>
、<Sink>
、<Source>
表示组件的名字,系统有哪些可以使⽤的组件需要查阅⽂档.
官方文档
:: http://flume.apache.org/releases/content/1.9.0/FlumeUserGuide.html
快速入门
- 单个Agent的配置,就在Flume安装目录下的conf文件夹中新建一个配置文件xxx.properties
# 声明基本组件 Source Channel Sink
a1.sources = s1
a1.sinks = sk1
a1.channels = c1
# 配置Source组件,从Socket中接收⽂本数据 type 组件类型 一般在文档中指定 bind 主机名 可以使用ip地址代替 port 端口号
a1.sources.s1.type = netcat
a1.sources.s1.bind = CentOS
a1.sources.s1.port = 44444
# 配置Sink组件,将接收数据打印在⽇志控制台 type 组件类型 一般在文档中指定
a1.sinks.sk1.type = logger
# 配置Channel通道,主要负责数据缓冲 type 组件类型 一般在文档中指定 capacity 通道中存储的最大事件数 transactionCapacity 每次交易通道给接收器的最大事件数
a1.channels.c1.type = memory
a1.channels.c1.capacity = 1000
a1.channels.c1.transactionCapacity = 100
# 进⾏组件间的绑定
a1.sources.s1.channels = c1
a1.sinks.sk1.channel = c1
注意:由于本案例采集数据的Source组件类型为 Netcat 需要安装以下方便测试;
yum -y install nmap-ncat
2 .yum -y install telnet
- 启动采集组件
[root@CentOS apache-flume-1.9.0-bin]# ./bin/flume-ng agent --conf conf/ --name a1 --conf-file conf/example1.properties -Dflume.root.logger=INFO,console
#如果需要可以使用 ./bin/flume-ng help 查询帮助信息
- 测试
[root@CentOS zookeeper-3.4.12]# telnet CentOS 44444
Trying 192.168.253.174...
Connected to CentOS.
Escape character is '^]'.
111
OK
hello world
OK
2020-02-05 19:26:40,352 (SinkRunner-PollingRunner-DefaultSinkProcessor) [INFO - org.apache.flume.sink.LoggerSink.process(LoggerSink.java:95)] Event: { headers:{} body: 31 31 31 0D 111. }
2020-02-05 19:26:49,461 (SinkRunner-PollingRunner-DefaultSinkProcessor) [INFO - org.apache.flume.sink.LoggerSink.process(LoggerSink.java:95)] Event: { headers:{} body: 68 65 6C 6C 6F 20 77 6F 72 6C 64 0D hello world. }
组件概述
Source - 输入源
-
Avro Source
内部启动一个Avro 服务器, 用于接受来自Avro Client 的请求,并且将数据存储到Channel中;
属性 默认值 说明 channels 需要对接的Channel type 表示组件类型,必须给 avro
bind 绑定的IP port 绑定监听端口 例:
# 声明基本组件 Source Channel Sink example2.properties a1.sources = s1 a1.sinks = sk1 a1.channels = c1 # 配置Source组件,从Socket中接收⽂本数据 a1.sources.s1.type = avro a1.sources.s1.bind = CentOS a1.sources.s1.port = 44444 # 配置Sink组件,将接收数据打印在⽇志控制台 a1.sinks.sk1.type = logger # 配置Channel通道,主要负责数据缓冲 a1.channels.c1.type = memory a1.channels.c1.capacity = 1000 a1.channels.c1.transactionCapacity = 100 # 进⾏组件间的绑定 a1.sources.s1.channels = c1 a1.sinks.sk1.channel = c1
测试:
[root@CentOS apache-flume-1.9.0-bin]# ./bin/flume-ng agent --conf conf/ --name a1 --conf-file conf/example2.properties -Dflume.root.logger=INFO,console [root@CentOS apache-flume-1.9.0-bin]# ./bin/flume-ng avro-client --host CentOS --port 44444 --filename /root/t_emp
-
Exec Source
可以将指令在控制台输出采集出来。
属性 默认值 说明 channels 需要对接的channel type 必须指定为 exec
command 要执行的命令
例:
# 声明基本组件 Source Channel Sink example3.properties
a1.sources = s1
a1.sinks = sk1
a1.channels = c1
# 配置Source组件,从Socket中接收⽂本数据
a1.sources.s1.type = exec
a1.sources.s1.command = tail -F /root/t_user
# 配置Sink组件,将接收数据打印在⽇志控制台
a1.sinks.sk1.type = logger
# 配置Channel通道,主要负责数据缓冲
a1.channels.c1.type = memory
a1.channels.c1.capacity = 1000
a1.channels.c1.transactionCapacity = 100
# 进⾏组件间的绑定
a1.sources.s1.channels = c1
a1.sinks.sk1.channel = c1
[root@CentOS apache-flume-1.9.0-bin]# ./bin/flume-ng agent --conf conf/ --name a1 --conf-file conf/example3.properties -Dflume.root.logger=INFO,console
-
Spooling Directory Source
采集静态目录下,新增文本文件,采集完成后会修改文件后缀,但是不会删除采集的源文件,如果用户只想采集一次,可以修改Source这一默认行为。
属性 默认值 说明 channels 对接的Channel type 必须修改为 spooldir
spoolDir 给定需要采集的目录 fileSuffix .COMPLETED 使用改值修改采集完成的文件名 deletePolicy never 删除采集的源文件,可选值 never
/immediate
includePattern ^.*$ 表示匹配所有文件(正则表达式) ignorePattern ^$ 表示不匹配的文件(正则表达式)
例:
# 声明基本组件 Source Channel Sink test2.properties
a1.sources = s1
a1.sinks = sk1
a1.channels = c1
# 配置Source组件,从Socket中接收⽂本数据
a1.sources.s1.type = spooldir
a1.sources.s1.spoolDir = /root/spooldir
a1.sources.s1.fileHeader = true
# 配置Sink组件,将接收数据打印在⽇志控制台
a1.sinks.sk1.type = logger
# 配置Channel通道,主要负责数据缓冲
a1.channels.c1.type = memory
a1.channels.c1.capacity = 1000
a1.channels.c1.transactionCapacity = 100
# 进⾏组件间的绑定
a1.sources.s1.channels = c1
a1.sinks.sk1.channel = c1
测试
[root@CentOS apache-flume-1.9.0-bin]# ./bin/flume-ng agent --conf conf/ --name a1 --conf-file conf/test2.properties -Dflume.root.logger=INFO,console
-
Taildir Source
实时监测动态文本行的追加,并且记录采集的文件读取的位置的偏移量,即使下一次再次采集,可以实现增量采集。
属性 默认值 说明 channels 对接的通道 type 必须指定为 TAILDIR
filegroups 以空格分隔的文件组列表 filegroups. 文件组名 文件组的绝对路径。正则表达式(而非文件系统模式)只能用于文件名。 positionFile ~/.flume/taildir_position.json 记录采集文件的位置信息,实现增量采集
# 声明基本组件 Source Channel Sink example5.properties
a1.sources = s1
a1.sinks = sk1
a1.channels = c1
# 配置Source组件,从Socket中接收⽂本数据
a1.sources.s1.type = TAILDIR
a1.sources.s1.filegroups = g1 g2
#.log .java 结尾的文件
a1.sources.s1.filegroups.g1 = /root/taildir/.*\.log$
a1.sources.s1.filegroups.g2 = /root/taildir/.*\.java$
#log java 类型的文件
a1.sources.s1.headers.g1.type = log
a1.sources.s1.headers.g2.type = java
# 配置Sink组件,将接收数据打印在⽇志控制台
a1.sinks.sk1.type = logger
# 配置Channel通道,主要负责数据缓冲
a1.channels.c1.type = memory
a1.channels.c1.capacity = 1000
a1.channels.c1.transactionCapacity = 100
# 进⾏组件间的绑定
a1.sources.s1.channels = c1
a1.sinks.sk1.channel = c1
[root@CentOS apache-flume-1.9.0-bin]# ./bin/flume-ng agent --conf conf/ --name a1 --conf-file conf/test3.properties -Dflume.root.logger=INFO,console
-
Kafka Source
Kafka Source是Apache Kafka使用者,可从Kafka主题读取消息。
属性 默认值 说明 channels type 必须为 org.apache.flume.source.kafka.KafkaSource
kafka.topics Kafka使用者将从中读取消息的主题,以逗号分隔 kafka.bootstrap.servers 来源使用的Kafka集群中的Broker列表(Kafka对应主机名及其端口号) kafka.consumer.group.id flume Kafka中消费者组ID kafka.topics.regex 正则表达式,用于定义订阅源的主题集。
此属性的优先级高于kafka.topics,
并且覆盖kafka.topics
(如果存在)。batchSize 1000 批量写入通道的最大消息数
例:
# 声明基本组件 Source Channel Sink
a1.sources = s1
a1.sinks = sk1
a1.channels = c1
# 配置Source组件,从Socket中接收⽂本数据
a1.sources.s1.type = org.apache.flume.source.kafka.KafkaSource
a1.sources.s1.batchSize = 100
a1.sources.s1.batchDurationMillis = 2000
a1.sources.s1.kafka.bootstrap.servers = CentOS:9092
a1.sources.s1.kafka.topics = topic01
a1.sources.s1.kafka.consumer.group.id = g1
# 配置Sink组件,将接收数据打印在⽇志控制台
a1.sinks.sk1.type = logger
# 配置Channel通道,主要负责数据缓冲
a1.channels.c1.type = memory
a1.channels.c1.capacity = 1000
a1.channels.c1.transactionCapacity = 100
# 进⾏组件间的绑定
a1.sources.s1.channels = c1
a1.sinks.sk1.channel = c1
注意:batchSize 的个数 必须小于或等于transactionCapacity;
测试:
#创建Topic
[root@CentOS kafka_2.11-2.2.0]# ./bin/kafka-topics.sh --bootstrap-server CentOS:9092 --create --topic topic01 --partitions 1 --replication-factor 1
#创建生产者
[root@CentOS kafka_2.11-2.2.0]# ./bin/kafka-console-producer.sh --broker-list CentOS:9092 --topic topic01
#测试
[root@CentOS apache-flume-1.9.0-bin]# ./bin/flume-ng agent --conf conf/ --name a1 --conf-file conf/test4.properties -Dflume.root.logger=INFO,console
Sink - 输出
-
Logger Sink
通常用于测试/调试目的;
-
File Roll Sink
可以将采集的数据写入到本地文件;
属性 默认值 说明 channel type 类型名称必须为 file_roll
sink.directory 文件存储目录 例:
# 声明基本组件 Source Channel Sink a1.sources = s1 a1.sinks = sk1 a1.channels = c1 # 配置Source组件,从Socket中接收⽂本数据 a1.sources.s1.type = netcat a1.sources.s1.bind = CentOS a1.sources.s1.port = 44444 # 配置Sink组件,将接收数据打印在⽇志控制台 a1.sinks.sk1.type = file_roll a1.sinks.sk1.sink.directory = /root/file_roll a1.sinks.sk1.sink.rollInterval = 0 # 配置Channel通道,主要负责数据缓冲 a1.channels.c1.type = memory a1.channels.c1.capacity = 1000 a1.channels.c1.transactionCapacity = 100 # 进⾏组件间的绑定 a1.sources.s1.channels = c1 a1.sinks.sk1.channel = c1
测试:
[root@CentOS apache-flume-1.9.0-bin]# ./bin/flume-ng agent --conf conf/ --name a1 --conf-file conf/test5.properties -Dflume.root.logger=INFO,console
-
HDFS Sink
可以将数据写入到HDFS文件系统;
属性 默认值 说明 channel type 组件类型名称,必须为 hdfs
hdfs.path HDFS目录路径 hdfs.rollInterval 30 滚动当前文件之前要等待的秒数(0表示不滚动) hdfs.rollSize 1024 触发滚动的文件大小,以字节为单位(0表示从不基于文件大小滚动) hdfs.rollCount 10 滚动之前写入文件的事件数(0 表示根据事件数从不滚动) hdfs.useLocalTimeStamp false 替换转义序列时,请使用本地时间 hdfs.fileType SequenceFile 文件类型,可选值 SequenceFile
/DataStream
/CompressedStream
例:
# 声明基本组件 Source Channel Sink a1.sources = s1 a1.sinks = sk1 a1.channels = c1 # 配置Source组件,从Socket中接收⽂本数据 a1.sources.s1.type = netcat a1.sources.s1.bind = CentOS a1.sources.s1.port = 44444 # 配置Sink组件,将接收数据打印在⽇志控制台 a1.sinks.sk1.type = hdfs a1.sinks.sk1.hdfs.path = /flume-hdfs/%y-%m-%d a1.sinks.sk1.hdfs.rollInterval = 0 a1.sinks.sk1.hdfs.rollSize = 0 a1.sinks.sk1.hdfs.rollCount = 0 a1.sinks.sk1.hdfs.useLocalTimeStamp = true a1.sinks.sk1.hdfs.fileType = DataStream # 配置Channel通道,主要负责数据缓冲 a1.channels.c1.type = memory a1.channels.c1.capacity = 1000 a1.channels.c1.transactionCapacity = 100 # 进⾏组件间的绑定 a1.sources.s1.channels = c1 a1.sinks.sk1.channel = c1
测试:
[root@CentOS apache-flume-1.9.0-bin]# ./bin/flume-ng agent --conf conf/ --name a1 --conf-file conf/test6.properties -Dflume.root.logger=INFO,console
-
Kafka Sink
将数据写入Kafka的Topic中
属性 默认值 说明 channel type 必须设置为 org.apache.flume.sink.kafka.KafkaSink
kafka.bootstrap.servers Kafka主机名,以及端口号 kafka.topic flume Kafka中将发布消息的Topic flumeBatchSize 100 一批中要处理多少条消息 kafka.producer.acks 1 在成功考虑一条消息之前,有多少个副本必须确认一条消息。 kafka.producer.linger.ms 多少时间会清空消息发送出去 例:
# 声明基本组件 Source Channel Sink a1.sources = s1 a1.sinks = sk1 a1.channels = c1 # 配置Source组件,从Socket中接收⽂本数据 a1.sources.s1.type = netcat a1.sources.s1.bind = CentOS a1.sources.s1.port = 44444 # 配置Sink组件,将接收数据打印在⽇志控制台 a1.sinks.sk1.type = org.apache.flume.sink.kafka.KafkaSink a1.sinks.sk1.kafka.bootstrap.servers = CentOS:9092 a1.sinks.sk1.kafka.topic = topic01 a1.sinks.sk1.kafka.flumeBatchSize = 20 a1.sinks.sk1.kafka.producer.acks = 1 a1.sinks.sk1.kafka.producer.linger.ms = 1 # 配置Channel通道,主要负责数据缓冲 a1.channels.c1.type = memory a1.channels.c1.capacity = 1000 a1.channels.c1.transactionCapacity = 100 # 进⾏组件间的绑定 a1.sources.s1.channels = c1 a1.sinks.sk1.channel = c1
测试:
[root@CentOS apache-flume-1.9.0-bin]# ./bin/flume-ng agent --conf conf/ --name a1 --conf-file conf/test7.properties -Dflume.root.logger=INFO,console #订阅生产者 topic01 [root@CentOS kafka_2.11-2.2.0]# ./bin/kafka-console-consumer.sh --bootstrap-server CentOS:9092 --group g1 --topic topic01
-
Avro Sink
将数据写出给Avro Source;有较高的应用场景;
属性 | 默认值 | 说明 |
---|---|---|
channel | ||
type | 组件类型名称必须为avro | |
hostname | 要绑定到的主机名或IP地址 | |
port | 监听端口 |
应用场景:
# 声明基本组件 Source Channel Sink
a1.sources = s1
a1.sinks = sk1
a1.channels = c1
# 配置Source组件,从Socket中接收⽂本数据
a1.sources.s1.type = org.apache.flume.source.kafka.KafkaSource
a1.sources.s1.batchSize = 100
a1.sources.s1.batchDurationMillis = 2000
a1.sources.s1.kafka.bootstrap.servers = CentOS:9092
a1.sources.s1.kafka.topics = topic01
a1.sources.s1.kafka.consumer.group.id = g1
# 配置Sink组件,将接收数据打印在⽇志控制台
a1.sinks.sk1.type = avro
a1.sinks.sk1.hostname = CentOS
a1.sinks.sk1.port = 44444
# 配置Channel通道,主要负责数据缓冲
a1.channels.c1.type = memory
a1.channels.c1.capacity = 1000
a1.channels.c1.transactionCapacity = 100
# 进⾏组件间的绑定
a1.sources.s1.channels = c1
a1.sinks.sk1.channel = c1
# 声明基本组件 Source Channel Sink
a2.sources = s1
a2.sinks = sk1
a2.channels = c1
# 配置Source组件,从Socket中接收⽂本数据
a2.sources.s1.type = avro
a2.sources.s1.bind = CentOS
a2.sources.s1.port = 44444
# 配置Sink组件,将接收数据打印在⽇志控制台
a2.sinks.sk1.type = file_roll
a2.sinks.sk1.sink.directory = /root/file_roll
a2.sinks.sk1.sink.rollInterval = 0
# 配置Channel通道,主要负责数据缓冲
a2.channels.c1.type = memory
a2.channels.c1.capacity = 1000
a2.channels.c1.transactionCapacity = 100
# 进⾏组件间的绑定
a2.sources.s1.channels = c1
a2.sinks.sk1.channel = c1
测试:
#创建Kafka生产者
[root@CentOS kafka_2.11-2.2.0]# ./bin/kafka-console-producer.sh --broker-list CentOS:9092 --topic topic01
#启动a2组件
[root@CentOS apache-flume-1.9.0-bin]# ./bin/flume-ng agent --conf conf/ --name a2 --conf-file conf/test8.properties -Dflume.root.logger=INFO,console
#启动a1组件
[root@CentOS apache-flume-1.9.0-bin]# ./bin/flume-ng agent --conf conf/ --name a1 --conf-file conf/test8.properties -Dflume.root.logger=INFO,console
Channel - 通道
-
Memory Channel
特点:
快
将Source数据直接写⼊内存,不安全,可能会导致数据丢失。属性 默认值 说明 type 必须为 memory
capacity 100 通道中存储的最⼤事件数 transactionCapacity 100 每⼀次source或者Sink组件写⼊Channel或者读取Channel的批量大小 transactionCapacity <= capacity
例:
a1.channels.c1.type = memory a1.channels.c1.capacity = 1000 a1.channels.c1.transactionCapacity = 100
-
JDBC Channel
事件存储在数据库⽀持的持久性存储中。 JDBC通道当前⽀持嵌⼊式Derby。这是⼀种持久通道,⾮常适合可恢复性很重要的流程。存储⾮常重要的数据,的时候可以使⽤jdbc channel;
属性 默认值 说明 type 组件类型名称,必须为 jdbc
db.type DERBY 数据库供应商,必须是 DERBY
例:
a1.channels.c1.type = jdbc
-
Kafka Channel
将Source采集的数据写⼊外围系统的Kafka集群
属性 默认值 说明 type 组件类型名称,必须为 org.apache.flume.channel.kafka.KafkaChannel
kafka.bootstrap.servers 该通道使⽤的Kafka集群中的Broker列表 kafka.topic flume-channel 该频道将使用的Kafka主题 kafka.consumer.group.id flume Consumer用于向Kafka注册的消费者组ID a1.channels.c1.type = org.apache.flume.channel.kafka.KafkaChannel a1.channels.c1.kafka.bootstrap.servers = CentOS:9092 a1.channels.c1.kafka.topic = topic_channel a1.channels.c1.kafka.consumer.group.id = g1
例:
# 声明基本组件 Source Channel Sink a1.sources = s1 a1.sinks = sk1 a1.channels = c1 # 配置Source组件,从Socket中接收⽂本数据 a1.sources.s1.type = netcat a1.sources.s1.bind = CentOS a1.sources.s1.port = 44444 # 配置Sink组件,将接收数据打印在⽇志控制台 a1.sinks.sk1.type = logger # 配置Channel通道,主要负责数据缓冲 a1.channels.c1.type = org.apache.flume.channel.kafka.KafkaChannel a1.channels.c1.kafka.bootstrap.servers = CentOS:9092 a1.channels.c1.kafka.topic = topic01 a1.channels.c1.kafka.consumer.group.id = g1 # 进⾏组件间的绑定 a1.sources.s1.channels = c1 a1.sinks.sk1.channel = c1
测试:
#订阅组 [root@CentOS kafka_2.11-2.2.0]# ./bin/kafka-console-consumer.sh --bootstrap-server CentOS:9092 --topic topic01 --group g2 #启动组件 [root@CentOS apache-flume-1.9.0-bin]# ./bin/flume-ng agent --conf conf/ --name a1 --conf-file conf/test9.properties -Dflume.root.logger=INFO,console
-
File Channel
使用文件系统作为通道的实现,能够实现对缓冲数据的持久化。
属性 默认值 说明 type 组件类型名称,必须是 file
checkpointDir ~/.flume/file-channel/checkpoint 将存储检查点文件的目录 dataDirs ~/.flume/file-channel/data 用逗号分隔的目录列表,用于存储日志文件 a1.channels.c1.type = file a1.channels.c1.checkpointDir = /root/flume/checkpoint a1.channels.c1.dataDirs = /root/flume/data
高级组件
拦截器
作用于Source组件,对Source封装的Event数据进行拦截
或者是装饰
,Flume内建了许多拦截器;
拦截器 | 类型 | 作用 |
---|---|---|
Timestamp Interceptor | 装饰类型 | 负责在Event Header添加时间信息 |
Host Interceptor | 装饰类型 | 负责在Event Header添加主机信息 |
Static Interceptor | 装饰类型 | 负责在Event Header添加自定义key和value |
Remove Header Interceptor | 装饰类型 | 负责删除Event Header中指定的 key |
UUID Interceptor | 装饰类型 | 负责在Event Header添加uuid的随机的唯⼀字符串 |
Search and Replace Interceptor | 装饰类型 | 装饰类型,负责搜索EventBody的内容,并且将匹配的内容进行替换 |
Regex Filtering Interceptor | 拦截类型 | 将满足正则表达式的内容进行过滤或者匹配 |
Regex Extractor Interceptor | 装饰类型 | 负责搜索EventBody的内容,并且将匹配的内容添加到 Event Header里面 |
案例1
测试装饰拦截器:
# 声明基本组件 Source Channel Sink
a1.sources = s1
a1.sinks = sk1
a1.channels = c1
# 配置Source组件,从Socket中接收⽂本数据
a1.sources.s1.type = netcat
a1.sources.s1.bind = CentOS
a1.sources.s1.port = 44444
# 添加拦截器
a1.sources.s1.interceptors = i1 i2 i3 i4 i5 i6
#i1 添加时间信息拦截器
a1.sources.s1.interceptors.i1.type = timestamp
#i2 添加主机信息拦截器
a1.sources.s1.interceptors.i2.type = host
#i3 添加静态自定义key/value拦截器
a1.sources.s1.interceptors.i3.type = static
a1.sources.s1.interceptors.i3.key = from
a1.sources.s1.interceptors.i3.value = china
#i4 添加UUID拦截器
a1.sources.s1.interceptors.i4.type = org.apache.flume.sink.solr.morphline.UUIDInterceptor$Builder
a1.sources.s1.interceptors.i4.headerName = uuid
#i5 删除头信息拦截器
a1.sources.s1.interceptors.i5.type = remove_header
# 以什么值为Key的信息
a1.sources.s1.interceptors.i5.withName = from
#i6 替换内容拦截器
a1.sources.s1.interceptors.i6.type = search_replace
# 要匹配的正则表达式
a1.sources.s1.interceptors.i6.searchPattern = ^xiaoqi
# 上面匹配到的值替换成的值
a1.sources.s1.interceptors.i6.replaceString = china
# 配置Sink组件,将接收数据打印在⽇志控制台
a1.sinks.sk1.type = logger
# 配置Channel通道,主要负责数据缓冲
a1.channels.c1.type = memory
a1.channels.c1.capacity = 1000
a1.channels.c1.transactionCapacity = 100
# 进行组件间的绑定
a1.sources.s1.channels = c1
a1.sinks.sk1.channel = c1
案例2
测试过滤和抽取拦截器:
# 声明基本组件 Source Channel Sink example12.properties
a1.sources = s1
a1.sinks = sk1
a1.channels = c1
# 配置Source组件,从Socket中接收⽂本数据
a1.sources.s1.type = netcat
a1.sources.s1.bind = CentOS
a1.sources.s1.port = 44444
# 添加拦截器
a1.sources.s1.interceptors = i1 i2
#正则表达式提取器拦截器 添加一个key 为 loglevel 的信息 value 是INFO 或者 ERROR
a1.sources.s1.interceptors.i1.type = regex_extractor
a1.sources.s1.interceptors.i1.regex = ^(INFO|ERROR)
a1.sources.s1.interceptors.i1.serializers = s1
a1.sources.s1.interceptors.i1.serializers.s1.name = loglevel
#正则表达式过滤拦截器
a1.sources.s1.interceptors.i2.type = regex_filter
a1.sources.s1.interceptors.i2.regex = .*china.*
# true 表示过滤正则匹配项 false 表示匹配正则匹配项
a1.sources.s1.interceptors.i2.excludeEvents = false
# 配置Sink组件,将接收数据打印在⽇志控制台
a1.sinks.sk1.type = logger
# 配置Channel通道,主要负责数据缓冲
a1.channels.c1.type = memory
a1.channels.c1.capacity = 1000
a1.channels.c1.transactionCapacity = 100
# 进⾏组件间的绑定
a1.sources.s1.channels = c1
a1.sinks.sk1.channel = c1
通道选择器
当⼀个Source组件对接多个Channel组件的时候,通道选择器
决定了Source的数据如何路由到Channel中,如果用户不指定通道选择器,默认系统会将Source数据广播给所有的Channel(默认使用replicating模式)。
-
replicating
复制:同时向两个通道全部都发送数据;默认情况下,flume使⽤的是
复制
广播模式的通道选择器;
例:
# 声明基本组件 Source Channel Sink example13.properties
a1.sources = s1
a1.sinks = sk1 sk2
a1.channels = c1 c2
# 配置Source组件,从Socket中接收⽂本数据
a1.sources.s1.type = netcat
a1.sources.s1.bind = CentOS
a1.sources.s1.port = 44444
# 配置Sink组件,将接收数据打印在⽇志控制台
a1.sinks.sk1.type = file_roll
a1.sinks.sk1.sink.directory = /root/file_roll_1
a1.sinks.sk1.sink.rollInterval = 0
a1.sinks.sk2.type = file_roll
a1.sinks.sk2.sink.directory = /root/file_roll_2
a1.sinks.sk2.sink.rollInterval = 0
# 配置Channel通道,主要负责数据缓冲
a1.channels.c1.type = memory
a1.channels.c1.capacity = 1000
a1.channels.c1.transactionCapacity = 100
a1.channels.c2.type = jdbc
# 进⾏组件间的绑定
a1.sources.s1.channels = c1 c2
a1.sinks.sk1.channel = c1
a1.sinks.sk2.channel = c2
#等价写法
# 声明基本组件 Source Channel Sink example14.properties
a1.sources = s1
a1.sinks = sk1 sk2
a1.channels = c1 c2
# 通道选择器 复制模式
a1.sources.s1.selector.type = replicating
a1.sources.s1.channels = c1 c2
# 配置Source组件,从Socket中接收⽂本数据
a1.sources.s1.type = netcat
a1.sources.s1.bind = CentOS
a1.sources.s1.port = 44444
# 配置Sink组件,将接收数据打印在⽇志控制台
a1.sinks.sk1.type = file_roll
a1.sinks.sk1.sink.directory = /root/file_roll_1
a1.sinks.sk1.sink.rollInterval = 0
a1.sinks.sk2.type = file_roll
a1.sinks.sk2.sink.directory = /root/file_roll_2
a1.sinks.sk2.sink.rollInterval = 0
# 配置Channel通道,主要负责数据缓冲
a1.channels.c1.type = memory
a1.channels.c1.capacity = 1000
a1.channels.c1.transactionCapacity = 100
a1.channels.c2.type = jdbc
# 进⾏组件间的绑定
a1.sources.s1.channels = c1 c2
a1.sinks.sk1.channel = c1
a1.sinks.sk2.channel = c2
注意
:在测试时错误,说明机器中同时装有Hive --jar冲突; 解决方式有两种:1. 在环境变量中删除HIVE_HOME 2.删除Flume中derby相关jar ;
- Multiplexing–分流
例:
# 声明基本组件 Source Channel Sink example15.properties
a1.sources = s1
a1.sinks = sk1 sk2
a1.channels = c1 c2
# 通道选择器 复制模式
a1.sources.s1.selector.type = multiplexing
a1.sources.s1.channels = c1 c2
a1.sources.s1.selector.header = level
a1.sources.s1.selector.mapping.INFO = c1
a1.sources.s1.selector.mapping.ERROR = c2
a1.sources.s1.selector.default = c1
# 配置Source组件,从Socket中接收⽂本数据
a1.sources.s1.type = netcat
a1.sources.s1.bind = CentOS
a1.sources.s1.port = 44444
a1.sources.s1.interceptors = i1
a1.sources.s1.interceptors.i1.type = regex_extractor
a1.sources.s1.interceptors.i1.regex = ^(INFO|ERROR)
a1.sources.s1.interceptors.i1.serializers = s1
a1.sources.s1.interceptors.i1.serializers.s1.name = level
# 配置Sink组件,将接收数据打印在⽇志控制台
a1.sinks.sk1.type = file_roll
a1.sinks.sk1.sink.directory = /root/file_roll_1
a1.sinks.sk1.sink.rollInterval = 0
a1.sinks.sk2.type = file_roll
a1.sinks.sk2.sink.directory = /root/file_roll_2
a1.sinks.sk2.sink.rollInterval = 0
# 配置Channel通道,主要负责数据缓冲
a1.channels.c1.type = memory
a1.channels.c1.capacity = 1000
a1.channels.c1.transactionCapacity = 100
a1.channels.c2.type = jdbc
# 进⾏组件间的绑定
a1.sources.s1.channels = c1 c2
a1.sinks.sk1.channel = c1
a1.sinks.sk2.channel = c2
Sink Processors
Flume使⽤Sink Group将多个Sink实例封装成⼀个逻辑的Sink组件,内部通过Sink Processors实现Sink Group的故障和负载均衡.
-
Load balancing Sink Processor – 负载均衡
属性 默认值 说明 processor.sinks 参与的Sink的以空格分隔 processor.type default 组件类型名称,需要为 load_balance
processor.backoff false 失败的接收器应以指数方式减少 processor.selector round_robin 选择机制,必须是 round_robin
(顺序)或random
(随机)processor.selector.maxTimeOut 30000 由退避选择器用来限制指数退避(以毫秒为单位) 注:backoff 和 maxTimeOut 但一个sink宕机,如果30s(默认)没有正常,则不在进入分配组;
例:
# 声明基本组件 Source Channel Sink example16.properties
a1.sources = s1
a1.sinks = sk1 sk2
a1.channels = c1
# 配置Source组件,从Socket中接收⽂本数据
a1.sources.s1.type = netcat
a1.sources.s1.bind = CentOS
a1.sources.s1.port = 44444
# 配置Sink组件,将接收数据打印在⽇志控制台
a1.sinks.sk1.type = file_roll
a1.sinks.sk1.sink.directory = /root/file_roll_1
a1.sinks.sk1.sink.rollInterval = 0
a1.sinks.sk1.sink.batchSize = 1
a1.sinks.sk2.type = file_roll
a1.sinks.sk2.sink.directory = /root/file_roll_2
a1.sinks.sk2.sink.rollInterval = 0
a1.sinks.sk2.sink.batchSize = 1
# 配置Sink Porcessors
a1.sinkgroups = g1
a1.sinkgroups.g1.sinks = sk1 sk2
a1.sinkgroups.g1.processor.type = load_balance
a1.sinkgroups.g1.processor.backoff = true
a1.sinkgroups.g1.processor.selector = round_robin
# 配置Channel通道,主要负责数据缓冲
a1.channels.c1.type = memory
a1.channels.c1.capacity = 1000
a1.channels.c1.transactionCapacity = 1
# 进⾏组件间的绑定
a1.sources.s1.channels = c1
a1.sinks.sk1.channel = c1
a1.sinks.sk2.channel = c1
如果想看到负载均衡效果,
sink.batchSize
和transactionCapacity
必须配置成1
-
Failover Sink Processorist – 故障转移
属性 默认值 说明 sinks 参与组的接收器的以空格分隔的 processor.type default 组件类型名称 failover
processor.priority. 优先级值,名称 processor.maxpenalty 30000 失败的接收器的最大退避时间(以毫秒为单位) 例:
# 声明基本组件 Source Channel Sink example17.properties a1.sources = s1 a1.sinks = sk1 sk2 a1.channels = c1 # 配置Source组件,从Socket中接收⽂本数据 a1.sources.s1.type = netcat a1.sources.s1.bind = CentOS a1.sources.s1.port = 44444 # 配置Sink组件,将接收数据打印在⽇志控制台 a1.sinks.sk1.type = file_roll a1.sinks.sk1.sink.directory = /root/file_roll_1 a1.sinks.sk1.sink.rollInterval = 0 a1.sinks.sk1.sink.batchSize = 1 a1.sinks.sk2.type = file_roll a1.sinks.sk2.sink.directory = /root/file_roll_2 a1.sinks.sk2.sink.rollInterval = 0 a1.sinks.sk2.sink.batchSize = 1 # 配置Sink Porcessors a1.sinkgroups = g1 a1.sinkgroups.g1.sinks = sk1 sk2 a1.sinkgroups.g1.processor.type = failover a1.sinkgroups.g1.processor.priority.sk1 = 20 a1.sinkgroups.g1.processor.priority.sk2 = 10 a1.sinkgroups.g1.processor.maxpenalty = 10000 # 配置Channel通道,主要负责数据缓冲 a1.channels.c1.type = memory a1.channels.c1.capacity = 1000 a1.channels.c1.transactionCapacity = 1 # 进⾏组件间的绑定 a1.sources.s1.channels = c1 a1.sinks.sk1.channel = c1 a1.sinks.sk2.channel = c1