Flume 简介及使用案例

本文深入介绍了Apache Flume的架构、基本概念及其在日志数据收集、聚合和传输中的应用。涵盖Flume的组件如Source、Sink、Channel的工作原理,以及如何配置和部署Flume。并提供了多个使用案例,包括监听文件变动、上传数据到HDFS、跨服务器日志传输和断点续传等。

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

Flume 简介及使用案例

参考:

​ 官方文档:http://flume.apache.org/releases/content/1.8.0/FlumeUserGuide.html

​ 中文文档:https://flume.liyifeng.org/#

系统要求

  1. Java运行环境 - Java 1.8或更高版本
  2. 内存 - 足够的内存 用来配置Souuces、Channels和Sinks
  3. 硬盘空间 - 足够的硬盘用来配置Channels 和 Sinks
  4. 目录权限 - Agent用来读写目录的权限

提示:唯一有用的就是第一行,其余都是废话。我找出了最近几个Flume版本对JRE的依赖,如下表:

Flume版本依赖的JRE版本
Flume 1.8.0Java1.8 或更高版本
Flume 1.7.0Java1.7 或更高版本
Flume 1.4.0、1.5.0、1.5.2、1.6.0Java1.6 或更高版本(建议使用1.7)

一、Flume简介

Apache Flume 是一个分布式、高可靠、高可用的用来收集、聚合、转移不同来源的大量日志数据到中央数据仓库的工具

Apache Flume是Apache软件基金会(ASF)的顶级项目

新用户我们建议使用性能更好、配置更灵活的1.x版本

提示

Flume是一个很NB的用来收集日志的工具,因为历史原因现在有两个版本0.9.x和1.x,从版本号也能看出来1.x版本新一些(通常软件系统有大的重构之后才会有大版本号的升级),所以新用户推荐使用1.x版本。

二、Flume架构和基本概念

下图为 Flume 的基本架构图:

2.1 基本架构

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

2.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) 进程,包含 SourceChannelSink 等组件。

2.3 组件种类

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

  • Source 类型 :内置了几十种类型,如 Avro SourceThrift SourceKafka SourceJMS Source
  • Sink 类型 :HDFS SinkHive SinkHBaseSinksAvro Sink 等;
  • Channel 类型 :Memory ChannelJDBC ChannelKafka ChannelFile Channel 等。

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

三、Flume架构模式

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

3.1 multi-agent flow


Flume 支持跨越多个 Agent 的数据传递,这要求前一个 Agent 的 Sink 和下一个 Agent 的 Source 都必须是 Avro 类型,Sink 指向 Source 所在主机名 (或 IP 地址) 和端口(详细配置见下文案例三)。

3.2 复杂流

Flume可以设置多级Agent连接的方式传输Event数据。也支持扇入和扇出的部署方式,类似于负载均衡方式或多点同时备份的方式。

提示:这里必须解释一下,第一句的意思是可以部署多个Agent组成一个数据流的传输链。第二句要知道扇入(多对一)和扇出(一对多)的概念,就是说Agent可以将数据流发到多个下级Agent,也可以从多个Agent发到一个Agent中。

其实他们就是想告诉你,你可以根据自己的业务需求来任意组合传输日志的Agent实例,引用一张后面章节的图,这就是一个扇入方式的Flume部署方式,前三个Agent的数据都汇总到一个Agent4上,最后由Agent4统一存储到HDFS。


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

3.3 Multiplexing the flow

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

四、Flume配置格式

4.1 在配置文件里面自定义环境变量

Flume可以替换配置文件中的环境变量,例如:

a1.sources = r1
a1.sources.r1.type = netcat
a1.sources.r1.bind = 0.0.0.0
a1.sources.r1.port = ${NC_PORT}
a1.sources.r1.channels = c1

警告:注意了,目前只允许在value里面使用环境变量(也就是说只能在等号右边用,左边不行)

启动Agent时候加上 propertiesImplementation = org.apache.flume.node.EnvVarResolverProperties 就可以了。

例如:

$ NC_PORT=44444 bin/flume-ng agent --conf conf --conf-file example.conf --name a1 -Dflume.root.logger=INFO,console -DpropertiesImplementation=org.apache.flume.node.EnvVarResolverProperties

警告:上面仅仅是个例子,环境变量可以用其他方式配置,比如在conf/flume-env.sh里面设置。

4.2 常规配置

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>
  1. 分别定义 Source,Sink,Channel 的具体属性。基本格式如下:
<Agent>.sources.<Source>.<someProperty> = <someValue>

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

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

五、Flume的安装部署

Linux 环境下 Flume 的安装部署

六、Flume使用案例

介绍几个 Flume 的使用案例:

  • 案例一:使用 Flume 监听文件内容变动,将新增加的内容输出到控制台。
  • 案例二:使用 Flume 监听指定目录,将目录下新增加的文件存储到 HDFS。
  • 案例三:使用 Avro 将本服务器收集到的日志数据发送到另外一台服务器。
  • 案例四:断点续传,监控多个文件目录

