Flume 案例总结。

Posted youngxuebo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Flume 案例总结。相关的知识,希望对你有一定的参考价值。

文章目录

一、Flume 架构



二、Flume传输过程

source监控某个文件或数据流,数据源产生新的数据,拿到该数据后,将数据封装在一个Event中,并put到channel后commit提交,channel队列先进先出,sink去channel队列中拉取数据,然后写入到 HDFS、HBase、kafka、Source中。


三、角色类型


& 启动flume配置文件

bin/flume-ng agent --conf conf/ --name a1 --conf-file conf/flume-telnet.conf -Dflume.root.logger==INFO,console > /flume/logs/school_collect.log 2>&1 &

(agent名称)
-c conf目录
-f :–conf-file 执行配置文件路径flume-telnet.conf
-Dflume.root.logger=DEBUG,console > /flume/logs/school_collect.log 2>&1 &
(当有错误时日志存放路径最后一个& :后台运行)

Dflume.root.logger==INFO,console 运行日志打印的控制台当中。


1) 定义 Agent

#定义Agent
a1.sources = r1
a1.sinks = k1
a1.channels = c1

2)定义 Sources

Flume 中常用的 Source 有NetCat(端口)Avro(Flume对Flume)Exec(命令)spooldir (目录)Taildir,也可以根据业务场景的需要自定义Source,具体介绍如下。

2.1) netcat Source

NetCat Source,可以使用TCP和UDP两种协议方式,通过监听指定的IP和端口来传输数据,它会将监听到端口的每一行数据转化成一个Event写入到Channel中。(必须使用的参数以红色标出,下同。)

Property NameDefaultDescription
type 端口类型指定为:netcat
bind 绑定机器名或IP地址
port 端口号
max-line-length512一行的最大字节数
ack-every-eventtrue对成功接受的Event返回OK
selector.typereplicating选择器类型replicating or multiplexing
selector.*选择器相关参数
interceptors-拦截器列表,多个以空格分隔
interceptors.*拦截器相关参数

[ 如案例一:监控端口数据 ]

#定义source,监控bigdata111服务器,44444端口
a1.sources.r1.type = netcat
a1.sources.r1.bind = bigdata111
a1.sources.r1.port = 44444

2.2) exec Source

Exec source通过执行给定的Unix命令的传输结果数据,如cat,tail -F等,实时性比较高,但是一旦Agent进程出现问题,可能会导致数据的丢失。

Property NameDefaultDescription
type Unix命令类型指定为:exec
command需要去执行的命令
shell 运行命令的shell脚本文件
restartThrottle10000尝试重启的超时时间
restartfalse如果命令执行失败,是否重启
logStdErrfalse是否记录错误日志
batchSize20批次写入channel的最大日志数量
batchTimeout3000批次写入数据的最大等待时间(毫秒)
selector.typereplicating选择器类型replicating or multiplexing
selector.*选择器其他参数
interceptors拦截器列表,多个空格分隔
interceptors.*

[ 如案例二:实时读取本地文件到HDFS]

# 定义source
a2.sources.r2.type = exec
a2.sources.r2.command = tail -F /opt/plus
a2.sources.r2.shell = /bin/bash -c

2.3) spooldir Source

通过监控一个文件夹将新增文件内容转换成Event传输数据,特点是不会丢失数据,使用Spooling Directory Source 需要注意的两点是:

  1. 不能对被监控的文件夹下的新增的文件做出任何更改
  2. 新增到监控文件夹的文件名称必须是唯一的。

由于是对整个新增文件的监控,Spooling Directory Source的实时性相对较低,不过可以采用对文件高粒度分割达到近似实时。

Property NameDefaultDescription
type 监控目录类型指定:spooldir
spoolDir 监控目录的路径
fileSuffix.COMPLETED完成数据传输的文件后缀标志
deletePolicynever删除已经完成数据传输的文件时间:never or immediate
fileHeaderfalse是否在header中添加文件的完整路径信息
fileHeaderKeyfile如果header中添加文件的完整路径信息时key的名称
basenameHeaderfalse是否在header中添加文件的基本名称信息
basenameHeaderKeybasename如果header中添加文件的基本名称信息时key的名称
includePattern^.*$使用正则来匹配新增文件需要被传输数据的文件
ignorePattern^$使用正则来忽略新增的文件
trackerDir.flumespool存储元数据信息目录
consumeOrderoldest文件消费顺序:oldest, youngest and random.
maxBackoff4000如果channel容量不足,尝试写入的超时时间,如果仍然不能写入,则会抛出ChannelException
batchSize100批次处理粒度
inputCharsetUTF-8输入码表格式
decodeErrorPolicyFAIL遇到不可解码字符后的处理方式:FAIL,REPLACE,IGNORE
selector.typereplicating选择器类型:replicating or multiplexing
selector.*选择器其他参数
interceptors拦截器列表,空格分隔
interceptors.*

