Flume 官网下载地址:https://flume.apache.org/download.html

Flume 1.9用户手册中文版:Flume 1.9用户手册中文版 — 可能是目前翻译最完整的版本了

flume的配置:

1.解压

linux>tar -xf apache-flume-1.9.0-bin.tar

2.移动目录

linux>mv flumexx   /opt/install/flume

3.进入主配目录准备flume-env.sh文件

linux>cd flume/conf
linux> cp flume-env.sh.template  flume-env.sh

4.修改conf下的flume-env.sh 中的java的home

linux>vi flume-env.sh

export JAVA_HOME=/xxx/xx/xx

5.配置例子文件

注意:最后的值不要有多余的空格,否则有可能会报错,比如:test.sinks.k1.type = logger logger后面最好不要有空格

linux>vi flume/example.conf


# example.conf: A single-node Flume configuration #//实例conf:单节点flume配置

#//test为(agent)名字可以随便起一个,起好名字后此conf文件所有的配置都是这个名字

# Name the components on this agent  #//命名(agent)此代理上的组件
test.sources = s1            #//源 命名为 s1 
test.sinks = k1              #//下沉 命名为 k1
test.channels = c1           #//通道  命名为 c1

# Describe/configure the source   #//描述/配置源
test.sources.s1.type = netcat     #//设置源类型 = 网络
test.sources.s1.bind = localhost  #//设置源绑定地址 = 本地
test.sources.s1.port = 12345      #//设置源端口 = 12345

# Describe the sink            #//描述sink
test.sinks.k1.type = logger    #//sink类型 = logger

# Use a channel which buffers events in memory #//使用在内存中缓冲事件的通道 (注:一般生产环境不用,内存不可靠停电会有问题)
test.channels.c1.type = memory     #//通道类型 = memory 
test.channels.c1.capacity = 1000    #//容量 = 1000
test.channels.c1.transactionCapacity = 100 #//事务处理能力 = 100

# Bind the source and sink to the channel #//将 (source s1)源 和 (sink k1)接收器 绑定到通道
test.sources.s1.channels = c1  #//设置源绑定通道 = c1
test.sinks.k1.channel = c1    #//设置sink绑定通道 = c1

6.本地安装连接程序连接至端口测试

安装telnet依赖
linux>yum -y install telnet-server
linux>yum -y install telnet*
linux> telnet localhost 12345

或者

linux> yum -y install nc
linux> nc localhost 12345
或者
linux> nc -lk 12345

配置完后可以启动flume查看

7.执行命令:

linux>bin/flume-ng agent --conf conf --conf-file example.conf --name test -Dflume.root.logger=INFO,console

解:--conf-file 指定的文件名 --name 指定agent名字(example.conf中的test)

报错:

[ERROR - org.apache.flume.source.NetcatSource.start(NetcatSource.java:169)] Unable to bind to socket. Exception follows.
java.net.BindException: 地址已在使用

解决办法:注意启动顺序,先启动flume程序再启动telnet或nc试试

8.连接接口随便输入数据查看结果

linux> telnet localhost 12345
zhangsan

结果:成功监听到端口,采集到数据

kafka 运行内存配置 kafka调整内存_大数据

9.flume采集静态日志/数据到hdfs上

linux>vi flume/hdfs.conf
# Name the components on this agent  #//命名(agent)此代理上的组件
test.sources = s1            #//源 命名为 s1 
test.sinks = k1              #//下沉 命名为 k1
test.channels = c1           #//通道  命名为 c1

# Describe/configure the source    #//描述/配置源
test.sources.s1.type = spooldir    #//设置源类型 = 假脱(用于监控的目录)
test.sources.s1.spoolDir = /root/logs   #//spoolDir监控 这个目录下的文件(这个目录是linux下的)
test.sources.s1.fileHeader = true    #//文件标题 = true 

# Describe the sink                  #//描述sink
test.sinks.k1.type = hdfs            #//sink类型 = hdfs
#指定目录, flum帮做目的替换
test.sinks.k1.hdfs.path = /flume/events/%y-%m-%d/%H%M/ #//指定sink时hdfs目录路径并以时间命名
#文件的命名, 前缀
test.sinks.k1.hdfs.filePrefix = events-    #//设置文件前缀
#10 分钟就改目录
test.sinks.k1.hdfs.round = true        #//是否轮询
test.sinks.k1.hdfs.roundValue = 10    #//设置值 10分钟轮询1次
test.sinks.k1.hdfs.roundUnit = minute  #//单位分钟

