Flume超级无敌详细讲解

简介

概述

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

图-1 Flume图标

Flume本身提供了较为简易的流式结构,使得开发者能够较为简易和方便的搭建Flume的流动模型。

图-2 Flume流动模型图

目前,Flume提供了两大版本:Flume0.x和Flume1.x版本:

1)Flume0.X:又称之为Flume-og版本,依赖于Zookeeper,结构配置相对复杂,现在在市面上已经不怎么常见了。

2)Flume1.X:又称之为Flume-ng版本,不依赖于Zookeeper,结构配置相对简单,是现在比较常用的版本。

截止到目前为止(2023年7月20日),Flume的最新版本是Flume1.11.0版本。

基本概念

在Flume中,有两个基本的概念:Event和Agent。

Event

在Flume中,会将收集到的每一条日志都封装成一个Event对象,所以一个Event就是一条日志。

Event本质上是一个json串,固定的包含两部分:headers和body。即Flume会将收集到的每一条日志封装成一个json,这个json就是一个Event。

{"headers":{},"body":""}

Agent

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

1)Source:从数据源采集数据(collecting);

2)Channel:将数据进行临时的存储(aggregating);

3)Sink:将数据进行传输(moving)。

流动模型/拓扑结构

Flume中,通过Agent之间相互组合,可以构成复杂的流动模型,包括:单级流动,多级流动,扇入流动,扇出流动以及复杂流动。

单级流动(Agent Flow),顾名思义,即只有1个Agent组成,数据经过Source采集,通过Sink写入目的地,经过一次流动即可。

图-3 单级流动

多级流动(Multi-agent Flow),又叫串联流动,是由2个及以上的Agent串联组成,数据需要流经多个Agent才能写到目的地。

图-4 多级流动

扇入流动(Consolidation),又叫聚集流动,是将多个Agent的结果汇聚到一个Agent中,最终写入目的地。

图-5 扇入流动

扇出流动(Multiplexing the flow),又叫复用流动,是将数据分别传输给多个Agent,写入多个目的地。

图-6 扇出流动

复杂流动(Flexible Flow),按照项目需求,将上述流动模型进行组合,构成的就是复杂流动。

编译和安装

编译

1)进入源码存放目录,上传或者下载Flume的源码包:

# 进入目录           cd /opt/presoftware/

# 官网下载地址

wget https://archive.apache.org/dist/flume/1.11.0/apache-flume-1.11.0-src.tar.gz

2)解压:

tar -xvf apache-flume-1.11.0-src.tar.gz -C /opt/source/

3)进入Flume源码目录:

cd /opt/source/apache-flume-1.11.0-src/

4)编译:

mvn -X package -Pdist,nativeN,docs -DskipTests -Dtar -Dmaven.skip.test=true -Dmaven.javadoc.skip=true -Denforcer.skip=true

5)编译好的安装包在flume-ng-dist/target目录下。

编译错误处理

如果编译过程中提示缺少了eigenbase,那么上传jar包之后,执行:

mvn install:install-file \

-Dfile=DynamoDBLocal-1.11.86.jar \

-DgroupId=com.amazonaws \

-DartifactId=DynamoDBLocal \

-Dversion=1.11.86 \

-Dpackaging=jar

缺少net.hydromatic:linq4j:jar:0.4:

mvn install:install-file \

-Dfile=linq4j-0.4.jar \

-DgroupId=net.hydromatic \

-DartifactId=linq4j \

-Dversion=0.4 \

-Dpackaging=jar

缺少net.hydromatic:quidem:jar:0.1:

mvn install:install-file \

-Dfile=quidem-0.1.1.jar \

-DgroupId=net.hydromatic \

-DartifactId=quidem \

-Dversion=0.1.1 \

-Dpackaging=jar

缺少org.pentaho:pentaho-aggdesigner-algorithm:jar:5.1.5-jhyde:

mvn install:install-file \

-Dfile=pentaho-aggdesigner-algorithm-5.1.5-jhyde.jar \

-DgroupId=org.pentaho \

-DartifactId=pentaho-aggdesigner-algorithm \

-Dversion=5.1.5-jhyde \

-Dpackaging=jar

安装

Flume本身是使用Java开发的,所以要求服务器上首先安装了JDK1.8。

1)进入软件预安装目录,上传或者下载安装包:

# 进入预安装目录

cd /opt/presoftware/

# 官网下载地址

wget --no-check-certificate https://dlcdn.apache.org/flume/1.11.0/apache-flume-1.11.0-bin.tar.gz

2)解压安装包:

tar -xvf apache-flume-1.11.0-bin.tar.gz -C /opt/software/

3)进入Flume安装目录:

cd /opt/software/

4)重命名目录:

mv apache-flume-1.11.0-bin/ flume-1.11.0

5)配置环境变量:

# 编辑文件

vim /etc/profile.d/flumehome.sh

# 在文件中添加

export FLUME_HOME=/opt/software/flume-1.11.0

export PATH=$PATH:$FLUME_HOME/bin

# 保存退出,生效

source /etc/profile.d/flumehome.sh

# 测试

flume-ng version

6)解决Flume的连接池包和Hadoop的连接池包不一致问题:

# 进入Flume的lib目录

cd flume-1.11.0/lib/

# 删除原来的连接池包

rm -rf guava-11.0.2.jar

# 复制Hadoop的连接池包

cp /opt/software/hadoop-3.2.4/share/hadoop/common/lib/guava-27.0-jre.jar ./

入门案例

1)进入Flume中,创建数据目录,用于存放格式文件:

# 进入Flume的安装目录

cd /opt/software/flume-1.11.0/

# 创建数据目录

mkdir data

# 进入目录

cd data

2)创建格式文件:

vim basic.properties

添加内容:

# 指定Agent的名字

# 指定Source的名字

# 如果要配置多个Source,那么Source之间用空格间隔

a1.sources = s1

# 指定Channel的名字

# 如果要配置多个Channel,那么Channel之间用空格间隔

a1.channels = c1

# 指定Sink的名字

# 如果要配置多个Sink,那么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

3)启动Flume:

flume-ng agent --name a1 --conf $FLUME_HOME/conf --conf-file basic.properties -Dflume.root.logger=INFO,console

上述命令可以简化为:

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

4)复制窗口,在新窗口中输入:

nc hadoop01 8090

# 回车之后发送数据

5)停掉Flume之后,会发现在当前的data目录下生成了一个新文件flume.log,而我们输入的数据被封装成了Event形式写入到了这个新文件中。

控制台打印

需要注意的是,从Flume1.10.0版本开始,使用log4j2.x替换log4j1.x,使用log4j2.xml替换了log4j.properties,因此使用Logger Sink不再输出到控制台上,而是将结果输出到了flume.log文件中。如果想要将数据打印到控制台上,操作如下:

1)进入Flume的配置文件目录:

cd /opt/software/flume-1.11.0/conf/

2)编辑文件:

vim log4j2.xml

修改文件内容如下:

<Loggers>

<Logger name="org.apache.flume.lifecycle" level="info"/>

<Logger name="org.jboss" level="WARN"/>

<Logger name="org.apache.avro.ipc.netty.NettyTransceiver" level="WARN"/>

<Logger name="org.apache.hadoop" level="INFO"/>

<Logger name="org.apache.hadoop.hive" level="ERROR"/>

<Root level="INFO">

<AppenderRef ref="Console"/>

<AppenderRef ref="LogFile" />

</Root>

</Loggers>

3)回到数据目录下:

cd ../data

4)重新启动Flume,发送数据,会发现数据已经打印到了控制台上。

参数解释

Flume启动过程中,需要用到多个参数,这多个参数的解释如下:

表-1 参数解释

完整写法

简写

解释

flume-ng

Flume启动命令

agent

表示启动Flume的Agent组件

--name

-n

指定要启动的Agent的名字,和格式文件中Agent的名字对应

--conf

-c

指定Flume的配置文件所在的位置,注意,这儿的配置文件是Flume自己的配置文件,而不是我们自己编写的格式文件/数据文件!默认情况下,Flume的配置文件在Flume安装目录的conf目录下

--conf-file

-f

指定要执行的格式文件的位置

-D

指定其他运行的参数

flume.root.logger

指定日志的打印级别和打印位置,可以指定级别包含INFO,WARN和ERROR,可以指定的打印位置包含console和logfile

Source

AVRO Source

AVRO Source会监听指定的端口,接收其他节点传过来的被AVRO序列化之后的数据。AVRO Source结合AVRO Sink可以实现更多的流动模型/拓扑结构,例如多级流动、扇入流动、扇出流动等。

AVRO Source中配置的选项有:

表-2 配置选项

选项

备注

解释

type

required

Source的类型,此处必须是avro

bind

required

要监听的服务器的主机名或者IP

port

required

要监听的端口

channels

required

Source需要绑定的Channel

案例:

1)编辑文件:

vim avrosource.properties

添加如下配置:

a1.sources = s1

a1.channels = c1

a1.sinks = k1



# 配置AVRO Source

# 类型必须是avro

a1.sources.s1.type = avro

# 绑定要监听的主机

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

2)启动Flume:

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

3)在新窗口中,创建一个文件,添加内容。

4)启动Flume的avro-client组件,将文件进行AVO序列化之后发送给Avro Source:

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

avro-client组件中的参数解释:

表-3 参数解释

完整写法

简写

解释

avro-client

指定启动Flume的avro-client组件

--host

-H

指定数据要发送的主机名或者IP

--port

-p

指定数据要发送的端口

--filename

-F

指定要发送的文件

Exec Source

Exec Source会运行指定的命令,然后收集这个命令的执行结果。可以利用这个Source来完成部分场景的监控,例如对方是否有返回,文件是否有新增等。

Exec Source中配置的选项有:

表-4 配置选项

选项

备注

解释

type

required

Source的类型,此处必须是command

command

required

要执行的命令

channels

required

Source需要绑定的Channel

shell

optional

指定命令的类型,最好指定这个属性

案例:监听指定的文件,如果文件中新添了数据,那么自动收集新添的数据。

1)编辑文件:

vim execsource.properties

添加如下内容:

a1.sources = s1

a1.channels = c1

a1.sinks = k1



# 配置Exec Source

# 类型必须是exec

a1.sources.s1.type = exec

# 指定命令

a1.sources.s1.command = tail -F /opt/software/flume-1.11.0/data/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

2)启动Flume:

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

3)新窗口中,向文件中追加数据:

echo 'append' >> /opt/software/flume-1.11.0/data/a.txt

echo 'exec' >> /opt/software/flume-1.11.0/data/a.txt

回到Flume界面,发现新添加的数据被Flume自动收集了。

Spooling Directory Source

Spooling Directory Source用于监听指定的目录,如果目录中有新的文件,那么会自动收集新文件中的数据。注意,被收集过的文件会自动的添加一个后缀。

Spooling Directory Source配置的选项包含:

表-5 配置选项

选项

备注

解释

type

required

Source的类型,此处必须是spooldir

spoolDir

required

要监听的目录

channels

required

Source需要绑定的Channel

fileSuffix

optional

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

案例:监听指定的目录,自动收集新文件的内容。

1)编辑文件:

vim spoolsource.properties

添加如下配置:

  • 18
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

程序员小郭同学

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值