[ 案例三:实时读取目录文件到HDFS]

#2 source
#监控目录的类型
a3.sources.r3.type = spooldir
#监控目录的路径
a3.sources.r3.spoolDir = /opt/module/flume1.8.0/upload
#哪个文件上传hdfs,然后给这个文件添加一个后缀
a3.sources.r3.fileSuffix = .COMPLETED
a3.sources.r3.fileHeader = true
#忽略所有以.tmp结尾的文件,不上传(可选)
a3.sources.r3.ignorePattern = ([^ ]*\\.tmp)

2.4) avro Source

不同主机上的Agent通过网络传输数据可使用的Source,一般是接受Avro client的数据,或和是上一级Agent的Avro Sink成对存在,序列化方式(常用于Flume对Flume)

Property NameDefaultDescription
type 类型指定为:avro
bind 监听的主机名或IP地址
port 端口号
threads传输可使用的最大线程数
selector.type
selector.*
interceptors拦截器列表
interceptors.*
compression-typenone可设置为“none” 或 “deflate”. 压缩类型需要和AvroSource匹配

[ 如案例四:Flume与Flume之间数据传递]

# 2 source
a2.sources.r1.type = avro
a2.sources.r1.bind = bigdata112
a2.sources.r1.port = 4141

2.5) Taildir Source

可以实时的监控指定一个或多个文件中的新增内容,由于该方式将数据的偏移量保存在一个指定的json文件中,即使在Agent挂掉或被kill也不会有数据的丢失,需要注意的是,该Source不能在Windows上使用。

Property NameDefaultDescription
type 指定类型:TAILDIR.
filegroups 文件组的名称,多个空格分隔
filegroups. 被监控文件的绝对路径
positionFile~/.flume/taildir_position.json存储数据偏移量路径
headers…Header key的名称
byteOffsetHeaderfalse是否添加字节偏移量到key为‘byteoffset’值中
skipToEndfalse当偏移量不能写入到文件时是否跳到文件结尾
idleTimeout120000关闭没有新增内容的文件超时时间(毫秒)
writePosInterval3000在positionfile 写入每一个文件lastposition的时间间隔
batchSize100批次处理行数
fileHeaderfalse是否添加header存储文件绝对路径
fileHeaderKeyfilefileHeader启用时,使用的key

3)定义 Channel

官网提供的Channel有多种类型可供选择,这里介绍Memory Channel和File Channel。

3.1) Memory Channel

Memory Channel是使用内存来存储Event,使用内存的意味着数据传输速率会很快,但是当Agent挂掉后,存储在Channel中的数据将会丢失。

Property NameDefaultDescription
type类型指定为:memory
capacity100存储在channel中的最大容量
transactionCapacity100从一个source中去或者给一个sink,每个事务中最大的事件数
keep-alive3对于添加或者删除一个事件的超时的秒钟
byteCapacityBufferPercentage20定义缓存百分比
byteCapacitysee descriptionChannel中允许存储的最大字节总数
a2.channels.c1.type = memory
a2.channels.c1.capacity = 1000
a2.channels.c1.transactionCapacity = 100

3.2) File Channel

File Channel使用磁盘来存储Event,速率相对于Memory Channel较慢,但数据不会丢失。

Property NameDefaultDescription
type 类型指定为:file.
checkpointDir~/.flume/file-channel/checkpointcheckpoint目录
useDualCheckpointsfalse备份checkpoint,为True,backupCheckpointDir必须设置
backupCheckpointDir备份checkpoint目录
dataDirs~/.flume/file-channel/data数据存储所在的目录设置
transactionCapacity10000Event存储最大值
checkpointInterval30000checkpoint间隔时间
maxFileSize2146435071单一日志最大设置字节数
minimumRequiredSpace524288000最小的请求闲置空间(以字节为单位)
capacity1000000Channel最大容量
keep-alive3一个存放操作的等待时间值(秒)
use-log-replay-v1falseExpert: 使用老的回复逻辑
use-fast-replayfalseExpert: 回复不需要队列
checkpointOnClosetrue

4)定义 Sink

Flume常用Sinks有Log Sink HDFS Sink Avro Sink Kafka Sink ,当然也可以自定义Sink。

4.1) Logger Sink

Logger Sink以INFO 级别的日志记录到log日志中,这种方式通常用于测试。

