大数据笔记--Flume(第一篇)

本文详细介绍了Apache Flume的基础概念、执行流程,以及各类Source组件如AVROSource、ExecSource等的配置与应用实例。涵盖安装、多级流动和自定义Source的开发。

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

目录

一、Flume的简介

1、概述

2、基本概念

3、流动模型/拓扑结构

①、单级流动

②、多级流动

③、扇入流动

④、扇出流动

⑤、复杂流动

二、执行流程

三、安装Flume

四、Source

1、AVRO Source

①、概述

②、配置属性

③、案例

2、Exec Source

①、概述

②、配置属性

③、案例

3、Spooling Directory Source

①、概述

②、配置属性

③、案例

4、Netcat Source

①、概述

②、配置属性

③、案例

5、Sequence Generator Source

①、概述

②、配置属性

③、案例

 6、HTTP Source

①、概述

③、案例

五、Custom Source

1、概述

2、步骤


 一、Flume的简介

1、概述

①、Flume原本是由Cloudera公司开发的后来贡献给了Apache的一套分布式的、可靠的、针对日志数据进行收集(collecting)、汇聚(aggregating)和传输(moving)的机制

②、在大数据中,实际开发中有超过70%的数据来源于日志,日志是大数据的基石

③、Flume针对日志提供了非常简单且灵活的流式传输机制

④、版本

        Flume0.X:又称之为Flume-og。依赖于Zookeeper,结构配置相对复杂,现在市面上已经停用这个版本

        Flume1.X:又称之为Flume-ng。不依赖于Zookeeper,结构配置相对简单,是市面上常用的版本

2、基本概念

①、Event

        在Flume中,会将收集到的每一条日志封装成一个Event对象 - 在Flume中,一个Event就对应了一条日志

        Event本质上是一个json串,固定的包含两部分:headers和body - Flume将收集到的日志封装成一个json,而这个json就是Event。Event的结构是{"headers":{},"body":""}

②、Agent:是Flume流动模型的基本组成结构,固定的包含了三个部分:

        Source:从数据源采集数据的 - collecting

        Channel:临时存储数据 - aggregating

        Sink:将数据写往目的地 - moving

3、流动模型/拓扑结构

①、单级流动

②、多级流动

理解:就像城市中从小河取水,为了防止雨天城市被水淹,我们将城市与小河相隔较远,但是取水如何方便,我们可以建立蓄水此,建立一个实际上就是三个阶段,从小河引水,蓄水池蓄水,送到城市。一个蓄水池,可以理解为单极流动,多个就可以理解为多级流动。

③、扇入流动

 理解:可以看成多个水源的合并过程。

④、扇出流动

⑤、复杂流动

复杂流动:实际过程中,根据不同的需求来将上述的流动模型进行组合,就构成了复杂流动结构

二、执行流程

1、Source会先采集数据,然后将数据发送给ChannelProcessor进行处理

2、ChannelProcessor处理之后,会将数据交给Interceptor来处理,注意,在Flume允许存在多个Interceptor来构成拦截器链

3、Interceptor处理完成之后,会交给Selector处理,Selector存在两种模式:replicating和multiplexing。Selector收到数据之后会根据对应的模式将数据交给对应的Channel来处理

4、Channel处理之后会交给SinkProcessor。SinkProcessor本质上是一个Sinkgroup,包含了三种方式:Default,Failover和Load Balance。SinkProcessor收到数据之后会根据对应的方式将数据交给Sink来处理

5、Sink收到数据之后,会将数据写到指定的目的地

三、安装Flume

1、要求虚拟机或者云主机上必须安装JDK1.8,最好安装Hadoop

2、进入/home/software目录下,上传apache-flume-1.9.0-bin.tar.gz

cd /home/software/

3、解压Flume的安装包

tar -xvf apache-flume-1.9.0-bin.tar.gz

4、让Flume和Hadoop兼容(如果没有安装Hadoop,那么这一步不需要执行)

cd apache-flume-1.9.0-bin/lib

rm -rf guava-11.0.2.jar

5、新建目录用于存储Flume的格式文件

cd ..

mkdir data

cd data

6、编辑格式文件

vim basic.conf

添加格式文件内容

# 给Agent起名
# 给Source起名
a1.sources = s1
# 给Channel起名
a1.channels = c1
# 给Sink起名
a1.sinks = k1

# 配置Source
a1.sources.s1.type = netcat
a1.sources.s1.bind = 0.0.0.0
a1.sources.s1.port = 8090

# 配置Channel
a1.channels.c1.type = memory

