Flume总结

本文详细介绍了Flume在数据传输监控、组件作用、Source类型选择、ChannelSelectors的使用、参数调优、事务机制、数据丢失与重复情况、Channel类型比较以及Flume的负载均衡和故障转移策略。重点讨论了如何通过调整Source的batchSize、增加Sink个数以及选择合适的Channel类型如MemoryChannel和FileChannel来优化Flume性能,确保数据的完整性和一致性。

Flume总结 --huzhan

1、 你是如何实现Flume数据传输的监控的

使用第三方框架 Ganglia 实时监控 Flume。

2 、Flume的 Source,Sink,Channel的作用?你们 Source是什么类型?

1、作用

(1)Source 组件是专门用来收集数据的,可以处理各种类型、各种格式的日志数据,

包括 avro、thrift、exec、jms、spooling directory、netcat、sequence generator、syslog、http、legacy

(2)Channel 组件对采集到的数据进行缓存,可以存放在 Memory 或 File 中。

(3)Sink 组件是用于把数据发送到目的地的组件,目的地包括 HDFS、Logger、avro、

thrift、ipc、file、Hbase、solr、自定义。

2、我公司采用的 Source 类型为

(1)监控后台日志:exec

(2)监控后台产生日志的端口:netcat

Exec spooldir

3、Flume 的Channel Selectors

Channel Selectors,可以让不同的项目日志通过不同的Channel到不同的Sink中去。

官方文档上Channel Selectors 有两种类型:Replicating Channel Selector (default)和Multiplexing Channel Selector

这两种Selector的区别是:Replicating 会 将source过来的events发往所有channel,而Multiplexing可以选择该发往哪些Channel。

4、 Flume 参数调优

1、Source

增加 Source 个(使用 Tair Dir Source 时可增加 FileGroups 个数)可以增大 Source 的读取数据的能力。例如:当某一个目录产生的文件过多时需要将这个文件目录拆分成多个文件目录,同时配置好多个 Source 以保证 Source 有足够的能力获取到新产生的数据。batchSize 参数决定 Source 一次批量运输到 Channel 的 event 条数,适当调大这个参数可以提高 Source 搬运 Event 到 Channel 时的性能。

2、Channel

type 选择 memory 时 Channel 的性能最好,但是如果 Flume 进程意外挂掉可能会丢失数据。type 选择 file 时 Channel 的容错性更好,但是性能上会比 memory channel 差。使用 file Channel 时 dataDirs 配置多个不同盘下的目录可以提高性能。Capacity 参数决定 Channel 可容纳最大的 event 条数。transactionCapacity 参数决定每次 Source 往 channel 里面写的最大 event 条数和每次 Sink 从 channel 里面读的最大 event条数。

transactionCapacity 需要大于 Source 和 Sink 的 batchSize 参数。

3、Sink

增加 Sink 的个数可以增加 Sink 消费 event 的能力。Sink 也不是越多越好够用就行,过多的 Sink 会占用系统资源,造成系统资源不必要的浪费。batchSize 参数决定 Sink 一次批量从 Channel 读取的 event 条数,适当调大这个参数可以提高 Sink 从 Channel 搬出 event 的性能。

5 、Flume 的事务机制

Flume 的事务机制(类似数据库的事务机制):Flume 使用两个独立的事务分别负责从Soucrce 到 Channel,以及从 Channel 到 Sink 的事件传递。比如 spooling directory source 为文件的每一行创建一个事件,一旦事务中所有的事件全部传递到 Channel 且提交成功,那么 Soucrce 就将该文件标记为完成。同理,事务以类似的方式处理从 Channel 到 Sink 的传递过程,如果因为某种原因使得事件无法记录,那么事务将会回滚。且所有的事件都会保持到 Channel 中,等待重新传递。

6、 Flume采集数据会丢失吗?

根据 Flume 的架构原理,Flume 是不可能丢失数据的,其内部有完善的事务机制,Source 到 Channel 是事务性的,Channel 到 Sink 是事务性的,因此这两个环节不会出现数据的丢失,唯一可能丢失数据的情况是 Channel 采用 memoryChannel,agent 宕机导致数据丢失,或者 Channel 存储数据已满,导致 Source 不再写入,未写入的数据丢失。

Flume 不会丢失数据,但是有可能造成数据的重复,例如数据已经成功由 Sink 发出,但是没有接收到响应,Sink 会再次发送数据,此时可能会导致数据的重复。

7、介绍一下flume的channel

channel被设计为event中转临时缓冲区,存储source收集并且没有被sink读取的event,平衡source收集和sink读取的速度,可以将其视为flume内部的消息队列。channel线程安全并且具有事务性,支持source写失败写,sink读失败重复读的操作。常见的类型包括Memory Channel,File Channel,Kafka Channel

8、Memory Channel与File Channel的优缺点