Property NameDefaultDescription
type 类型指定:logger
maxBytesToLog16能够记录的最大Event Body字节数

[ 案例一:监控端口数据 ]

# 定义sink,从端拿到的数据以log日志的形式打印到控制台上
a1.sinks.k1.type = logger

4.2) HDFS Sink

Property NameDefaultDescription
type 指定类型:hdfs
hdfs.path HDFS的路径 hdfs://namenode/flume/webdata/
hdfs.filePrefixFlumeData保存数据文件的前缀名
maxBytesToLog16能够记录的最大Event Body字节数
hdfs.fileSuffix保存数据文件的后缀名
hdfs.inUsePrefix临时写入的文件前缀名
hdfs.inUseSuffix.tmp临时写入的文件后缀名
hdfs.rollInterval30间隔多长将临时文件滚动成最终目标文件,单位:秒, 如果设置成0,则表示不根据时间来滚动文件
hdfs.rollSize1024当临时文件达到多少(单位:bytes)时,滚动成目标文件, 如果设置成0,则表示不根据临时文件大小来滚动文件
hdfs.rollCount10当 events 数据达到该数量时候,将临时文件滚动成目标文件,如果设置成0,则表示不根据events数据来滚动文件
hdfs.idleTimeout0当目前被打开的临时文件在该参数指定的时间(秒)内, 没有任何数据写入,则将该临时文件关闭并重命名成目标文件
hdfs.batchSize100每个批次刷新到 HDFS 上的 events 数量
hdfs.codeC文件压缩格式,包括:gzip, bzip2, lzo, lzop, snappy
hdfs.fileTypeSequenceFile文件格式,包括:SequenceFile, DataStream,CompressedStre, 当使用DataStream时候,文件不会被压缩,不需要设置hdfs.codeC; 当使用CompressedStream时候,必须设置一个正确的hdfs.codeC值;
hdfs.maxOpenFiles5000最大允许打开的HDFS文件数,当打开的文件数达到该值,最早打开的文件将会被关闭
hdfs.minBlockReplicasHDFS副本数,写入 HDFS 文件块的最小副本数。 该参数会影响文件的滚动配置,一般将该参数配置成1,才可以按照配置正确滚动文件
hdfs.writeFormatWritable写 sequence 文件的格式。包含:Text, Writable(默认)
hdfs.callTimeout10000执行HDFS操作的超时时间(单位:毫秒)
hdfs.threadsPoolSize10hdfs sink 启动的操作HDFS的线程数
hdfs.rollTimerPoolSize1hdfs sink 启动的根据时间滚动文件的线程数
hdfs.kerberosPrincipalHDFS安全认证kerberos配置
hdfs.kerberosKeytabHDFS安全认证kerberos配置
hdfs.proxyUser代理用户
hdfs.roundfalse是否启用时间上的”舍弃”
hdfs.roundValue1时间上进行“舍弃”的值
hdfs.roundUnitsecond时间上进行”舍弃”的单位,包含:second,minute,hour
hdfs.timeZoneLocal Time时区。
hdfs.useLocalTimeStampfalse是否使用当地时间
hdfs.closeTries 0Numberhdfs sink 关闭文件的尝试次数;如果设置为1,当一次关闭文件失败后,hdfs sink将不会再次尝试关闭文件, 这个未关闭的文件将会一直留在那,并且是打开状态; 设置为0,当一次关闭失败后,hdfs sink会继续尝试下一次关闭,直到成功
hdfs.retryInterval180hdfs sink 尝试关闭文件的时间间隔, 如果设置为0,表示不尝试,相当于于将hdfs.closeTries设置成1
serializerTEXT序列化类型
serializer.*

[案例二:实时读取本地文件到HDFS ]
[案例三:实时读取目录文件到HDFS ]

#定义sink
a2.sinks.k2.type = hdfs
a2.sinks.k2.hdfs.path = hdfs://bigdata111:9000/flume/%Y%m%d/%H
#上传文件的前缀
a2.sinks.k2.hdfs.filePrefix = logs-
#是否按照时间滚动文件夹
a2.sinks.k2.hdfs.round = true
#多少时间单位创建一个新的文件夹
a2.sinks.k2.hdfs.roundValue = 1
#重新定义时间单位
a2.sinks.k2.hdfs.roundUnit = hour
#是否使用本地时间戳
a2.sinks.k2.hdfs.useLocalTimeStamp = true
#积攒多少个Event才flush到HDFS一次
a2.sinks.k2.hdfs.batchSize = 1000
#设置文件类型,可支持压缩
a2.sinks.k2.hdfs.fileType = DataStream
#多久生成一个新的文件
a2.sinks.k2.hdfs.rollInterval = 600
#设置每个文件的滚动大小
a2.sinks.k2.hdfs.rollSize = 134217700
#文件的滚动与Event数量无关
a2.sinks.k2.hdfs.rollCount = 0
#最小副本数
a2.sinks.k2.hdfs.minBlockReplicas = 1