# 配置Sink
a1.sinks.k1.type = logger

# 将Source和Channel绑定
a1.sources.s1.channels = c1
# 将Sink和Channel绑定
a1.sinks.k1.channel = c1

7、启动Flume

../bin/flume-ng agent -n a1 -c ../conf -f basic.conf -Dflume.root.logger=INFO,console

参数解释:

参数

解释

-n,--name

指定要运行的Agent的名字

-c,--conf

指定Flume运行的原生配置

-f,--conf-file

指定要运行的文件

-Dflume.root.logger

指定Flume本身运行日志的打印级别及打印方式

四、Source

1、AVRO Source

①、概述

AVRO Source监听指定的端口,接收其他节点发送来的被AVRO序列化的数据

AVRO Source结合AVRO Sink可以实现更多的流动模型,包括多级流动、扇入流动以及扇出流动

②、配置属性

属性

解释

type

必须是avro

bind

要监听的主机的主机名或者IP

port

要监听的端口

③、案例

编辑格式文件vim avrosource.conf,在格式文件添加指定的内容

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


# 配置AVRO Source
# 必须是avro
a1.sources.s1.type = avro
# 指定要监听的主机
a1.sources.s1.bind = hadoop01
# 指定要监听的端口
a1.sources.s1.port = 8090

a1.channels.c1.type = memory

a1.sinks.k1.type = logger

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

启动Flume

../bin/flume-ng agent -n a1 -c ../conf -f avrosource.conf -Dflume.root.logger=INFO,console

在另一个窗口中,进入指定目录,编辑文件

cd /home/software/apache-flume-1.9.0-bin/data

vim a.txt

运行AVRO客户端

../bin/flume-ng avro-client -H hadoop01 -p 8090 -F a.txt

 在flume窗口可以看到监听内容

2、Exec Source

①、概述

Exec Source会运行指定的命令,然后将命令的执行结果作为日志进行收集

利用这个Source可以实现对文件或者其他操作的实时监听

②、配置属性

属性

解释

type

必须是exec

command

要执行和监听的命令

shell

最好指定这个属性,表示指定Shell的运行方式

③、案例

需求:实时监听/home/a.txt文件的变化

编辑vim execsource.conf格式文件,添加如下内容

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

# 配置Exec Source
# 必须是exec
a1.sources.s1.type = exec
# 指定要运行的命令
a1.sources.s1.command = tail -F /home/a.txt
# 指定Shell的运行方式/类型
a1.sources.s1.shell = /bin/bash -c

a1.channels.c1.type = memory

a1.sinks.k1.type = logger

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

启动Flume

 ../bin/flume-ng agent -n a1 -c ../conf -f execsource.conf -Dflume.root.logger=INFO,console

修改文件内容

echo "hello java" >> a.txt

在一个窗口执行操作

flume窗口就会监听到文件变化

3、Spooling Directory Source

①、概述

Spooling Directory Source是监听指定的目录,自动将目录中出现的新文件的内容进行收集

如果不指定,默认情况下,一个文件被收集之后,会自动添加一个后缀.COMPLETED,通过通过属性fileSuffix来修改

②、配置属性

属性

解释

type

必须是spooldir

spoolDir

要监听的目录

fileSuffix

收集之后添加的文件后缀,默认是.COMPLETED

③、案例

编辑vim spoolingdirsource.conf格式文件,添加如下内容

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

# 配置Spooling Directory Source
# 必须是spooldir
a1.sources.s1.type = spooldir
# 指定要监听的目录
a1.sources.s1.spoolDir = /home/flumedata

a1.channels.c1.type = memory

a1.sinks.k1.type = logger

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

启动flume

../bin/flume-ng agent -n a1 -c ../conf -f spoolingdirsource.conf -Dflume.root.logger=INFO,console

在另一个窗口操作

 我们会发现,监听窗口将a.txt的文件内容放到flumedata这个操作日志打印出来了 

4、Netcat Source

①、概述

Netcat Source在Flume1.9之后分为Netcat TCP Source和Netcat UDP Source

如果不指定,那么Netcat Source监听的是TCP请求

②、配置属性

属性

解释

type

如果监听TCP请求,那么使用netcat;如果监听UDP请求,那么使用netcatudp

bind

要监听的主机的主机名或者IP

port

要监听的端口

③、案例

上面入门案例监听的是TCP请求。

现在我们编辑vim netcatudpsource.conf格式文件,添加如下内容(以UDP为例):

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

# 配置Netcat UDP Source
# 必须是netcatudp
a1.sources.s1.type = netcatudp
# 指定要监听的主机
a1.sources.s1.bind = 0.0.0.0
# 指定要监听的端口
a1.sources.s1.port = 8090

