Flume
简介
概述
-
Flume本身是由Cloudera公司开发的后来贡献给了Apache的一套针对日志数据进行收集(collecting)、汇聚(aggregating)和传输(moving)的机制
-
Flume本身提供了简单且灵活的结构来完成日志数据的传输
-
Flume有两大版本:
- Flume0.X:又称之为
Flume-og
,依赖于Zookeeper部署,需要提供的格式文件相对复杂,所以现在市面上已经不使用了 - Flume1.X:又称之为
Flume-ng
,不依赖于Zookeeper部署,需要提供的格式文件结构明确且简单,所以是现在流通的版本
- Flume0.X:又称之为
基本概念
-
Event
-
Flume会将收集到的每一条日志封装成一个Event
-
Event本质上就是一个json串,即Flume会将收集到的日志封装成json的形式,Event中固定的包含两部分:headers和body
{"headers":{},"body":""}
-
-
Agent:Flume流动模型的基本组成结构,至少包含3部分
- Source:从数据源采集数据 - collecting
- Channel:临时存储数据 - aggregating
- Sink:将数据写出到目的地 - moving
流动模型
-
单级流动
-
多级流动:又称之为串联流动
-
扇入流动:又称之为并联流动、聚集流动
-
扇出流动:又称之为复用流动
-
复杂流动:按照需求将多个流动进行组合,那么就是复杂流动
安装和入门案例
安装
-
Flume本身是由Java开发的,所以需要服务器上安装好JDK1.8及以上版本
-
进入软件预安装目录,下载Flume的安装包
# 进入预安装目录 cd /opt/presoftware/ # 下载或者上传Flume
-
解压
tar -xvf apache-flume-1.11.0-bin.tar.gz -C /opt/software/
-
重命名
cd /opt/software/ mv apache-flume-1.11.0-bin/ flume-1.11.0
-
配置环境变量
# 编辑文件 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
-
如果是官网下载的Flume安装包,那么需要注意连接池的jar包和Hadoop jar包是否冲突
# 查看Flume的连接池jar包 ls /opt/software/flume-1.11.0/lib/guava* # 如果guava的版本是11.0.2版本,和Hadoop的guava版本不一样 rm -rf /opt/software/flume-1.11.0/lib/guava-11.0.2.jar # 复制Hadoop的jar过来 cp /opt/software/hadoop-3.2.4/share/hadoop/common/lib/guava-27.0-jre.jar /opt/software/flume-1.11.0/lib/
控制台打印
-
需要注意的是,从Flume1.10.0版本开始,Flume将log4j 1.x替换为了log4j 2.x,因此导致输出数据的时候,默认是将数据写到
flume.log
文件中,但是学习过程中,希望数据能够直观展现(打印到控制台上),所以需要修改配置 -
编辑文件
vim /opt/software/flume-1.11.0/conf/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>
入门案例
-
在Flume中,所有的流动模型,不是通过代码来指定,而是通过格式文件来配置,所以实际过程中,往往会要求格式文件存放在统一的位置上。上课过程中,统一要求将格式文件放到
/opt/software/flume-1.11.0/data
下cd /opt/software/flume-1.11.0/ mkdir data cd data
-
编辑格式文件,文件名和后缀名可以自己定义
vim basic.propertie
在文件中添加
# 给Agent起名 # 给Source起名 # 如果有多个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 a1.channels.c1.capacity = 1000 a1.channels.c1.transactionCapacity = 1000# 配置Sink a1.sinks.k1.type = logger# 将Source和Channel绑定 a1.sources.s1.channels = c1 # 将Sink和Channel绑定 a1.sinks.k1.channel = c1
-
执行
flume-ng agent --name a1 --conf $FLUME_HOME/conf --conf-file basic.properties -Dflume.root.logger=INFO,console
-
复制窗口之后,发送TCP请求
nc hadoop01 8090
参数解释
参数 | 解释 |
---|---|
--name 或者-n | 指定要运行的agent的名字 |
--conf 或者-c | Flume的原生配置 |
--conf-file 或者-f | 执行的文件 |
-D | 指定运行其他的参数 |
flume.root.logger | 指定日志的打印级别,级别分为INFO ,WARN 和ERROR ,可以指定打印位置console 和logfile |
Source
Exec Source
-
Exec Source运行指定命令,监听命令结果,将命令结果作为日志进行收集
-
案例:监听指定文件,如果文件中新添了数据,那么自动收集这个文件中的数据
-
构建空文件
touch /opt/software/flume-1.11.0/data/a.txt
-
监听这个文件,如果这个文件中新添了数据,自动收集数据作为日志
vim execsource.properties
在文件中添加
a1.sources = s1 a1.channels = c1 a1.sinks = k1# 配置Exec Source # Source的类型 a1.sources.s1.type = exec # 监听指定的命令 a1.sources.s1.command = tail -F /opt/software/flume-1.11.0/data/a.txt # 指定命令的脚本类型 a1.sources.s1.shell = /bin/sh -ca1.channels.c1.type = memorya1.sinks.k1.type = loggera1.sources.s1.channels = c1 a1.sinks.k1.channel = c1
-
执行命令
flume-ng agent -n a1 -c $FLUME_HOME/conf -f execsource.properties -Dflume.root.logger=INFO,console
-
在新窗口中追加数据
echo "testing" >> /opt/software/flume-1.11.0/data/a.txt echo "exec" >> /opt/software/flume-1.11.0/data/a.txt
-
rces.s1.channels = c1
a1.sinks.k1.channel = c1
```
-
执行命令
flume-ng agent -n a1 -c $FLUME_HOME/conf -f execsource.properties -Dflume.root.logger=INFO,console
-
在新窗口中追加数据
echo "testing" >> /opt/software/flume-1.11.0/data/a.txt echo "exec" >> /opt/software/flume-1.11.0/data/a.txt