#以下条件谁先满足谁先触发
#文件滚动之前的等待时间(秒)
test.sinks.k1.hdfs.rollInterval = 3  #//滚动间隔
#文件滚动的大小限制(bytes)
test.sinks.k1.hdfs.rollSize = 20    #//卷大小
#写入多少个event数据后滚动文件(事件个数)
test.sinks.k1.hdfs.rollCount = 5     #//滚动计数
#5个事件就往里面写入
test.sinks.k1.hdfs.batchSize = 1   #//批处理大小
#用本地时间格式化目录
test.sinks.k1.hdfs.useLocalTimeStamp = true    #//使用本地时间戳
test.sinks.k1.hdfs.fileType = DataStream        #//文件类型=数据流

# Use a channel which buffers events in memory #//使用在内存中缓冲事件的通道 (注:一般生产环境不用,内存不可靠停电会有问题)
test.channels.c1.type = memory     #//通道类型 = memory 
test.channels.c1.capacity = 1000    #//容量 = 1000
test.channels.c1.transactionCapacity = 100 #//事务处理能力 = 100

# Bind the source and sink to the channel #//将 (source s1)源 和 (sink k1)接收器 绑定到通道
test.sources.s1.channels = c1    #//设置源绑定通道 = c1
test.sinks.k1.channel = c1    #//设置sink绑定通道 = c1

--执行

linux>bin/flume-ng agent --conf conf --conf-file hdfs.conf --name test -Dflume.root.logger=INFO,console
linux>vi test.log
eeeeeeeee
aaaaaaaaa
xxxxxxxxx

复制文件到监控目录下 --cp  test.log /root/logs
--观察 hdfs上的变化  /flume/...

注:如果短时间往里面再加入文件 hdfs上不会更改目录 10分钟后才改目录

kafka 运行内存配置 kafka调整内存_大数据_02

kafka 运行内存配置 kafka调整内存_kafka 运行内存配置_03

 运行后文件后缀会变

kafka 运行内存配置 kafka调整内存_大数据_04

10.flume采集动态日志/数据文件到hdfs上:
模拟生成日志的脚本:

linux>while true;do echo 'access log ...' >> /root/logs/test.log; sleep 0.5;done

linux>tail -F  test.log  #查看跟进文件

编辑conf配置文件

linux>vi flume/fileSinkhdfs.conf

# Name the components on this agent  #//命名(agent)此代理上的组件
test.sources = s1            #//源 命名为 s1 
test.sinks = k1              #//下沉 命名为 k1
test.channels = c1           #//通道  命名为 c1

# Describe/configure the source      #//描述/配置源
test.sources.s1.type = exec     #//设置源类型 = 执行 (用于命令)
test.sources.s1.command = tail -F /root/logs/test.log  #//命令


# Describe the sink        #//描述sink
test.sinks.k1.type = hdfs    #//sink类型 = hdfs
test.sinks.k1.hdfs.path = /flume/events/%y-%m-%d/%H%M/    #//指定sink时hdfs目录路径并以时间命名
test.sinks.k1.hdfs.filePrefix = events-    #//设置文件前缀
test.sinks.k1.hdfs.round = true            #//是否轮询
test.sinks.k1.hdfs.roundValue = 10        #//设置值 10分钟轮询1次
test.sinks.k1.hdfs.roundUnit = minute     #//单位分钟
test.sinks.k1.hdfs.rollInterval = 3        #//滚动间隔
test.sinks.k1.hdfs.rollSize = 500         #//卷大小
test.sinks.k1.hdfs.rollCount = 5           #//滚动计数
test.sinks.k1.hdfs.batchSize = 100        #//批处理大小
test.sinks.k1.hdfs.useLocalTimeStamp = true     #//使用本地时间戳
test.sinks.k1.hdfs.fileType = DataStream    #//文件类型=数据流


# Use a channel which buffers events in memory    #//使用在内存中缓冲事件的通道 (注:一般生产环境不用,内存不可靠停电会有问题)
test.channels.c1.type = memory    #//通道类型 = memory 
test.channels.c1.capacity = 1000    #//容量 = 1000
test.channels.c1.transactionCapacity = 100    #//事务处理能力 = 100