a1.channels.c1.type = memory

a1.sinks.k1.type = logger

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

启动Flume

../bin/flume-ng agent -n a1 -c ../conf -f netcatudpsource.conf -Dflume.root.logger=INFO,console

启动nc

nc -u hadoop01 8090

 

5、Sequence Generator Source

①、概述

Sequence Generator Source本质上就是一个序列产生器,会从0开始每次递增1个单位

如果不指定,默认情况下递增到Long.MAX_VALUE

②、配置属性

属性

解释

type

必须是seq

totalEvents

递增的结束范围

③、案例

编辑vim seqsource.conf格式文件,添加如下内容

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

# 配置Sequence Generator Source
# 必须是seq
a1.sources.s1.type = seq
# 指定结束范围
a1.sources.s1.totalEvents = 10

a1.channels.c1.type = memory

a1.sinks.k1.type = logger

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

启动flume

../bin/flume-ng agent -n a1 -c ../conf -f seqsource.conf -Dflume.root.logger=INFO,console

 6、HTTP Source

①、概述

HTTP Source用于监听HTTP请求,但是只能监听POST和GET请求

GET请求只用于试验阶段,所以实际过程中只用这个Source来监听POST请求

②、配置属性

属性

解释

type

必须是http

port

要监听的端口

③、案例

编辑vim httpsource.conf格式文件,添加如下内容

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

# 配置HTTP Source
# 必须是http
a1.sources.s1.type = http
# 指定要监听的端口
a1.sources.s1.port = 8090

a1.channels.c1.type = memory

a1.sinks.k1.type = logger

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

启动flume

../bin/flume-ng agent -n a1 -c ../conf -f httpsource.conf -Dflume.root.logger=INFO,console

发送POST请求

curl -X POST -d '[{"headers":{"kind":"test","class":"bigdata"},"body":"testing"}]' http://hadoop01:8090http://hadoop01:8090http://hadoop01:8090

五、Custom Source

1、概述

①、自定义Source:需要定义一个类实现Source接口的子接口:EventDrivenSource或者PollableSource

EventDrivenSource:事件驱动源 - 被动型Source。需要自己定义线程来获取数据处理数据

PollableSource:拉取源 - 主动型Source。提供了线程来获取数据,只需要考虑怎么处理数据即可

②、除了实现上述两个接口之一,这个自定义的类一般还需要考虑实现Configurable接口,通过接口的方法来获取指定的属性

2、步骤

①、需要构建Maven工程,导入对应的POM依赖

<dependencies>
        <dependency>
            <groupId>org.apache.flume</groupId>
            <artifactId>flume-ng-core</artifactId>
            <version>1.9.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.flume</groupId>
            <artifactId>flume-ng-sdk</artifactId>
            <version>1.9.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.flume</groupId>
            <artifactId>flume-ng-configuration</artifactId>
            <version>1.9.0</version>
        </dependency>
    </dependencies>

②、定义类继承AbstractSource,实现EventDrivenSource和Configurable接口

③、覆盖configure,start和stop方法

package org.example.flume.source;

import org.apache.flume.Context;
import org.apache.flume.Event;
import org.apache.flume.EventDrivenSource;
import org.apache.flume.channel.ChannelProcessor;
import org.apache.flume.conf.Configurable;
import org.apache.flume.event.EventBuilder;
import org.apache.flume.source.AbstractSource;

import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

// 模拟:Sequence Generator Source
public class AuthSource extends AbstractSource implements EventDrivenSource, Configurable {
    private ExecutorService es;
    private  long end;
    private  long step;
    // 启动Source
    @Override
    public synchronized void start() {
        //构建线程池
        es = Executors.newFixedThreadPool(5);
        // 获取Channel处理器
        ChannelProcessor cp = this.getChannelProcessor();
        //提交任务
        es.submit(new Add(end, step,cp));
    }

    @Override
    public synchronized void stop() {
        if (es != null){
            es.shutdown();
        }

    }

    //通过这个方法来获取指定的属性值
    @Override
    public void configure(Context context) {
        //获取自增的最大值,如果不指定,默认是Long.MAX_VALUE
        end = context.getLong("end", Long.MAX_VALUE);
        //获取自增的步长,如果不指定,默认是1
        step = context.getLong("step", 1L);
    }
}

class Add implements Runnable{
    private  final long end;
    private final long step;
    private  final ChannelProcessor cp;

