Flume简介及基本运用(含案例)

Flume是一个分布式日志聚合系统,用于高效地收集、聚合和移动大量数据。其基本架构包括Source、Channel和Sink,支持多种组件类型,如exec Source、spooling directory source等。Flume的配置灵活,支持单一流程、多代理流程、流的合并和多路复用等架构模式。案例中展示了如何监控端口、监听文件并将数据输出到控制台或存储到HDFS、Kafka等。

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

1、背景

在这里插入图片描述

2、Flume简介

Flume是日志收集框架,详细来说:Flume是一个分布式、可靠、高可用的海量日志聚合系统,支持在系统中定制各类数据发送方,用于收集数据;同时,Flume可以对数据进行简单处理,并写到各种数据接收方。

3、Flume架构和基本概念

下图为 Flume 的基本架构图:
在这里插入图片描述

3.1 基本架构

外部数据源以特定格式向 Flume 发送 events (事件),当 source 接收到 events 时,它将其存储到一个或多个 channel,channe 会一直保存 events 直到它被 sink 所消费。sink 的主要功能从 channel 中读取 events,并将其存入外部存储系统或转发到下一个 source,成功后再从 channel 中移除 events。

3.2 基本概念

1、Event
Event 是 Flume NG 数据传输的基本单元。类似于 JMS 和消息系统中的消息。一个 Event 由标题和正文组成:前者是键/值映射,后者是任意字节数组。

2、Source
数据收集组件,从外部数据源收集数据,并存储到 Channel 中。

3、Channel
Channel 是源和接收器之间的管道,用于临时存储数据。可以是内存或持久化的文件系统:

  • Memory Channel : 使用内存,优点是速度快,但数据可能会丢失 (如突然宕机);
  • File Channel : 使用持久化的文件系统,优点是能保证数据不丢失,但是速度慢。

4、Sink
Sink 的主要功能从 Channel 中读取 Event,并将其存入外部存储系统或将其转发到下一个 Source,成功后再从 Channel 中移除 Event。

5、Agent
是一个独立的 (JVM) 进程,包含 Source、 Channel、 Sink 等组件。

3.3 组件种类

Flume 中的每一个组件都提供了丰富的类型,适用于不同场景:

  • Source 类型 :内置了几十种类型,如 exec Source、spooling directory source,avro source,taildir source,这几种比较常用;还有,netcat source(一般测试用),http source,kafka source
  • Sink 类型 :HDFS Sink,Hive Sink,HBaseSinks,Avro Sink 等;工作中常用Avro Sink,HDFS Sink,Kafka Sink。
  • Channel 类型 :Memory Channel,JDBC Channel,Kafka Channel,File Channel 等。
    • Memory Channel:event保存在Java Heap中。如果允许数据小量丢失,推荐使用
    • File Channel:event保存在本地文件中,可靠性高,但吞吐量低于Memory Channel
    • JDBC Channel:event保存在关系数据中,一般不推荐使用
    • Kafka Channel

3.4 工作流程

在这里插入图片描述

4、Flume架构模式

Flume 支持多种架构模式,分别介绍如下

4.1 单一流程

在这里插入图片描述

4.2 多代理流程(多个agent顺序连接)

在这里插入图片描述
Flume 支持跨越多个 Agent 的数据传递,这要求前一个 Agent 的 Sink 和下一个 Agent 的 Source 都必须是 Avro 类型,Sink 指向 Source 所在主机名 (或 IP 地址) 和端口。

4.3 流的合并(多个Agent的数据汇聚到同一个Agent )

在这里插入图片描述
日志收集中常常存在大量的客户端(比如分布式 web 服务),Flume 支持使用多个 Agent 分别收集日志,然后通过一个或者多个 Agent 聚合后再存储到文件系统中。

4.4 多路复用流(多级流)

在这里插入图片描述
Flume 支持从一个 Source 向多个 Channel,也就是向多个 Sink 传递事件,这个操作称之为 Fan Out(扇出)。默认情况下 Fan Out 是向所有的 Channel 复制 Event,即所有 Channel 收到的数据都是相同的。同时 Flume 也支持在 Source 上自定义一个复用选择器 (multiplexing selector) 来实现自定义的路由规则。

4.5 load balance功能

在这里插入图片描述
Agent1是一个路由节点,负责将Channel暂存的Event均衡到对应的多个Sink组件上,而每个Sink组件分别连接到一个独立的Agent上 。

5、Flume配置格式