# Bind the source and sink to the channel    #//将 (source s1)源 和 (sink k1)接收器 绑定到通道
test.sources.s1.channels = c1    #//设置源绑定通道 = c1
test.sinks.k1.channel = c1     #//设置sink绑定通道 = c1

先执行:

linux>while true;do echo 'access log ...' >> /root/logs/test.log; sleep 0.5;done

再执行:

linux>bin/flume-ng agent --conf conf --conf-file fileSinkhdfs.conf --name test -Dflume.root.logger=INFO,console

结果:

kafka 运行内存配置 kafka调整内存_大数据_05

Memory Channel
读写速度快,但是存储数据量小,Flume进程挂掉、服务器停机或者重启都会导致数据丢失
参数:

type
    channel类型memory。

capacity
    默认值:100
    channel中存储的最大event数

transactionCapacity
    默认值:100
    一次事务中写入和读取的event最大数

keep-alive
    默认值:3
    在Channel中写入或读取event等待完成的超时时间,单位:秒
 
byteCapacityBufferPercentage
    默认值:20
    缓冲空间占Channel容量(byteCapacity)的百分比,为event中的头信息保留了空间,单位:百分比
    
byteCapacity
    默认值为Flume堆内存的80%
    Channel占用内存的最大容量,如果该参数设置为0则强制设置Channel占用内存为200G。

 例:

linux>vi xxx.conf
.............
.............
# channel
# channel中存储的最大event数为3000000,一次事务中可读取或添加的event数为20000
agent_name.channels.channel_name.type = memory
agent_name.channels.channel_name.capacity = 10000
agent_name.channels.channel_name.transactionCapacity = 10000
.............
.............

File Channel
将 event 写入磁盘文件,与 Memory Channel 相比存储容量大,无数据丢失风险。File Channle 数据存储路径可以配置多磁盘文件路径,通过磁盘并行写入提高FileChannel 性能。Flume 将 Event 顺序写入到 File Channel 文件的末尾,在配置文件中通过设置 maxFileSize 参数配置数据文件大小,当被写入的文件大小达到上限时 Flume 会重新创建新的文件存储写入的 Event。当然数据文件数量也不会无限增长,当一个已关闭的只读数据文件中的 Event 被读取完成,并且 Sink 已经提交读取完成的事务,则 Flume 将删除存储该数据的文件。Flume 通过设置检查点和备份检查点实现在 Agent 重启之后快速将 File Channle 中的数据按顺序回放到内存中,保证在 Agent 失败重启后仍然能够快速安全地提供服务。
参数:

type
    channel类型为file

checkpointDir
    检查点目录,默认在启动flume用户目录下创建,建议单独配置磁盘路径
    
useDualCheckpoints
    默认值:false
    是否开启备份检查点,建议设置为true开启备份检查点,备份检查点的作用是当Agent意外出错导致写入检查点文件异常,在重新启动File Channel时通过备份检查点将数据回放到内存中,如果不开启备份检查点,在数据回放的过程中发现检查点文件异常会对所有数据进行全回放,全回放的过程相当耗时

backupCheckpointDir
    备份检查点目录,最好不要和检查点目录(checkpointDir)在同一块磁盘上

checkpointInterval
    默认值:30000
    每次写检查点的时间间隔,单位:毫秒

dataDirs:
    存储event信息磁盘存储路径,建议配置多块盘的多个路径,通过磁盘的并行写入来提高file channel性能,多个磁盘路径用逗号隔开

transactionCapacity
    默认值:10000
    一次事务中写入和读取的event最大数

maxFileSize
    默认值:2146435071
    每个数据文件的最大大小,单位:字节

minimumRequiredSpace
    磁盘路径最小剩余空间,如果磁盘剩余空间小于设置值,则不再写入数据

capacity
    filechannel可容纳的最大event数

keep-alive
    默认值:3
    在Channel中写入或读取event等待完成的超时时间,单位:秒

例:

linux>vi xxx.conf
.............
.............
# channel
# channel中存储的最大event数为3000000,一次事务中可读取或添加的event数为20000
# 检查点路径为/usr/local/flume/checkpoint,数据存放路径为/data1, /data2,开启备份检查点,备份检查点路径为/data/flume/backup/checkpoint
agent_name.channels.channel_name.type = file
agent_name.channels.channel_name.dataDirs = ${log_path}/dataDir1, ${log_path}/dataDir2
agent_name.channels.channel_name.checkpointDir = ${exec_log_path}/stat_info_checkpointDir
agent_name.channels.channel_name.useDualCheckpoints = true 
agent_name.channels.channel_name.backupCheckpointDir = /data/flume/backup/checkpoint
agent_name.channels.channel_name.capacity = 3000000
agent_name.channels.channel_name.transactionCapacity = 20000
agent_name.channels.channel_name.keep-alive = 5
.............
.............