4.3) Avro Sink

Property NameDefaultDescription
type 指定类型:avro.
hostname 主机名或IP
port 端口号
batch-size100批次处理Event数
connect-timeout20000连接超时时间
request-timeout20000请求超时时间
compression-typenone压缩类型,“none” or “deflate”.
compression-level6压缩级别,0表示不压缩,1-9数字越大,压缩比越高
sslfalse使用ssl加密

[案例四:Flume与Flume之间数据传递 ]

# 3.sink1
a1.sinks.k1.type = avro
a1.sinks.k1.hostname = bigdata111
a1.sinks.k1.port = 4141

# sink2
a1.sinks.k2.type = avro
a1.sinks.k2.hostname = bigdata111
a1.sinks.k2.port = 4142

4.4)Kafka Sink

Property NameDefaultDescription
type 指定类型:org.apache.flume.sink.kafka.KafkaSink
kafka.bootstrap.servers kafka服务地址
kafka.topicdefault-flume-topickafka Topic
flumeBatchSize100批次写入kafka Event数

[案例五:Flume对接kafka ]

# sink
a1.sinks.k1.type = org.apache.flume.sink.kafka.KafkaSink
a1.sinks.k1.brokerList = bigdata111:9092,bigdata112:9092,bigdata113:9092
a1.sinks.k1.topic = calllog
a1.sinks.k1.batchSize = 20
a1.sinks.k1.requiredAcks = 1

四、案例:


案例一:监控端口数据

目标:Flume监控一端Console,另一端Console发送消息,使被Flume收集监控端的数据实时打印到 Linux 控制台。

Flume Agent 配置文件 flume-telnet.conf

#定义Agent
a1.sources = r1
a1.sinks = k1
a1.channels = c1

#定义source
a1.sources.r1.type = netcat
a1.sources.r1.bind = bigdata111
a1.sources.r1.port = 44444

# 定义sink,拿到的数据以log日志的形式打印到控制台上
a1.sinks.k1.type = logger

# 定义channel
a1.channels.c1.type = memory
a1.channels.c1.capacity = 1000
a1.channels.c1.transactionCapacity = 100

# 双向链接
a1.sources.r1.channels = c1
a1.sinks.k1.channel = c1

启动:

/opt/module/flume-1.8.0/bin/flume-ng agent \\
--conf /opt/module/flume1.8.0/conf/ \\
--name a1 \\
--conf-file /opt/module/flume-1.8.0/jobconf/flume-telnet.conf \\
-Dflume.root.logger==INFO,console

案例二:实时读取本地文件到HDFS

创建flume-hdfs.conf文件

# 定义Agent
a2.sources = r2
a2.sinks = k2
a2.channels = c2


# 定义source
a2.sources.r2.type = exec
a2.sources.r2.command = tail -F /opt/plus
a2.sources.r2.shell = /bin/bash -c


#定义sink
a2.sinks.k2.type = hdfs
a2.sinks.k2.hdfs.path = hdfs://bigdata111:9000/flume/%Y%m%d/%H
#上传文件的前缀
a2.sinks.k2.hdfs.filePrefix = logs-
#是否按照时间滚动文件夹
a2.sinks.k2.hdfs.round = true
#多少时间单位创建一个新的文件夹
a2.sinks.k2.hdfs.roundValue = 1
#重新定义时间单位
a2.sinks.k2.hdfs.roundUnit = hour
#是否使用本地时间戳
a2.sinks.k2.hdfs.useLocalTimeStamp = true
#积攒多少个Event才flush到HDFS一次
a2.sinks.k2.hdfs.batchSize = 1000
#设置文件类型,可支持压缩
a2.sinks.k2.hdfs.fileType = DataStream
#多久生成一个新的文件
a2.sinks.k2.hdfs.rollInterval = 600
#设置每个文件的滚动大小
a2.sinks.k2.hdfs.rollSize = 134217700
#文件的滚动与Event数量无关
a2.sinks.k2.hdfs.rollCount = 0
#最小副本数
a2.sinks.k2.hdfs.minBlockReplicas = 1

# Use a channel which buffers events in memory
a2.channels.c2.type = memory
a2.channels.c2.capacity = 1000
a2.channels.c2.transactionCapacity = 1000