Memory Channel读写速度快,但是存储数据量小。Flume进程挂掉、服务器停机或者重启都会导致数据丢失。在资源充足,不关心数据丢失的场景下可以使用。
File Channel存储容量大,无数据丢失的风险。读写速度慢,但可以通过配置多磁盘文件路径,通过磁盘并行写入提高File Channel性能。Flume将Event顺序写入到File Channel文件的末尾,可以通过配置maxFileSize参数配置数据文件大小,当文件大小达到这个值,创建新的文件,并将该文件设置为只读,直到Flume把该文件读取完成,删除该文件。

9、Kafka Channel的优点有哪些

Memory Channel有很大程度丢失数据的风险,File Channel虽然无数据丢失风险,但如果缓存下来的消息来没来得及写入Sink,Agent就出现故障,File Channel中的消息一样不能被继续使用。Kafka的容错能力解决了这一点。
Flume一旦配置了Kafka为Channel,则不再需要配置Sink组件,减少了Flume启动的进程数,降低了服务器内存、磁盘等资源的使用率。

4.Flume的拦截器是什么

Source在将Event写入到Channel之前可以使用拦截器对Event进行各种形式的处理,Source和Channel之间可以设置多个拦截器,不同的拦截器可以设置不同的规则对Event进行处理

5.Flume的选择器是什么

Source发送的Event通过Channel选择器来选择以哪种方式写入到Channel中,Flume提供了三种类型的选择器,复制选择器、复用选择器以及自定义选择器
1)复制选择器:一个Source以复制的方式将一个Event写入到多个Channel中,不同的Sink可以从不同的Channel中获取到相同的Event。
如果Source没有指定Channel选择器,则该SOurce使用复制Channel选择器,复制选择器有一个配置参数optional,该参数指定的所有channel是可选的,当时间写入到这些channel时有失败发生,则忽略这些失败,否则抛出异常,要求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

2)复用选择器:需要和拦截器配合使用,根据Event的头信息的不同写入到不同的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

3)自定义选择器:自定义选择器需要实现ChannelSelector接口,或者继承AbstractChannelSelector类。

10、了解Flume的负载均衡和故障转移吗

设置sink组,同一个sink组内有多个sink,不同sink之间可以配置成负载均衡或故障转移

11、Flume的事务机制

flume基于事务传输event(批量传输),使用两个独立的事务分别处理source到channel和channel到sink,失败时会将所有数据回滚进行重试。该事务遵循“最少一次”语义,因此数据不会丢失,但有可能重复。
source-channel之间的重复可以靠TailDir Source自带的断点续传功能解决
put事务:
1)doPut:将批数据先写入到临时缓冲区putLIst(putList就是一个临时的缓冲区)
2)doCommit:检查channel内存队列是否足够合并
3)doRollback:channel内存队列空间不足,回滚,等待内存通道的容量满足合并
channel-sink之间的重复,可以延长等待时间,或者设置UUID拦截器,然后再redis里维护一个布隆表来使下游实时应用去重。
take事务:
1)doTake:将数据取到临时缓冲区takeList
2)将数据发送到下一个节点
3)doCommit:如果数据全部发送成功,则清除临时缓冲区takeList
4)doRollback:数据发送过程中如果出现异常,rollback将临时缓冲区takeList中的数据归还给channel内存队列

TairDir Source配置

# source的名字
agent.sources = s1
# channels的名字
agent.channels = c1
# sink的名字
agent.sinks = r1

# 指定source使用的channel
agent.sources.s1.channels = c1
# 指定sink使用的channel
agent.sinks.r1.channel = c1

######## source相关配置 ########
# source类型
agent.sources.s1.type = TAILDIR
# 元数据位置
agent.sources.s1.positionFile = /Users/wangpei/tempData/flume/taildir_position.json
# 监控的目录
agent.sources.s1.filegroups = f1
agent.sources.s1.filegroups.f1=/Users/wangpei/tempData/flume/data/.*log
agent.sources.s1.fileHeader = true

######## channel相关配置 ########
# channel类型
agent.channels.c1.type = file
# 数据存放路径
agent.channels.c1.dataDirs = /Users/wangpei/tempData/flume/filechannle/dataDirs
# 检查点路径
agent.channels.c1.checkpointDir = /Users/wangpei/tempData/flume/filechannle/checkpointDir
# channel中最多缓存多少
agent.channels.c1.capacity = 1000
# channel一次最多吐给sink多少
agent.channels.c1.transactionCapacity = 100

######## sink相关配置 ########
# sink类型
agent.sinks.r1.type = org.apache.flume.sink.kafka.KafkaSink
# brokers地址
agent.sinks.r1.kafka.bootstrap.servers = localhost:9092
# topic
agent.sinks.r1.kafka.topic = testTopic3
# 压缩
agent.sinks.r1.kafka.producer.compression.type = snappy

12、Flume参数调优(二)

Source:
1)增加Source个数,可以增大Source读取数据的能力。
2)batchSize参数决定Source一次批量运输到Channel的event条数,适当调大这个参数可以提高Source搬运Event到Channel时的性能。
Channel:
1)使用File Channel时dataDirs配置多个不同盘下的目录可以提高性能
2)Capacity参数决定Channel可容纳最大的Event条数。transactionCapacty参数决定每次Source往Channel里面写的最大event条数和每次sink从channel里面读的最大event条数,transactionCapacty需要大于Source和Sink的batchSize参数
Sink:
1)适当增加Sink的个数可以增加Sink消费event的能力,但过多的sink会占用系统资源,造成不必要的浪费
2)batchSize参数决定Sink批量从Channel读取的event条数,适当调大这个参数可以提高Sink从Channel搬运Event的性能。