Kafka Channel
Kafka作为Channel存储,Kafka是分布式、可扩展、高容错、高吞吐的分布式系统,Kafka通过优秀的架构设计充分利用磁盘顺序特性,完成高效的消息发布和订阅。

Kafka Channel可以在日志收集层只配置Source组件和Kafka Channel组件,不需要再配置Sink组件,减少了日志收集层启动的进程数并且有效降低服务器内存、磁盘等资源使用率,日志汇聚层可以只配置Kafka Channel和Sink,不需要再配置Source,减少日志汇聚层的进程数,这样的配置既能降低服务器的资源使用率又能减少Event在网络之间的传输,有效提高日志采集系统的性能。
参数:

type
    Kafka Channel类型,值为org.apache.flume.channel.kafka.KafkaChannel
    
kafka.bootstrap.servers
    Kafka broker列表,格式为ip1:port1,ip2:port2…,建议配置多个值提高容错能力,多个值之间用逗号隔开

kafka.topic:
    默认值:flume-channel
    topic名称

kafka.consumer.group.id
    默认值:flume
    Consumer组id, Kafka Channel使用 consumer.group.id 注册到Kafka,该值是连接kafka集群的唯一值,同一组内可以有多个Consumer,多个Consumer之间是互不干扰的,一个主题下的一条消息只能被同一组内的一个Consumer消费,其中的一个Consumer消费失败其他的Consumer会继续消费
    基于这个特性,可以有多个Agent的KafkaChannel使用相同的consumer.group.id,当一个Agent运行失败则其他Agent可以继续消费,很容易地提高了消息的容错能力

parseAsFlumeEvent
    默认值:true
    是否以Avro FlumeEvent模式写入到Kafka Channel中
    如果写入到Kafka Channel中主题的Producer只有Flume Source,则该参数应该设置为true
    如果有其他Producer也同时在向同一主题写数据则该参数应该设置为false
    Flume Source写入到Kafka的消息在Kafka外部需要使用flume-ng-sdk提供的org.apache. flume.source.avro.AvroFlumeEvent类解析

migrateZookeeperOffsets
    默认值:true
    是否迁移Zookeeper中存储的Consumer消费的偏移量到Kafka中,主要是为了兼容Kafka0.9以下版本的Kafka
    Kafka 0.9以下版本Consumer消费的偏移量保存在Zookeeper中
    Kafka 0.9之后的版本开始将偏移量保存到Kafka的一个主题中

pollTimeout
    默认值:500毫秒
    轮询超时时间

kafka.consumer.auto.offset.reset
    当Kafka中没有Consumer消费的初始偏移量或者当前偏移量在Kafka中不存在(比如数据已经被删除)情况下,Consumer选择从Kafka拉取消息的方式
    earliest表示从最早的偏移量开始拉取
    latest表示从最新的偏移量开始拉取
    none表示如果没有发现该Consumer组之前拉取的偏移量则抛出异常
    官方文档介绍 默认值是latest,但是从源码中查看是earliest

kafka.enable.auto.commit
    默认值:alse
    Consumer是否自动提交偏移量

例:

linux>vi xxx.conf
.............
.............
# channel
agent_name.channels.channel_name.type = org.apache.flume.channel.kafka.KafkaChannel
agent_name.channels.channel_name.kafka.bootstrap.servers = zkServer01:9092, zkServer02:9092 
agent_name.channels.channel_name.kafka.topic = test_channel
agent_name.channels.channel_name.kafka.consumer.group.id = test-consumer
.............
.............

三者区别:

Memory Channel在使用的过程中受内存容量的限制不能缓存大量的消息,并且如果Memory Channel中的消息没来得及写入Sink,此时Agent出现故障就会造成数据丢失。

File Channel虽然能够缓存更多的消息,但如果缓存下来的消息还没有写入Sink,此时Agent出现故障则File Channel中的消息不能被继续使用,直到该Agent重新恢复才能够继续使用File Channel中的消息。

Kafka Channel相对于Memory Channel和File Channel存储容量更大、容错能力更强,弥补了其他两种Channel的短板。