Apache Flum【入门篇】

Apache Flume是一个高可用、高可靠的数据采集系统,用于收集、聚合和传输大规模日志数据。本文介绍了Flume的基本概念、架构、安装步骤、主要组件如Source、Sink和Channel的类型及其配置,并探讨了高级组件的应用,包括拦截器、通道选择器和SinkProcessor。Flume支持多种数据源和输出方式,如Avro、Kafka等,适合大规模日志处理场景。
摘要由CSDN通过智能技术生成

⚠Flume是什么?

Flume 是一种分布式,可靠且可用的服务,用于有效地收集,聚合 和移动大量数据。

Flume 构建在日志流之上一个简单灵活的架构。它具有可靠性 机制和许多故障转移和恢复机制,具有强大的容错性。使用Flume这套架构实现在线分析。Flume支持在日志系统中定制各类`数据发送方`,用于收集数据;同时,Flume 提供对数据进行简单的处理,并且写到各种`数据接收方` (可定制)的能力,当前Flume 有两个版本 0.9X版本的统称为Flume-og, Flume1.X 版本统称为Flume-ng。由于Flume-ng经过重大的重构,与Flume-og有很大的不同,使用时注意区分。本篇文章使用的是 apache-flume-1.9.0-bin.tar.gz

Flume的架构

在这里插入图片描述

自我理解

Flume是Cloudera开发的一个高可用的,高可靠的,分布式的海量日志采集、聚合和传输的系统,Flume支持在日志系统中定制各类数据发送方,用于收集数据。数据源可定制、可扩展,数据存储系统可定制、可扩展。

flume运行的核心是agent。它是一个完整的数据收集工具,含有三个核心组件,分别是source、channel、sink。通过这些组件,event可以从一个地方流向另一个地方。为了保证输送一定成功,在送到目的地之前,会先缓存数据,待数据真正到达目的地后,删除自己缓存的数据。

Flume的安装

准备工作:

①确保机器上安装有JDK 1.8+ 并且配置JAVA_HOME

②下载 Flume的安装包 http://mirror.reverse.net/pub/apache/flume/1.9.0/apache-flume-1.9.0-bin.tar.gz

安装步骤:

[root@CentOSA ~]# tar -zxf  apache-flume-1.9.0-bin.tar.gz -C /usr/
[root@CentOSA ~]# cd /usr/apache-flume-1.9.0-bin/
[root@CentOSA apache-flume-1.9.0-bin]# ./bin/flume-ng version
Flume 1.9.0
Source code repository: https://git-wip-us.apache.org/repos/asf/flume.git
Revision: d4fcab4f501d41597bc616921329a4339f73585e
Compiled by fszabo on Mon Dec 17 20:45:25 CET 2018
From source with checksum 35db629a3bda49d23e9b3690c80737f9

Agent的配置模板

在Flume中 的三大核心组建为 source,channel,sink;这三个组建组成了一个Agent,而且一个Agent为一个日志采集的最小单位,所以配置Agent中的组件,根据业务需求进行自定义的配置 Agent中的组件,可以控制 数据的源头和输出 等,

# 声明组件信息
<Agent>.sources = <Source1> <Source2>
<Agent>.sinks = <Sink1> <Sink1>
<Agent>.channels = <Channel1> <Channel2>

# 组件配置
<Agent>.sources.<Source>.<someProperty> = <someValue>
<Agent>.channels.<Channel>.<someProperty> = <someValue>
<Agent>.sinks.<Sink>.<someProperty> = <someValue>

# 链接组件
<Agent>.sources.<Source>.channels = <Channel1> <Channel2> ...
<Agent>.sinks.<Sink>.channel = <Channel1>

解释:

<Agent><Source><Sink>表示组件的名字,系统有哪些可以使用的组件需要查阅文档

http://flume.apache.org/releases/content/1.9.0/FlumeUserGuide.html

快速入门

注意:在这个测试案例中需要 yum install -y telnet #必须安装该插件插件

[root@CentOS ~]# yum install -y telnet 