# Bind the source and sink to the channel
a2.sources.r2.channels = c2
a2.sinks.k2.channel = c2

案例三:实时读取目录文件到HDFS

目标:使用flume监听整个目录的文件

创建配置文件 flume-dir.conf

#1 Agent
a3.sources = r3
a3.sinks = k3
a3.channels = c3

#2 source
#监控目录的类型
a3.sources.r3.type = spooldir
#监控目录的路径
a3.sources.r3.spoolDir = /opt/module/flume1.8.0/upload
#哪个文件上传hdfs,然后给这个文件添加一个后缀
a3.sources.r3.fileSuffix = .COMPLETED
a3.sources.r3.fileHeader = true
#忽略所有以.tmp结尾的文件,不上传(可选)
a3.sources.r3.ignorePattern = ([^ ]*\\.tmp)

# 3 sink
a3.sinks.k3.type = hdfs
a3.sinks.k3.hdfs.path = hdfs://bigdata111:9000/flume/%H
#上传文件的前缀
a3.sinks.k3.hdfs.filePrefix = upload-
#是否按照时间滚动文件夹
a3.sinks.k3.hdfs.round = true
#多少时间单位创建一个新的文件夹
a3.sinks.k3.hdfs.roundValue = 1
#重新定义时间单位
a3.sinks.k3.hdfs.roundUnit = hour
#是否使用本地时间戳
a3.sinks.k3.hdfs.useLocalTimeStamp = true
#积攒多少个Event才flush到HDFS一次
a3.sinks.k3.hdfs.batchSize = 100
#设置文件类型,可支持压缩
a3.sinks.k3.hdfs.fileType = DataStream
#多久生成一个新的文件
a3.sinks.k3.hdfs.rollInterval = 600
#设置每个文件的滚动大小大概是128M
a3.sinks.k3.hdfs.rollSize = 134217700
#文件的滚动与Event数量无关
a3.sinks.k3.hdfs.rollCount = 0
#最小副本数
a3.sinks.k3.hdfs.minBlockReplicas = 1

# Use a channel which buffers events in memory
a3.channels.c3.type = memory
a3.channels.c3.capacity = 1000
a3.channels.c3.transactionCapacity = 100

# Bind the source and sink to the channel
a3.sources.r3.channels = c3
a3.sinks.k3.channel = c3

执行测试:执行如下脚本后,请向upload文件夹中添加文件试试

/opt/module/flume1.8.0/bin/flume-ng agent \\
--conf /opt/module/flume1.8.0/conf/ \\
--name a3 \\
--conf-file /opt/module/flume1.8.0/jobconf/flume-dir.conf

尖叫提示: 在使用Spooling Directory Source时

  1. 不要在监控目录中创建并持续修改文件
  2. 上传完成的文件会以.COMPLETED结尾
  3. 被监控文件夹每500毫秒扫描一次文件变动

案例四:Flume与Flume之间数据传递


(1)单Flume多Channel、Sink


目标:使用flume1监控文件变动,flume1将变动内容传递给flume-2,flume-2负责存储到HDFS。同时flume1将变动内容传递给flume-3,flume-3负责输出到local
分步实现:

1) flume1.conf

# 1.agent     source->channel对应关系1/n    sink->channel对应关系1/1
a1.sources = r1
a1.sinks = k1 k2
a1.channels = c1 c2
# 将数据流复制给多个channel
a1.sources.r1.selector.type = replicating

# 2.source
a1.sources.r1.type = exec
a1.sources.r1.command = tail -F /opt/plus
a1.sources.r1.shell = /bin/bash -c

# 3.sink1
a1.sinks.k1.type = avro
a1.sinks.k1.hostname = bigdata111
a1.sinks.k1.port = 4141

# sink2
a1.sinks.k2.type = avro
a1.sinks.k2.hostname = bigdata111
a1.sinks.k2.port = 4142

# 4.channel—1
a1.channels.c1.type = memory
a1.channels.c1.capacity = 1000
a1.channels.c1.transactionCapacity = 100

# 4.channel—2
a1.channels.c2.type = memory
a1.channels.c2.capacity = 1000
a1.channels.c2.transactionCapacity = 100

# Bind the source and sink to the channel
a1.sources.r1.channels = c1 c2
a1.sinks.k1.channel = c1
a1.sinks.k2.channel = c2

2) flume-2.conf,用于接收flume1的event,同时产生1个channel和1个sink,将数据输送给hdfs:

# 1 agent
a2.sources = r1
a2.sinks = k1
a2.channels = c1