### Apache Flume 数据采集总结与最佳实践 Apache Flume 是一个分布式、可靠且高可用的日志收集系统,能够将数据从多个来源高效地传输到集中式存储系统中。以下是关于 Flume 数据采集的总结和最佳实践: #### 1. **Flume 的核心组件** Flume 的架构基于三个核心组件:Source、Channel 和 Sink[^3]。 - **Source**:负责接收数据。Flume 支持多种 Source 类型,如 Avro、Kafka、HTTP 等。每种 Source 都适用于不同的场景。例如,`httpSource` 可以通过 HTTP 接收数据,适用于不能部署 Flume SDK 的环境[^4]。 - **Channel**:作为临时缓冲区,用于存储从 Source 接收到的数据,直到 Sink 将其发送到目标位置。常见的 Channel 包括 Memory Channel 和 File Channel。Memory Channel 提供高性能但不持久化,而 File Channel 提供更高的可靠性[^3]。 - **Sink**:负责将数据写入目标存储系统,如 HDFS、Kafka 或 Elasticsearch。 #### 2. **数据采集的最佳实践** ##### (1) **选择合适的 Source 类型** 根据应用场景选择适合的 Source 类型是关键。例如: - 如果需要从文件系统中读取日志,可以选择 `Spooling Directory Source`[^3]。 - 如果需要通过网络接收数据,可以选择 `Netcat Source` 或 `HTTP Source`[^4]。 ##### (2) **配置可靠的 Channel** - 在对性能要求较高的场景下,可以使用 `Memory Channel`,但需要注意其数据丢失风险。 - 对于需要高可靠性的场景,建议使用 `File Channel`,因为它会将数据持久化到磁盘上,即使系统崩溃也能恢复数据[^3]。 ##### (3) **优化 Sink 的性能** - 使用批量写入(Batch Writing)可以显著提高 Sink 的性能。例如,在写入 HDFS 时,可以通过配置较大的批次大小来减少 I/O 操作次数[^2]。 - 如果目标是 Kafka,则可以通过调整 Kafka Producer 的参数(如 `batch.size` 和 `linger.ms`)来优化性能[^2]。 ##### (4) **多级数据采集结构** 在大规模分布式环境中,可以采用多级数据采集结构。例如: - 第一级 Agent 负责从本地服务器收集日志,并将其发送到第二级 Agent。 - 第二级 Agent 负责将数据聚合后写入最终存储系统(如 HDFS 或 Kafka)。这种设计可以减轻单个 Agent 的负载并提高系统的可靠性[^3]。 ##### (5) **监控与调优** - 使用 Flume 自带的监控工具或集成外部监控系统(如 Prometheus 或 Grafana)来实时监控 Flume 的运行状态。 - 定期检查 Source、Channel 和 Sink 的吞吐量及延迟,及时发现瓶颈并进行调优[^2]。 #### 3. **常见问题与解决方案** ##### (1) **数据丢失** - 如果使用 `Memory Channel`,可能会因系统崩溃导致数据丢失。解决方法是切换到 `File Channel` 或 `Kafka Channel`[^3]。 - 确保 Sink 成功将数据写入目标存储后,再从 Channel 中删除数据。 ##### (2) **性能瓶颈** - 如果发现性能不足,可以尝试增加 Agent 的数量,或者优化 Channel 和 Sink 的配置[^2]。 - 对于大规模数据流,可以考虑引入消息队列(如 Kafka)作为中间层,以缓解压力。 ```python # 示例:Flume 配置文件中的多级数据采集结构 agent1.sources = r1 agent1.channels = c1 agent1.sinks = k1 agent1.sources.r1.type = exec agent1.sources.r1.command = tail -f /var/log/messages agent1.channels.c1.type = memory agent1.channels.c1.capacity = 1000 agent1.channels.c1.transactionCapacity = 100 agent1.sinks.k1.type = avro agent1.sinks.k1.channel = c1 agent1.sinks.k1.hostname = agent2-host agent1.sinks.k1.port = 41414 # 第二级 Agent agent2.sources = r2 agent2.channels = c2 agent2.sinks = hdfs-sink agent2.sources.r2.type = avro agent2.sources.r2.bind = agent2-host agent2.sources.r2.port = 41414 agent2.channels.c2.type = file agent2.channels.c2.capacity = 10000 agent2.sinks.hdfs-sink.type = hdfs agent2.sinks.hdfs-sink.hdfs.path = hdfs://namenode:8020/logs agent2.sinks.hdfs-sink.hdfs.fileType = DataStream ``` #### 4. **总结** Apache Flume 是一个功能强大且灵活的日志收集工具,适用于多种场景。通过合理配置 Source、Channel 和 Sink,并结合多级数据采集结构,可以构建一个高效、可靠的数据采集系统[^3]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值