在flume conf文件中 编写配置文件

[root@CentOS apache-flume-1.9.0-bin]# vi conf/demo01.properties
# 声明组件信息 agent的名字为a1,3个组建的声明
a1.sources = r1
a1.sinks = k1
a1.channels = c1

# 组件配置   从Socket中接收文数据
a1.sources.r1.type = netcat
a1.sources.r1.bind = CentOS
a1.sources.r1.port = 44444
# 配置Sink组件,将接收数据结果打印在 日志控制台上
a1.sinks.k1.type = logger
#配置Cannel通道,主要是负责数据缓冲
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

启动

[root@CentOS apache-flume-1.9.0-bin]# ./bin/flume-ng agent --conf conf/ --conf-file conf/demo01.properties --name a1 -Dflume.root.logger=INFO,console

测试

[root@CentOSA ~]# telnet CentOSA 44444
Trying 192.168.40.129...
Connected to CentOSA.
Escape character is '^]'.
hello world
OK
ni hao
OK

常用组件

Source 输入源的类型

1.Avro Source

**Avro Source内部启动一个 avro服务器,(avro是一种内部传输协议),用来接收 avro client 的请求,将数据流向 Channel中 **

属性 默认值 描述
type *必填 Source 类型必须为 avro
bind *必填 绑定的IP
port *必填 绑定的端口号

配置文件:avro.properties

# 声明组件信息
a1.sources = s1
a1.sinks = sk1
a1.channels = c1

# 组件配置
a1.sources.s1.type = avro
a1.sources.s1.bind = CentOS
a1.sources.s1.port = 44444

a1.sinks.sk1.type = logger

a1.channels.c1.type = memory
a1.channels.c1.capacity = 1000
a1.channels.c1.transactionCapacity = 100

# 链接组件
a1.sources.s1.channels = c1
a1.sinks.sk1.channel = c1

启动

[root@CentOS apache-flume-1.9.0-bin]# ./bin/flume-ng agent -c conf/ -n a1 -f conf/avro.properties -Dflume.root.logger=INFO,console

测试

[root@CentOS apache-flume-1.9.0-bin]# ./bin/flume-ng avro-client --host CentOS --port 44444 --filename /root/t_emp.txt
2.Exec Source

Exec Source可以将一个指令的输出结果进行采集

属性 默认值 描述
channels 对接的管道
type *必填 Source的类型exec
command 所要执行的采集的命令

配置文件:exec.properties

注:tail -F 文件名 可 监听文件

# 声明组件信息
a1.sources = s1
a1.sinks = sk1
a1.channels = c1

# 组件配置
a1.sources.s1.type = exec
a1.sources.s1.command = tail -F /root/t_emp.txt

a1.sinks.sk1.type = logger

a1.channels.c1.type = memory
a1.channels.c1.capacity = 1000
a1.channels.c1.transactionCapacity = 100

# 链接组件
a1.sources.s1.channels = c1
a1.sinks.sk1.channel = c1

启动

[root@CentOS apache-flume-1.9.0-bin]# ./bin/flume-ng agent -c conf/ -n a1 -f conf/exec.properties -Dflume.root.logger=INFO,console

测试

[root@CentOS apache-flume-1.9.0-bin]# echo test >> /root/t_emp.txt


2020-01-31 08:40:10,016 (SinkRunner-PollingRunner-DefaultSinkProcessor) [INFO - org.apache.flume.sink.LoggerSink.process(LoggerSink.java:95)] Event: {
    headers:{
   } body: }
2020-01-31 08:42:16,070 (SinkRunner-PollingRunner-DefaultSinkProcessor) [INFO - org.apache.flume.sink.LoggerSink.process(LoggerSink.java:95)] Event: {
    headers:{
   } body: 74 65 73 74                                     test }
3.Spooling Directory Source

Spooling Directory Source 采集指定文件目录下的新增文件