# 2 source
a2.sources.r1.type = avro
a2.sources.r1.bind = bigdata111
a2.sources.r1.port = 4141

# 3 sink
a2.sinks.k1.type = hdfs
a2.sinks.k1.hdfs.path = hdfs://bigdata111:9000/flume2/%H
#上传文件的前缀
a2.sinks.k1.hdfs.filePrefix = flume2-
#是否按照时间滚动文件夹
a2.sinks.k1.hdfs.round = true
#多少时间单位创建一个新的文件夹
a2.sinks.k1.hdfs.roundValue = 1
#重新定义时间单位
a2.sinks.k1.hdfs.roundUnit = hour
#是否使用本地时间戳
a2.sinks.k1.hdfs.useLocalTimeStamp = true
#积攒多少个Event才flush到HDFS一次
a2.sinks.k1.hdfs.batchSize = 100
#设置文件类型,可支持压缩
a2.sinks.k1.hdfs.fileType = DataStream
#多久生成一个新的文件
a2.sinks.k1.hdfs.rollInterval = 600
#设置每个文件的滚动大小大概是128M
a2.sinks.k1.hdfs.rollSize = 134217700
#文件的滚动与Event数量无关
a2.sinks.k1.hdfs.rollCount = 0
#最小副本数
a2.sinks.k1.hdfs.minBlockReplicas = 1


# 4 channel
a2.channels.c1.type = memory
a2.channels.c1.capacity = 1000
a2.channels.c1.transactionCapacity = 100

#5 Bind 
a2.sources.r1.channels = c1
a2.sinks.k1.channel = c1

3) flume-3.conf,用于接收flume1的event,同时产生1个channel和1个sink,将数据输送给本地目录:

#1 agent
a3.sources = r1
a3.sinks = k1
a3.channels = c1

# 2 source
a3.sources.r1.type = avro
a3.sources.r1.bind = bigdata111
a3.sources.r1.port = 4142

#3 sink
a3.sinks.k1.type = file_roll
#备注:此处的文件夹需要先创建好
a3.sinks.k1.sink.directory = /opt/flume3

# 4 channel
a3.channels.c1.type = memory
a3.channels.c1.capacity = 1000
a3.channels.c1.transactionCapacity = 100

# 5 Bind
a3.sources.r1.channels = c1
a3.sinks.k1.channel = c1

尖叫提示:file_roll 为 linux 本地,输出的本地目录必须是已经存在的目录,如果该目录不存在,并不会创建新的目录。

执行:

$ bin/flume-ng agent --conf conf/ --name a1 --conf-file jobconf/flume1.conf

$ bin/flume-ng agent --conf conf/ --name a2 --conf-file jobconf/flume2.conf

$ bin/flume-ng agent --conf conf/ --name a3 --conf-file jobconf/flume3.conf


(2)多Flume汇总数据到单Flume


目标: flume11监控文件hive.log,flume-22监控某一个端口的数据流,flume11与flume-22将数据发送给flume-33,flume33将最终数据写入到HDFS。


1) flume11.conf,用于监控hive.log文件,同时sink数据到flume-33:

# 1 agent
a1.sources = r1
a1.sinks = k1
a1.channels = c1

# 2 source
a1.sources.r1.type = exec
a1.sources.r1.command = tail -F /opt/hive.log
a1.sources.r1.shell = /bin/bash -c

# 3 sink
a1.sinks.k1.type = avro
a1.sinks.k1.hostname = bigdata113
a1.sinks.k1.port = 4141

# 4 channel
a1.channels.c1.type = memory
a1.channels.c1.capacity = 1000
a1.channels.c1.transactionCapacity = 100

# 5. Bind
a1.sources.r1.channels = c1
a1.sinks.k1.channel = c1

2) flume-22.conf,用于监控端口44444数据流,同时sink数据到flume-33:

# 1 agent
a2.sources = r1
a2.sinks = k1
a2.channels = c1

# 2 source
a2.sources.r1.type = netcat
a2.sources.r1.bind = bigdata112
a2.sources.r1.port = 44444

#3 sink
a2.sinks.k1.type = avro
a2.sinks.k1.hostname = bigdata113
a2.sinks.k1.port = 4141

# 4 channel
a2.channels.c1.type = memory
a2.channels.c1.capacity = 1000
a2.channels.c1.transactionCapacity = 100

# 5 Bind
a2.sources.r1.channels = c1
a2.sinks.k1.channel = c1

3) flume33.conf,用于接收flume11与flume22发送过来的数据流,最终合并后sink到HDFS:

# 1 agent
a3.sources = r1
a3.sinks = k1
a3.channels = c1