说明:以上案例是由浅入深的过程,在具体使用

6.1 案例一 监听文件内容变动

注:此方案容易出现数据丢失,可参照6.4

需求: 监听文件内容变动,将新增加的内容输出到控制台。

实现: 主要使用 Exec Source 配合 tail 命令实现。

1. 配置

新建配置文件 exec-memory-logger.properties,其内容如下:

#指定agent的sources,sinks,channels.就是命名组件的意思,给各个组件起个名字,每项可以指定多个,相当于变#量声明
a1.sources = s1  
a1.sinks = k1  
a1.channels = c1  
   
#配置sources属性
a1.sources.s1.type = exec
a1.sources.s1.command = tail -F /tmp/log.txt
a1.sources.s1.shell = /bin/bash -c

#将sources与channels进行绑定
a1.sources.s1.channels = c1
   
#配置sink 
a1.sinks.k1.type = logger

#将sinks与channels进行绑定  
a1.sinks.k1.channel = c1  
   
#配置channel类型
a1.channels.c1.type = memory
2. 启动
flume-ng agent \
--conf conf \
--conf-file /usr/app/apache-flume-1.6.0-cdh5.15.2-bin/examples/exec-memory-logger.properties \
--name a1 \
-Dflume.root.logger=INFO,console
3. 测试

向文件中追加数据:

控制台的显示:

6.2 案例二 监听目录内容变动,将变动内容上传的hdfs

需求: 监听指定目录,将目录下新增加的文件存储到 HDFS。

实现:使用 Spooling Directory SourceHDFS Sink

备注:首先,从hadoop的安装目录下,找到以下jar包,拷贝到flume的安装目录bin下

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-duNQIg0h-1586487389049)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1586099277794.png)]

1. 配置
#指定agent的sources,sinks,channels
a1.sources = s1  
a1.sinks = k1  
a1.channels = c1  
   
#配置sources属性
a1.sources.s1.type =spooldir  
a1.sources.s1.spoolDir =/tmp/logs
a1.sources.s1.basenameHeader = true
a1.sources.s1.basenameHeaderKey = fileName 
#将sources与channels进行绑定  
a1.sources.s1.channels =c1 

   
#配置sink 
a1.sinks.k1.type = hdfs
#此文件
a1.sinks.k1.hdfs.path = /flume/events/%y-%m-%d/%H/
a1.sinks.k1.hdfs.filePrefix = %{fileName}
#生成的文件类型,默认是Sequencefile,可用DataStream,则为普通文本
a1.sinks.k1.hdfs.fileType = DataStream  
a1.sinks.k1.hdfs.useLocalTimeStamp = true
#将sinks与channels进行绑定  
a1.sinks.k1.channel = c1
   
#配置channel类型
a1.channels.c1.type = memory
2. 启动

进入flume的bin目录,或者把flume/bin配到环境变量中,可以执行下面命令

flume-ng agent \
--conf conf \
--conf-file /usr/app/apache-flume-1.6.0-cdh5.15.2-bin/examples/spooling-memory-hdfs.properties \
--name a1 -Dflume.root.logger=INFO,console


3. 测试

拷贝任意文件到监听目录下,可以从日志看到文件上传到 HDFS 的路径:

# cp log.txt logs/

查看上传到 HDFS 上的文件内容与本地是否一致:

# hdfs dfs -cat /flume/events/19-04-09/13/log.txt.1554788567801

6.3 案例三 监听文件变动,将变化内容发送到某服务器端口

需求: 将本服务器收集到的数据发送到另外一台服务器。

实现:使用 avro sourcesavro Sink 实现。

1. 配置日志收集Flume

新建配置 netcat-memory-avro.properties,监听文件内容变化,然后将新的文件内容通过 avro sink 发送到 hadoop001 这台服务器的 8888 端口:

#指定agent的sources,sinks,channels
a1.sources = s1
a1.sinks = k1
a1.channels = c1

#配置sources属性
a1.sources.s1.type = exec
a1.sources.s1.command = tail -F /tmp/log.txt
a1.sources.s1.shell = /bin/bash -c
a1.sources.s1.channels = c1

#配置sink
a1.sinks.k1.type = avro
a1.sinks.k1.hostname = hadoop001
a1.sinks.k1.port = 8888
a1.sinks.k1.batch-size = 1
a1.sinks.k1.channel = c1

#配置channel类型
a1.channels.c1.type = memory
a1.channels.c1.capacity = 1000
a1.channels.c1.transactionCapacity = 100
2. 配置日志聚合Flume

使用 avro source 监听 hadoop001 服务器的 8888 端口,将获取到内容输出到控制台:

#指定agent的sources,sinks,channels
a2.sources = s2
a2.sinks = k2
a2.channels = c2

#配置sources属性
a2.sources.s2.type = avro
a2.sources.s2.bind = hadoop001
a2.sources.s2.port = 8888

#将sources与channels进行绑定
a2.sources.s2.channels = c2

#配置sink
a2.sinks.k2.type = logger

#将sinks与channels进行绑定
a2.sinks.k2.channel = c2

#配置channel类型
a2.channels.c2.type = memory
a2.channels.c2.capacity = 1000
a2.channels.c2.transactionCapacity = 100
3. 启动

启动日志聚集 Flume:

flume-ng agent \
--conf conf \
--conf-file /usr/app/apache-flume-1.6.0-cdh5.15.2-bin/examples/avro-memory-logger.properties \
--name a2 -Dflume.root.logger=INFO,console

在启动日志收集 Flume:

flume-ng agent \
--conf conf \
--conf-file /usr/app/apache-flume-1.6.0-cdh5.15.2-bin/examples/netcat-memory-avro.properties \
--name a1 -Dflume.root.logger=INFO,console

这里建议按以上顺序启动,原因是 avro.source 会先与端口进行绑定,这样 avro sink 连接时才不会报无法连接的异常。但是即使不按顺序启动也是没关系的,sink 会一直重试,直至建立好连接。

4.测试

向文件 tmp/log.txt 中追加内容:

可以看到已经从 8888 端口监听到内容,并成功输出到控制台:

6.4 断点续传,监控多个文件目录

​ 需求:在传输数据时需要考虑agent重启等异常情况,确保数据完整性

​ 实现:taildir source ------ File Channel -------- Logger Sink

1 配置

创建配置文件: taildir-flume-logger.conf

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

a1.sources.r1.type=TAILDIR
# 用来设定一个记录每个文件的绝对路径和最近一次读取位置inode的文件,这个文件是JSON格式
a1.sources.r1.positionFile = /tmp/flume-test/position/taildir_position.json
# 被监控的文件夹目录集合,这些文件夹下的文件都会被监控,多个用空格分隔
a1.sources.r1.filegroups=f1 f2
# 被监控文件夹的绝对路径。正则表达式(注意不会匹配文件系统的目录)只是用来匹配文件名
a1.sources.r1.filegroups.f1=/tmp/flume-test/test.txt
# 给某个文件组下的Event添加一个固定的键值对到header中,值就是value。一个文件组可以配置多个键值对。
a1.sources.r1.headers.f1.headerKey1 = value1
a1.sources.r1.filegroups.f2 = /tmp/logs/.*log.*
a1.sources.r1.headers.f2.headerKey1 = value2
a1.sources.r1.headers.f2.headerKey2 = value2-2
a1.sources.r1.fileHeader = true

# Describe the sink
a1.sinks.k1.type = logger

# 使用文件系统
a1.channels.c1.type = file

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

​ 进入flume的安装目录

 ./bin/flume-ng agent --conf conf --conf-file ./job/taildir-flume-logger.conf --name a1 -Dflume.root.logger=INFO,console
3 测试

在/tmp/logs/目录下创建test.log.123

创建echo ‘cccccccccccc’ >> test.log.123

可以看到控制台cccccccccccc的输出

此时停掉flume连接,再向文件里添加数据后。再启动flume,可以看到刚才添加的数据已经在控制台自动打出。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NaumcQvk-1586487389050)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1586418151288.png)]

七 案例扩展

flume支持多种定制。

7.1 source支持的采集类型
7.2 sink支持以下导出类型
  • HDFS Sink: 将Event写入Hadoop分布式文件系统(也就是HDFS)
  • Hive Sink:将包含分隔文本或JSON数据的 Event 直接流式传输到 Hive表或分区上
  • Logger Sink:使用INFO级别把Event内容输出到日志中,一般用来测试、调试使用
  • Avro Sink: Event 将转换为Avro Event发送到指定的主机/端口上
  • Thrift Sink:发送到此Sink的 Event 将转换为 Thrift Event 发送到指定的主机/端口上
  • IRC Sink:从连接的 channel 获取消息然后将这些消息中继到配置的 IRC 目标上
  • File Roll Sink:把 Event 存储到本地文件系统
  • Null Sink:丢弃所有从 channel 读取到的 Event。
  • HBaseSinks:将数据写入 HBase
  • MorphlineSolrSink:将其近乎实时地加载到 Apache Solr 服务器中,后者又向最终用户或搜索应用程序提供查询服务。
  • ElasticSearchSink:把数据写入到 elasticsearch 集群
  • Kite Dataset Sink
  • Kafka Sink: 把数据发送到 Kafka topic上
  • HTTP Sink:从 channel 中获取 Event,然后再向远程 HTTP 接口 POST 发送请求,Event 内容作为 POST 的正文发送
  • Custom Sink: 自定义
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值