属性 默认值 描述
channels 需要对接的管道
type * Source的类型 spooldir
spoolDir 所要采集哪个文件夹下的文件目录
fileSuffix .COMPLETED 采集的文件后缀
fileHeader false 不显示消息头 可选值 false|true

配置文件 spooldir.properties

# 声明组件信息
a1.sources = s1
a1.sinks = sk1
a1.channels = c1

# 组件配置
a1.sources.s1.type = spooldir
a1.sources.s1.spoolDir = /root/spooldir
a1.sources.s1.fileHeader = true

a1.sinks.sk1.type = logger

a1.channels.c1.type = memory
a1.channels.c1.capacity = 1000
a1.channels.c1.transactionCapacity = 100

# 链接组件
a1.sources.s1.channels = c1
a1.sinks.sk1.channel = c1

启动

[root@CentOS apache-flume-1.9.0-bin]# ./bin/flume-ng agent -c conf/ -n a1 -f conf/spooldir.properties -Dflume.root.logger=INFO,console

测试 拷贝一个文件到 所配置文件 /root/spooldir下

[root@CentOS ~]# cp t_emp.txt /root/spooldir/



2020-01-31 08:57:20,135 (SinkRunner-PollingRunner-DefaultSinkProcessor) [INFO - org.apache.flume.sink.LoggerSink.process(LoggerSink.java:95)] Event: {
    headers:{
   file=/root/spooldir/t_emp.txt} body: 37 39 30 30 09 4A 41 4D 45 53 09 43 4C 45 52 4B 7900.JAMES.CLERK }
2020-01-31 08:57:20,135 (SinkRunner-PollingRunner-DefaultSinkProcessor) [INFO - org.apache.flume.sink.LoggerSink.process(LoggerSink.java:95)] Event: {
    headers:{
   file=/root/spooldir/t_emp.txt} body: 37 39 30 32 09 46 4F 52 44 09 41 4E 41 4C 59 53 7902.FORD.ANALYS }
2020-01-31 08:57:20,135 (SinkRunner-PollingRunner-DefaultSinkProcessor) [INFO - org.apache.flume.sink.LoggerSink.process(LoggerSink.java:95)] Event: {
    headers:{
   file=/root/spooldir/t_emp.txt} body: 37 39 33 34 09 4D 49 4C 4C 45 52 09 43 4C 45 52 7934.MILLER.CLER }
2020-01-31 08:57:20,135 (SinkRunner-PollingRunner-DefaultSinkProcessor) [INFO - org.apache.flume.sink.LoggerSink.process(LoggerSink.java:95)] Event: {
    headers:{
   file=/root/spooldir/t_emp.txt} body: }
2020-01-31 08:57:20,135 (SinkRunner-PollingRunner-DefaultSinkProcessor) [INFO - org.apache.flume.sink.LoggerSink.process(LoggerSink.java:95)] Event: {
    headers:{
   file=/root/spooldir/t_emp.txt} body: 74 65 73 74                                     test }

4.Taildir Source

Taildir Source 实时监控文本行的追加,对数据进行采集,并且会记录所采集文本数据行的偏移量,不会重复采集数据

它将以JSON格式定期将每个文件的最后读取位置写入给定位置文件。如果Flume由于某种原因停止或停机,它可以从写入现有位置文件中的位置重新开始拖尾

属性 默认值 描述
channels 所对接的管道
type Source的类型 TAILDIR
filegroups 以空格分隔的文件组列表。每个文件组指示一组要尾部的文件
filegroups. 文件组的绝对路径
positionFile ~/.flume/taildir_position.json 在跟下会有一个隐藏文件,来记录数据的便宜量

配置文件 taildir.properties

# 声明组件信息
a1.sources = s1
a1.sinks = sk1
a1.channels = c1

# 组件配置
a1.sources.s1.type = TAILDIR
a1.sources.s1.filegroups = g1 g2
a1.sources.s1.filegroups.g1 = /root/taildir/.*\.log$
a1.sources.s1.filegroups.g2 = /root/taildir/.*\.txt$

a1.sinks.sk1.type =
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值