Flume 配置通常需要以下两个步骤:

  • 1、分别定义好 Agent 的 Sources,Sinks,Channels,然后将 Sources 和 Sinks
    与通道进行绑定。需要注意的是一个 Source 可以配置多个 Channel,但一个 Sink 只能配置一个
    Channel。基本格式如下:
<Agent>.sources = <Source>
<Agent>.sinks = <Sink>
<Agent>.channels = <Channel1> <Channel2>

# set channel for source
<Agent>.sources.<Source>.channels = <Channel1> <Channel2> ...

# set channel for sink
<Agent>.sinks.<Sink>.channel = <Channel1>
  • 2、分别定义 Source,Sink,Channel 的具体属性。基本格式如下:
<Agent>.sources.<Source>.<someProperty> = <someValue>

# properties for channels
<Agent>.channel.<Channel>.<someProperty> = <someValue>

# properties for sinks
<Agent>.sources.<Sink>.<someProperty> = <someValue>

启动Agent
bin目录下的flume-ng是Flume的启动脚本,启动时需要指定Agent的名字、配置文件的目录和配置文件的名称。

[root@hadoop20 flume]# ./bin/flume-ng agent --name $agent_name --conf ./conf/ --conf-file ./conf/jobkb09/netcat-flume-logger.conf
# flume-ng:是Flume的启动脚本
# --name $agent_name:要指明agent的名字,可以简写成 -n $agent_name
# --conf ./conf/:需要找到conf目录下的配置文件flume-env.sh,可以简写成 -c conf
# --conf-file ./conf/jobkb09/netcat-flume-logger.conf:需要找到配置文件路径,可以简写成 -f 文件路径

简化后的另一种写法:

[root@hadoop20 flume]# ./bin/flume-ng agent -n a1 -c ./conf/ -f ./conf/jobkb09/netcat-flume-logger.conf

对于 Flume 的使用,除非有特别的需求,否则通过组合内置的各种类型的 Source,Sink 和 Channel 就能满足大多数的需求。在 Flume 官网 (官网是纯英文的,在此提供一份中文版:Flume 1.8用户手册中文版)上对所有类型组件的配置参数均以表格的方式做了详尽的介绍,并附有配置样例;同时不同版本的参数可能略有所不同,所以使用时建议选取官网对应版本的 User Guide 作为主要参考资料。

6、Flume使用案例

6.1 监控端口并输出到控制台

实现:使用NetCat TCP Source

这个source十分像nc -k -l [host] [port]这个命令,监听一个指定的端口,把从该端口收到的TCP协议的文本数据按行转换为Event,它能识别的是带换行符的文本数据,同其他Source一样,解析成功的Event数据会发送到channel中。

提示:常见的系统日志都是逐行输出的,Flume的各种Source接收数据也基本上以行为单位进行解析和处理。

1、配置
在/opt/flume/conf目录下新建测试目录:mkdir jobkb09,在/opt/flume/conf/jobkb09目录下新建配置文件:vi netcat-flume-logger.conf

# 配置Agent a1各个组件的名称
a1.sources=r1
a1.channels=c1
a1.sinks=k1

# 配置source属性
a1.sources.r1.type=netcat   	#使用netcat TCP Source
a1.sources.r1.bind=localhost	#netcat TCP Source监听的hostname或者ip地址,这个是本机
a1.sources.r1.port=7777			#监听的端口

# 配置channel属性,channel是用来缓冲event数据的
a1.channels.c1.type=memory	#channel的类型是内存channel,顾名思义这个channel是使用内存来缓冲数据
a1.channels.c1.capacity=1000
a1.channels.c1.transactionCapacity=1000

# 配置sink属性
a1.sinks.k1.type=logger  #一般用于测试,将event内容输出到日志中

# 把source和sink绑定到channel上
a1.sources.r1.channels=c1
a1.sinks.k1.channel=c1

2、启动agent

[root@hadoop20 flume]# ./bin/flume-ng agent --name a1 --conf ./conf/ --conf-file ./conf/jobkb09/netcat-flume-logger.conf -Dflume.root.logger=INFO,console
# -Dflume.root.logger=INFO,console:指定logger输处形式,INFO级别的控制台(console)输出,只有配置文件中sink的类型是logger才能使用。

3、测试
再打开一个会话,

[root@hadoop20 ~]# telnet localhost 7777

在7777这个端口输入,flume都能监控到。

6.2 监听文件内容,将新增内容输出到控制台

