flume的使用

flume也分为两个版本, 0.9和1.x
1.x更为灵活, 而且更为轻便.
1.x版本之后, flume成为了一个更加纯粹的数据收集和传输工具

安装

使用flume的二进制安装
解压缩后配置环境变量即可

说明
  1. 生产环境中往往会监控文件目录, 第1段代码的source正是文件目录
    但是之后的代码都监控指定文件, 因为文件内容的更新更为方便
  2. 第2段代码的sink是hdfs, 其余代码的sink大多是logger
  3. flume代理层之间传递数据时, 对应source和sink的类型都是avro. 但是, avro sink并不是传递了avro格式的文件, 而只是使用了avro RPC进行通信
  4. flume的帮助flume help简洁明了, 值得一看.
    flume提交任务的shell语句如下
flume-ng agent  --conf-file time.log --name a1 -Dflume.root.logger=INFO,console
# --conf-file 可以简写为-f, 任务文件的位置
# --name 任务名
# -Dflume.root.logger=INFO,console 控制台上的日志文件显示详细信息
配置文件序号内容
1监控文件夹并输出到控制台
2监控文件并输出到hdfs, 配置了时间拦截器
3扇出到日志和代理层
4配置代理层
5sink组(代理配置和故障转移 )

监控文件夹并输出到控制台

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

a1.sources.r1.type = spooldir
a1.sources.r1.spoolDir = /root/flume/spooldir

a1.sinks.k1.type  =  logger

# 习惯性将channel相关的属性放到最后
a1.channels.c1.type  =  memory
# 设置通道可容纳的事务总量, ,默认100
a1.channels.c1.capacity  =  1000
# 每次从source获取, 或刷入sink的事务量, 默认100
a1.channels.c1.transactionCapacity  =  100

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

监控文件并输出到hdfs

flume支持使用%Y, %m等引用各种时间元素, 但是需要设置时间戳拦截器
相应的, flume也可以使用%{host}来引用主机名, 同样需要设置主机拦截器

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

a1.sources.r1.type = exec
a1.sources.r1.command = tail -F /root/flume.txt
# 设置时间拦截器
a1.sources.r1.interceptors = x1
a1.sources.r1.interceptors.x1.type = timestamp

a1.sinks.k1.type=hdfs
# 设置存储到hdfs上以分为单位的目录
a1.sinks.k1.hdfs.path=hdfs://cdh1:8020/flume/time/m=%M
# 设置生成文件的最大等待时间, 以秒为单位, 默认30, 0为不设置
a1.sinks.k1.hdfs.rollInterval = 0
# 设置生成文件的最大文件容量, 以bytes为单位, 默认1024
a1.sinks.k1.hdfs.rollSize = 0
# 设置生成文件的最大事件数量, 默认是10
a1.sinks.k1.hdfs.rollCount = 1
### 只要符合以上三个条件之一, 就生成一个文件
# 设置刷新到hdfs上所需的事件数量, 默认是100
a1.sinks.k1.hdfs.batchSize = 1
a1.sinks.k1.hdfs.fileType = DataStream

a1.channels.c1.type  =  memory

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

扇出到日志和代理层

扇出
简而言之, 扇出就是一个source流向多个sink
具体来说, 需要在一个任务中设置多个sink, 也对应设置多个通道

借助扇出, 我们还可以实现近实时的索引
一个sink将数据入库, 另一个sink分析数据形成索引

代理层
第一层的flume事件可以传递到下一层的flume
示例中, 第一层flume的配置, 位于{ “hostname”:“cdh1”, “ip”:“192.168.91.11” }的服务器上

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

a1.sources.r1.type = exec
a1.sources.r1.command = tail -F /root/flume.txt

a1.sinks.k1.type = avro
a1.sinks.k1.hostname = cdh2
a1.sinks.k1.port = 19218

a1.sinks.k2.type=logger

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

a1.channels.c1.type  =  memory
a1.channels.c2.type = memory

配置代理层

以下示例配置文件位于{ “hostname”:“cdh2”, “ip”:“192.168.91.12” }的服务器上
为了运行sink组策略, 也应该在{ “hostname”:“cdh2”, “ip”:“192.168.91.12” }的服务器上对应配置文件
代理层的配置不受上层flume策略的影响
也就是说, 代理层只需要在source中设置监听自己的端口. 无论上层是扇出, 或是哪一种的sink组策略, 或是上层策略在不断改变, 代理层的配置都不需要改变
具体来说, 此文章中的例子都可以使用一样的代理层配置, cdh2设置好就不需要改了

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

a1.sources.r1.type  =  avro
# 特别需要注意的是, 这里监听的是自己
a1.sources.r1.bind  =  cdh2
a1.sources.r1.port  =  19218

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

sink组

flume如何防止数据丢失

  1. source输出和channel输入是一个事务; channel输出和sink输入也是一个事务, 只有sink确认完成输入后, channel才会将数据删除
    这个特性导致flume可能收集到重复的数据(sink完成输入, 但在确认完成之前宕机, 事务失败. flume重启之后会重新输入到sink, 因而产生重复数据).在处理flume收集到的文件时需要注意去重.
  2. 可以选择配置flume的sink组, 以实现负载均衡或者故障转移
    负载均衡和故障转移是两个不同的策略. 负载均衡会尽量随机的将数据(不重复的)传递给sink组的成员, 故障转移只会传递数据给组中优先级最高的成员, 直到该成员响应超时.
    如果优先级最高的成员重新连接, 数据会转而传递给该成员

