Apache - Flume 简单总结

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 需要安装以下方便测试;

  1. 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使用改值修改采集完成的文件名
    deletePolicynever删除采集的源文件,可选值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.topicsKafka使用者将从中读取消息的主题,以逗号分隔
    kafka.bootstrap.servers来源使用的Kafka集群中的Broker列表(Kafka对应主机名及其端口号)
    kafka.consumer.group.idflumeKafka中消费者组ID
    kafka.topics.regex正则表达式,用于定义订阅源的主题集。
    此属性的优先级高于kafka.topics,并且覆盖kafka.topics(如果存在)。
    batchSize1000批量写入通道的最大消息数

例:

# 声明基本组件 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.pathHDFS目录路径
    hdfs.rollInterval30滚动当前文件之前要等待的秒数(0表示不滚动)
    hdfs.rollSize1024触发滚动的文件大小,以字节为单位(0表示从不基于文件大小滚动)
    hdfs.rollCount10滚动之前写入文件的事件数(0 表示根据事件数从不滚动)
    hdfs.useLocalTimeStampfalse替换转义序列时,请使用本地时间
    hdfs.fileTypeSequenceFile文件类型,可选值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.serversKafka主机名,以及端口号
    kafka.topicflumeKafka中将发布消息的Topic
    flumeBatchSize100一批中要处理多少条消息
    kafka.producer.acks1在成功考虑一条消息之前,有多少个副本必须确认一条消息。
    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
    capacity100通道中存储的最⼤事件数
    transactionCapacity100每⼀次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.typeDERBY数据库供应商,必须是DERBY

    例:

    a1.channels.c1.type = jdbc
    
  • Kafka Channel

    将Source采集的数据写⼊外围系统的Kafka集群

    属性默认值说明
    type组件类型名称,必须为org.apache.flume.channel.kafka.KafkaChannel
    kafka.bootstrap.servers该通道使⽤的Kafka集群中的Broker列表
    kafka.topicflume-channel该频道将使用的Kafka主题
    kafka.consumer.group.idflumeConsumer用于向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.typedefault组件类型名称,需要为load_balance
    processor.backofffalse失败的接收器应以指数方式减少
    processor.selectorround_robin选择机制,必须是round_robin(顺序)或random(随机)
    processor.selector.maxTimeOut30000由退避选择器用来限制指数退避(以毫秒为单位)

    注: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.batchSizetransactionCapacity必须配置成1

  • Failover Sink Processorist – 故障转移

    属性默认值说明
    sinks参与组的接收器的以空格分隔的
    processor.typedefault组件类型名称failover
    processor.priority.优先级值,名称
    processor.maxpenalty30000失败的接收器的最大退避时间(以毫秒为单位)

    例:

    # 声明基本组件 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
    
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小七_七七

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值