也可以将新增内容采集到HDFS或者Kafka中,案例仅演示输出到控制台。
实现: 主要使用 Exec Source 配合 tail 命令实现

执行Linux指令,并消费指令返回的结果,并不是所有的命令都符合,能产生持续数据流的命令才符合要求,比如cat [named pipe]和tail -F [file]

1、配置
在/opt/flume/conf/jobkb09目录下新建配置文件:vi file-flume-logger.conf

#指定agent的sources,sinks,channels
a2.sources
### Flume入门教程 Apache Flume 是一种分布式、可靠且高可用的日志收集系统,主要用于高效地采集、聚合并传输大量日志数据至集中存储系统(如 HDFS)。以下是关于 Flume基本概念及其组成部分的概述: #### Flume 基本定义与组成 Flume 主要由三个核心组件构成:Source、Channel 和 Sink[^1]。 - **Source** 负责接收外部数据流并将这些数据写入 Channel 中。它可以支持多种输入方式,例如 syslog 数据、文件尾部跟踪等。 - **Channel** 可视为临时缓冲区,在 Source 接收的数据被传递给 Sink 之前暂存其中。常见的 Channel 类型有 Memory Channel 和 File Channel。 - **Sink** 将来自 Channel 的数据发送到目标位置,比如 HDFS 或者 Kafka。 #### Flume Agent 内部工作原理 每个 Flume 实例被称为一个 Agent,它运行在一个独立 JVM 上,并通过配置文件指定其行为模式。Agent 包多个 Source、Channel 和 Sink 组件实例化后的对象组合而成。当启动某个 Agent 后,各部分之间会依据预设规则协同运作完成整个流水线操作过程。 --- ### 大数据项目管理中的Flume应用 在实际生产环境中部署实施基于 Apache Flume 构建的大规模日志处理平台时,需考虑以下几个方面来优化性能表现及稳定性保障措施: #### 需求分析阶段的重要性 对于任何成功的软件工程而言,“知己知彼百战不殆”,因此做好前期调研至关重要。这一步骤涉及明确业务场景下的具体要求是什么?期望达到怎样的效果等等问题解答清楚之后再进入下一步规划环节显得尤为重要[^2]。 #### 架构设计方案说明 根据不同的应用场景可以选择相应的解决方案架构图来进行搭建。例如采用 Master-Slave 结构形式或者 Ring Buffer 方式都可以有效提升系统的吞吐量水平;另外还需要注意设置合理的 checkpoint 时间间隔参数值以便于发生异常情况时候能够快速恢复状态信息继续正常运转下去而不至于丢失太多未保存下来的重要资料记录等内容细节都需要仔细斟酌决定才行哦! --- ### 案例分析——实时读取本地文件到HDFS 此案例展示了如何利用 Flume 把位于服务器上的文本文件内容不间断地传送到远程 Hadoop 文件系统 (HDFS) 当中去储存起来供后续进一步加工计算使用的目的达成方法步骤如下所示: 1. 创建一个新的 conf 目录用于放置自定义配置文件; 2. 编辑 flume-conf.properties 文件添加相应条目描述 source type 设置为 spooling directory monitor 并指明待观察的目标路径地址以及 target hdfs location URI 地址等相关属性字段填写完整无误即可成功建立连接关系链路从而实现预期功能目的. ```properties agent.sources = dir-source agent.sinks = hdfs-sink agent.channels = memory-channel # Define the source agent.sources.dir-source.type = spooldir agent.sources.dir-source.spoolDir = /path/to/spooldir agent.sources.dir-source.fileHeader = true # Define the sink agent.sinks.hdfs-sink.type = hdfs agent.sinks.hdfs-sink.hdfs.path = hdfs://namenode:8020/user/flume/ agent.sinks.hdfs-sink.hdfs.fileType = DataStream agent.sinks.hdfs-sink.hdfs.writeFormat = Text # Use a channel which buffers events in memory agent.channels.memory-channel.type = memory agent.channels.memory-channel.capacity = 1000 agent.channels.memory-channel.transactionCapacity = 100 # Bind the source and sink to the channel agent.sources.dir-source.channels = memory-channel agent.sinks.hdfs-sink.channel = memory-channel ``` 上述脚本片段演示了一个典型的 Flume 应用程序配置示例,其中包括 Spool Directory Source 和 HDFS Sink 的联合运用情景下所必需的各项关键参数设定项逐一列举出来供大家参考借鉴学习之用。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值