# 2 source
a3.sources.r1.type = avro
a3.sources.r1.bind = bigdata113
a3.sources.r1.port = 4141

# 3 sink
a3.sinks.k1.type = hdfs
a3.sinks.k1.hdfs.path = hdfs://bigdata111:9000/flume3/%H
#上传文件的前缀
a3.sinks.k1.hdfs.filePrefix = flume3-
#是否按照时间滚动文件夹
a3.sinks.k1.hdfs.round = true
#多少时间单位创建一个新的文件夹
a3.sinks.k1.hdfs.roundValue = 1
#重新定义时间单位
a3.sinks.k1.hdfs.roundUnit = hour
#是否使用本地时间戳
a3.sinks.k1.hdfs.useLocalTimeStamp = true
#积攒多少个Event才flush到HDFS一次
a3.sinks.k1.hdfs.batchSize = 100
#设置文件类型,可支持压缩
a3.sinks.k1.hdfs.fileType = DataStream
#多久生成一个新的文件
a3.sinks.k1.hdfs.rollInterval = 600
#设置每个文件的滚动大小大概是128M
a3.sinks.k1.hdfs.rollSize = 134217700
#文件的滚动与Event数量无关
a3.sinks.k1.hdfs.rollCount = 0
#最小冗余数
a3.sinks.k1.hdfs.minBlockReplicas = 1

# 4 channel
a3.channels.c1.type = memory
a3.channels.c1.capacity = 1000
a3.channels.c1.transactionCapacity = 100

# 5 Bind
a3.sources.r1.channels = c1
a3.sinks.k1.channel = c1

执行:

$ bin/flume-ng agent --conf conf/ --name a3 --conf-file jobconf/flume33.conf
$ bin/flume-ng agent --conf conf/ --name a2 --conf-file jobconf/flume22.conf
$ bin/flume-ng agent --conf conf/ --name a1 --conf-file jobconf/flume11.conf

案例五:Flume对接kafka


flume-kafka.conf

# define
a1.sources = r1
a1.sinks = k1
a1.channels = c1

# source
a1.sources.r1.type = exec
a1.sources.r1.command = tail -F -c +0 /opt/jars/calllog.csv
a1.sources.r1.shell = /bin/bash -c

# sink
a1.sinks.k1.type = org.apache.flume.sink.kafka.KafkaSink
a1.sinks.k1.brokerList = bigdata111:9092,bigdata112:9092,bigdata113:9092
a1.sinks.k1.topic = calllog
a1.sinks.k1.batchSize = 20
a1.sinks.k1.requiredAcks = 1

# channel
a1.channels.c1.type = memory
a1.channels.c1.capacity = 1000
a1.channels.c1.transactionCapacity = 100

# bind
a1.sources.r1.channels = c1
a1.sinks.k1.channel = c1

执行:

/opt/module/flume-1.8.0/bin/flume-ng agent --conf /opt/module/flume-1.8.0/conf/ --name a1 --conf-file /opt/jars/flume2kafka.conf

案例六:kafka对接Flume


kafka2flume.conf

agent.sources = kafkaSource
agent.channels = memoryChannel
agent.sinks = hdfsSink

# The channel can be defined as follows.
agent.sources.kafkaSource.channels = memoryChannel
agent.sources.kafkaSource.type=org.apache.flume.source.kafka.KafkaSource
agent.sources.kafkaSource.zookeeperConnect=bigdata111:2181,bigdata112:2181,bigdata113:2181
agent.sources.kafkaSource.topic=calllog
#agent.sources.kafkaSource.groupId=flume
agent.sources.kafkaSource.kafka.consumer.timeout.ms=100


agent.channels.memoryChannel.type=memory
agent.channels.memoryChannel.capacity=10000
agent.channels.memoryChannel.transactionCapacity=1000
agent.channels.memoryChannel.type=memory
agent.channels.memoryChannel.capacity=10000
agent.channels.memoryChannel.transactionCapacity=1000


# the sink of hdfs
agent.sinks.hdfsSink.type=hdfs
agent.sinks.hdfsSink.channel = memoryChannel
agent.sinks.hdfsSink.hdfs.path=hdfs://bigdata111:9000/kafka2flume
agent.sinks.hdfsSink.hdfs.writeFormat=Text
agent.sinks.hdfsSink.hdfs.fileType=DataStream
#这两个不配置,会产生大量的小文件
agent.sinks.hdfsSink.hdfs.rollSize=0
agent.sinks.hdfsSink.hdfs.rollCount=0

案例七:Flume拦截器

(1)时间戳拦截器

Timestamp.conf