对比sink组和扇出
他们都需要双sink, sink组需要额外设置sinkgroups
(示例中, 扇出使用了双channel, 原因是官网的示例中使用了双channel, 但不清楚这是否是必须的)

##### 负载均衡 #####
a1.sources = r1
a1.sinks  =  k1 k2
a1.sinkgroups = g1
a1.channels = c1

a1.sources.r1.type = exec
a1.sources.r1.command = tail -F /root/flume/flume.txt
a1.sources.r1.channels = c1

# 不同点在这里
a1.sinkgroups.g1.sinks = k1 k2
a1.sinkgroups.g1.processor.type = load_balance
a1.sinkgroups.g1.processor.backoff = true

a1.sinks.k1.type = avro
a1.sinks.k1.hostname = cdh2
a1.sinks.k1.port = 19218

a1.sinks.k2.type = avro
a1.sinks.k2.hostname = cdh3
a1.sinks.k2.port = 19218

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
a1.sinks.k2.channel  =  c1

##### 故障转移 #####
a1.sources = r1
a1.sinks  =  k1 k2
a1.sinkgroups = g1
a1.channels = c1

a1.sources.r1.type = exec
a1.sources.r1.command = tail -F /root/flume/flume.txt
a1.sources.r1.channels = c1

# 故障转移需要指定代理层的优先级
a1.sinkgroups.g1.sinks = k1 k2
a1.sinkgroups.g1.processor.type = failover
a1.sinkgroups.g1.processor.priority.k1  =  5
a1.sinkgroups.g1.processor.priority.k2  =  10
a1.sinkgroups.g1.processor.maxpenalty  =  10

a1.sinks.k1.type = avro
a1.sinks.k1.hostname = cdh2
a1.sinks.k1.port = 19218

a1.sinks.k2.type = avro
a1.sinks.k2.hostname = cdh3
a1.sinks.k2.port = 19218

a1.channels.c1.type  =  memory

a1.sources.r1.channels  =  c1
a1.sinks.k1.channel  =  c1
a1.sinks.k2.channel  =  c1
### Apache Flume 使用指南与配置示例 #### 1. 环境准备 在开始使用 Apache Flume 之前,需确保已准备好运行环境。通常情况下,Flume 的安装依赖于 Java 环境。以下是基本的准备工作: - **Java 环境**:确保系统中已经安装 JDK 并设置好 `JAVA_HOME` 环境变量[^2]。 - **下载与解压**:从官方仓库获取最新版本的 Flume,并将其解压缩至目标目录。 ```bash wget http://archive.apache.org/dist/flume/1.7.0/apache-flume-1.7.0-bin.tar.gz tar -xzvf apache-flume-1.7.0-bin.tar.gz -C /opt/ ``` #### 2. 基本架构概述 Apache Flume 是一种分布式、可靠的数据收集工具,主要用于将大量日志数据高效传输到集中式存储系统(如 HDFS 或 Kafka)。其核心组件包括 Source、Channel 和 Sink[^4]。 - **Source**:负责从外部数据源捕获事件并将它们传递给 Channel。 - **Channel**:作为临时缓冲区,用于暂存来自 Source 的数据,等待被 Sink 消费。 - **Sink**:将数据从 Channel 发送到最终的目的地。 #### 3. 配置文件说明 Flume 的配置文件通常是 `.conf` 文件,其中定义了各个 Agent 的行为以及 Source、Channel 和 Sink 的具体参数。以下是一个简单的配置示例[^5]: ```properties # 定义 agent 中的 components agent.sources = r1 agent.sinks = k1 agent.channels = c1 # 配置 source (r1) agent.sources.r1.type = exec agent.sources.r1.command = tail -F /var/log/system.log # 配置 channel (c1) agent.channels.c1.type = memory agent.channels.c1.capacity = 1000 agent.channels.c1.transactionCapacity = 100 # 配置 sink (k1) agent.sinks.k1.type = logger # 将 source 和 sink 关联到 channel agent.sources.r1.channels = c1 agent.sinks.k1.channel = c1 ``` 在此示例中: - **Source 类型**为 `exec`,表示通过执行命令来采集数据。 - **Channel 类型**为 `memory`,即内存通道。 - **Sink 类型**为 `logger`,即将数据打印到控制台。 #### 4. 启动 Flume 完成配置后,可以通过以下命令启动 Flume: ```bash $FLUME_HOME/bin/flume-ng agent \ --name agent \ --conf $FLUME_CONF_DIR \ --conf-file $FLUME_CONF_FILE \ -Dflume.root.logger=INFO,console ``` 此命令会启动名为 `agent` 的 Flume 实例,并加载指定的配置文件[^2]。 #### 5. 数据可靠性保障 为了提高数据传输的可靠性,建议采用持久化 Channel(如 File Channel)替代默认的 Memory Channel。File Channel 能够在发生故障时恢复未处理的数据。 修改配置中的 Channel 参数即可启用 File Channel: ```properties agent.channels.c1.type = file agent.channels.c1.checkpointDir = /data/flume/checkpoint agent.channels.c1.dataDirs = /data/flume/data ``` #### 6. 扩展功能 对于更复杂的场景,可以利用多个 Agent 协同工作。例如,上游 Agent 的 Sink 输出可作为下游 Agent 的 Source 输入,从而实现级联式的日志收集[^4]。 --- ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值