    Add(long end, long step,ChannelProcessor cp) {
        this.end = end;
        this.step = step;
        this.cp=cp;
    }

    @Override
    public void run() {
        for(long i=0;i<end;i+=step){
            // 在Flume中,数据都是以Event形式存在的
            // 封装body
            byte[] body = (i+"").getBytes(StandardCharsets.UTF_8);
            // 封装headers
            Map<String,String> headers = new HashMap<>();
            headers.put("time",System.currentTimeMillis()+"");
            // 构建Event对象
            Event e = EventBuilder.withBody(body,headers);
            // 将Event对象交给Channel处理器处理
            cp.processEvent(e);
        }
    }
}

④、定义完成之后,需要将类打成jar包放到Flume安装目录的lib目录下

 

⑤、编写格式文件,例如

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

# 配置自定义Source
# 必须是类的全路径名
a1.sources.s1.type =org.example.flume.source.AuthSource
# 指定结束范围
a1.sources.s1.end = 100
# 指定递增的步长
a1.sources.s1.step = 5

a1.channels.c1.type = memory

a1.sinks.k1.type = logger

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

⑥、启动flume

../bin/flume-ng agent -n a1 -c ../conf -f authsource.conf -Dflume.root.logger=INFO,console

### 关于大数据平台中 Flume 的安装配置与运维 Flume 是一种分布式、可靠且高可用的日志收集系统,广泛应用于大数据平台中的日志数据采集和传输场景。以下是关于 Flume大数据平台中的安装、配置以及运维的一些关键点: #### 1. **Flume 的基本概念** Flume 主要由三个核心组件组成:Source(源)、Channel(通道)和 Sink(目标)。 - Source 负责接收事件并将其传递到 Channel 中。 - Channel 是一个临时缓冲区,用于存储来自 Source 的事件直到它们被传送到 Sink。 - Sink 将事件写入外部存储或发送到下一个 Flume Agent[^3]。 #### 2. **Flume 的安装过程** 在 Linux 环境下安装 Flume 可以通过以下方式完成: - 下载 Apache Flume 的官方版本包,并解压至指定目录。 - 设置环境变量 `FLUME_HOME` 和 `PATH` 来简化命令调用。 - 使用如下命令验证 Flume 是否成功安装: ```bash [root@master conf]# flume-ng version ``` 如果显示 Flume 版本号,则说明安装成功[^3]。 #### 3. **Flume 的配置方法** Flume 的配置主要依赖于其配置文件(通常是 `.conf` 文件),该文件定义了 Source、Channel 和 Sink 的具体实现及其参数设置。例如,下面是一个简单的 Flume 配置示例: ```properties agent.sources = netcat-source agent.sinks = logger-sink agent.channels = memory-channel agent.sources.netcat-source.type = netcat agent.sources.netcat-source.bind = localhost agent.sources.netcat-source.port = 44444 agent.sinks.logger-sink.type = logger agent.channels.memory-channel.type = memory agent.channels.memory-channel.capacity = 1000 agent.channels.memory-channel.transactionCapacity = 100 agent.sources.netcat-source.channels = memory-channel agent.sinks.logger-sink.channel = memory-channel ``` 此配置表示 Flume 接收网络输入并通过内存通道将数据记录到控制台日志中[^3]。 #### 4. **Flume 的运维实践** 为了确保 Flume 在生产环境中稳定运行,可以采取以下措施: - **性能优化**:调整 Channel 的容量 (`capacity`) 和事务大小 (`transactionCapacity`) 参数来适应不同的流量负载[^3]。 - **监控机制**:利用 Cloudera Manager 或 Ambari 等工具对 Flume 实时监控,查看吞吐量、延迟等指标[^4]。 - **错误恢复策略**:启用 Flume 的内置重试机制,在发生短暂连接失败时自动尝试重新发送数据[^3]。 #### 5. **常见问题排查** 当遇到 Flume 故障时,可以通过检查日志文件定位问题原因。一些典型的错误可能包括但不限于: - 数据丢失:可能是由于 Channel 缓存不足或者 Sink 写入速度过慢引起。 - 性能瓶颈:通常表现为 CPU 占用率过高或磁盘 I/O 延迟增加。 --- ### 示例代码 启动 Flume Agent 的命令如下所示: ```bash flume-ng agent --name agent --conf $FLUME_CONF_DIR --conf-file example.conf -Dflume.root.logger=INFO,console ``` 其中 `$FLUME_CONF_DIR` 表示 Flume 配置文件所在的路径,而 `example.conf` 则是具体的配置文件名称[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

是小先生

知识是无价的,白嫖也可以的。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值