#1.定义agent名, source、channel、sink的名称
a4.sources = r1
a4.channels = c1
a4.sinks = k1

#2.具体定义source
a4.sources.r1.type = spooldir
a4.sources.r1.spoolDir = /opt/module/flume-1.8.0/upload

#定义拦截器,为文件最后添加时间戳
a4.sources.r1.interceptors = timestamp
a4.sources.r1.interceptors.timestamp.type = org.apache.flume.interceptor.TimestampInterceptor$Builder

#具体定义channel
a4.channels.c1.type = memory
a4.channels.c1.capacity = 10000
a4.channels.c1.transactionCapacity = 100


#具体定义sink
a4.sinks.k1.type = hdfs
a4.sinks.k1.hdfs.path = hdfs://bigdata111:9000/flume-interceptors/%H
a4.sinks.k1.hdfs.filePrefix = events-
a4.sinks.k1.hdfs.fileType = DataStream

#不按照条数生成文件
a4.sinks.k1.hdfs.rollCount = 0
#HDFS上的文件达到128M时生成一个文件
a4.sinks.k1.hdfs.rollSize = 134217728
#HDFS上的文件达到60秒生成一个文件
a4.sinks.k1.hdfs.rollInterval = 60

#组装source、channel、sink
a4.sources.r1.channels = c1
a4.sinks.k1.channel = c1

启动命令:

/opt/module/flume-1.8.0/bin/flume-ng agent -n a4 \\
-f /opt/module/flume-1.8.0/jobconf/flume-interceptors.conf \\
-c /opt/module/flume-1.8.0/conf \\
-Dflume.root.logger=INFO,console

(2)主机名拦截器

Host.conf

#1.定义agent
a1.sources= r1
a1.sinks = k1
a1.channels = c1

#2.定义source
a1.sources.r1.type = exec
a1.sources.r1.channels = c1
a1.sources.r1.command = tail -F /opt/plus
#拦截器
a1.sources.r1.interceptors = i1
a1.sources.r1.interceptors.i1.type = host

#参数为true时用IP192.168.1.111,参数为false时用主机名,默认为true
a1.sources.r1.interceptors.i1.useIP = false
a1.sources.r1.interceptors.i1.hostHeader = agentHost

 #3.定义sinks
a1.sinks.k1.type=hdfs
a1.sinks.k1.channel = c1
a1.sinks.k1.hdfs.path = hdfs://bigdata111:9000/flumehost/%agentHost
a1.sinks.k1.hdfs.filePrefix = plus_%agentHost
#往生成的文件加后缀名.log
a1.sinks.k1.hdfs.fileSuffix = .log
a1.sinks.k1.hdfs.fileType = DataStream
a1.sinks.k1.hdfs.writeFormat = Text
a1.sinks.k1.hdfs.rollInterval = 10
a1.sinks.k1.hdfs.useLocalTimeStamp = true
 
a1.channels.c1.type = memory
a1.channels.c1.capacity = 1000
a1.channels.c1.transactionCapacity = 100
 
a1.sources.r1.channels = c1
a1.sinks.k1.channel = c1

启动命令:

bin/flume-ng agent -c conf/ -f jobconf/host.conf -n a1 -Dflume.root.logger=INFO,console

(3)UUID拦截器

uuid.conf

a1.sources = r1
a1.sinks = k1
a1.channels = c1

a1.sources.r1.type = exec
a1.sources.r1.channels = c1
a1.sources.r1.command = tail -F /opt/plus
a1.sources.r1.interceptors = i1
#type的参数不能写成uuid,得写具体,否则找不到类
a1.sources.r1.interceptors.i1.type = org.apache.flume.sink.solr.morphline.UUIDInterceptor$Builder
#如果UUID头已经存在,它应该保存
a1.sources.r1.interceptors.i1.preserveExisting = true
a1.sources.r1.interceptors.i1.prefix = UUID_

#如果sink类型改为HDFS,那么在HDFS的文本中没有headers的信息数据
a1.sinks.k1.type = logger

a1.channels.c1.type = memory
a1.channels.c1.capacity = 1000
a1.channels.c1.transactionCapacity = 100

a1.sources.r1.channels = c1
a1.sinks.k1.channel = c1

bin/flume-ng agent -c conf/ -f jobconf/uuid.conf -n a1 -Dflume.root.logger==INFO,console

(4)查询替换拦截器

search.conf

以上是关于Flume 案例总结。的主要内容,如果未能解决你的问题,请参考以下文章

Flume 案例总结。

flume 监控目录操作

Flume配置案例

flume快速入门及常用案例整理

flume快速入门及常用案例整理

flume案例支持