flume详解

Apache Flume 是一个用于高效、可靠地收集、聚合和移动大量日志数据的系统。其核心组件包括source、channel和sink,通过事务机制确保数据不丢失。Flume提供file channel保证数据持久化,而memory channel在进程挂掉时可能导致数据丢失。本文还介绍了配置Flume采集文件夹到HDFS、header的使用、拦截器功能以及load-balance和failover机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

flume介绍:

flume源码地址:https://github.com/apache/flume/

  • flume的核心角色是agent,agent是一个java进程。agent相当于一个快递员。
  • agent包括source,channel,sink,channel是为了防止source到sink数据丢失
  • 他们之间流动传输的最小单元是event,如果是文件则一行数据就是一个event
  • 一个event包括event headers,event body,event,其中event body是二进制数据
  • flume的鲁棒性太差,一旦报错就停止采集
  • flume的启动入口是:org.apache.flume.node.Application
  • flume关闭顺序为source,sink,channel
  • 启动顺序channel,sink,source

flume的容错

为了防止数据丢失采用事务机制,首先写到channel里,等到sink完成,才算结束。如果失败会保存在channel里。

  1. File Channel 写到磁盘里
  2. 如果使用memoryChannel,进程挂掉保存在memory中的数据会丢失,在源码中可以看到使用LinkedBlockingDeque双向阻塞队列来保存的数据

配置采集文件夹flume下沉到hdfs:

具体的采集可以参照:http://flume.apache.org/releases/content/1.9.0/FlumeUserGuide.html#flume-sources

使用spooldir监控文件夹,如果文件夹下面有同名文件将会停止,无法启动

# Name the components on this agent
a1.sources = r1
a1.sinks = k1
a1.channels = c1

# Describe/configure the source
##注意:不能往监控目中重复丢同名文件
a1.sources.r1.type = spooldir
a1.sources.r1.spoolDir = /root/logs2
a1.sources.r1.fileHeader = true #保留文件的绝对路径
a1.sources.r1.fileHeaderKey=filename #设置header的key

# Describe the sink
a1.sinks.k1.type = hdfs
a1.sinks.k1.channel = c1
a1.sinks.k1.hdfs.path = /flume/events/%y-%m-%d/%H%M/
a1.sinks.k1.hdfs.filePrefix = %{filename} #存放时会按照源文件的绝对路径存放
a1.sinks.k1.hdfs.round = true #开启文件夹滚动
a1.sinks.k1.hdfs.roundValue = 10
a1.sinks.k1.hdfs.roundUnit = minute
a1.sinks.k1.hdfs.rollInterval = 3 #文件滚动,3m
a1.sinks.k1.hdfs.rollSize = 20 #文件滚动,字节大小
a1.sinks.k1.hdfs.rollCount = 5 #event事件数,这几个条件谁先达到就滚动
a1.sinks.k1.hdfs.batchSize = 1 
a1.sinks.k1.hdfs.useLocalTimeStamp = true
#生成的文件类型,默认是Sequencefile,可用DataStream,则为普通文本
a1.sinks.k1.hdfs.fileType = DataStream

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

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

flume中header的作用

header 中插入自定义的键值对,可以根据%{key}拿到对应的value

flume的拦截器

拦截器是处理从source到channel的的数据处理

  1. 静态拦截器:

    #指定拦截器的名字
    a1.sources.r1.interceptors = i1
    a1.sources.r1.interceptors.i1.type = static
    #指定键的名称
    a1.sources.r1.interceptors.i1.key = type
    #指定值得名称
    a1.sources.r1.interceptors.i1.value = access
    

    会将值加到headers中,可以通过%{type}获取对应的值

  2. 时间戳拦截器

    a1.sinks.k1.hdfs.useLocalTimeStamp = true
    

Flume 的load-balance 、failover:

负载均衡是用于解决一台机器(一个进程)无法解决所有请求而产生的一种
算法。
原理:
在这里插入图片描述

a1.sinkgroups = g1
a1.sinkgroups.g1.sinks = k1 k2 k3
a1.sinkgroups.g1.processor.type = load_balance
a1.sinkgroups.g1.processor.backoff = true #如果开启,则将失败的 sink 放入黑名单
a1.sinkgroups.g1.processor.selector = round_robin # 另外还支持 random
a1.sinkgroups.g1.processor.selector.maxTimeOut=10000 #在黑名单放置的超时时间,超时结
束时,若仍然无法接收,则超时时间呈指数增长

faiover
架构图和负载均衡一样

a1.sinkgroups = g1
a1.sinkgroups.g1.sinks = k1 k2 k3
a1.sinkgroups.g1.processor.type = failover
a1.sinkgroups.g1.processor.priority.k1 = 5 #优先级值, 绝对值越大表示优先级越高
a1.sinkgroups.g1.processor.priority.k2 = 7
a1.sinkgroups.g1.processor.priority.k3 = 6
a1.sinkgroups.g1.processor.maxpenalty = 20000 #失败的 Sink 的最大回退期(millis)
### 关于 Flume 的详细介绍 Flume 是一个分布式、可靠且可用的服务,用于有效地收集、聚合并移动大量日志数据。其简单灵活架构基于流式传输模型设计,允许在线分析应用实时获取数据[^1]。 #### 主要特性 - **可扩展性**:支持多级联操作,在不同节点间高效传递事件。 - **可靠性**:提供多种机制保障数据不丢失,如事务处理和持久化存储。 - **灵活性**:通过插件方式可以方便地集成各种数据源和目标端。 #### 架构组件 - **Source**:负责接收或读取外部输入的数据流,并将其转换成特定格式后发送给 Channel。 - **Channel**:作为 Source 和 Sink 之间的缓冲区,临时保存待处理的消息直到被成功转发至下一个目的地。 - **Sink**:最终将接收到的信息写入指定位置(例如 HDFS),完成整个流程中的最后一环工作。 ```bash # 启动 Flume agent 示例命令 $ bin/flume-ng agent --conf ./conf/ --name a1 --conf-file example.conf ``` #### 配置文件结构 配置文件定义了各个组件的具体参数设置及其相互关系。通常采用 `.conf` 扩展名表示,每一行代表一条指令,指定了某个属性对应的值。下面是一个简单的例子来说明如何创建自定义的 source, channel 及 sink 组合: ```properties # 定义agent名称为a1 a1.sources = r1 a1.sinks = k1 a1.channels = c1 # 描述source类型和其他选项... a1.sources.r1.type = netcat a1.sources.r1.bind = localhost a1.sources.r1.port = 44444 # 设置channel的相关信息... a1.channels.c1.type = memory a1.channels.c1.capacity = 1000 a1.channels.c1.transactionCapacity = 100 # 指定sink的行为模式... a1.sinks.k1.type = logger # 连接source/channel/sink形成完整的pipeline a1.sources.r1.channels = c1 a1.sinks.k1.channel = c1 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值