Flume从入门到精通知识点

一、Flume概述

1.1 大数据处理流程

在企业中,大数据的处理流程一般是:

1. 数据采集
2. 数据清洗ETL
3. 数据分析
4. 数据展示(BI,数据挖掘,为AI提供数据支持)

扩展:大数据在进行数据采集的时候,数据的种类可以这样分:

1. 业务数据
2. 行为日志数据
3. 内容数据
4. 购买的第三方数据

1.2 Flume的简介

1. Flume是一个分布式的、高可用、高可靠的行为日志数据的采集框架
2. 体系架构简单,是基于数据流的模型
3. 具有故障转移和恢复机制,以及良好的扩展机制。
4. 0.9.4以前的版本称之为Flume OG   之后称之为Flume NG版本

1.3 Flume的体系结构

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lnANvfrn-1648393058451)(ClassNotes.assets/image-20211223122953919.png)]

1. source: 用来采集数据,封装成event,传输给channel
2. channel:  channel接受source的event,传输给sink
3. sink: 接收channel的event, 落地到相应的位置
4. Agent:  flume的最小运行单元,一个Agent中三个核心组件都要至少有一个。
5. event:  采集的数据的封装对象。  由消息头head(KV对)和消息体body(byte[]类型)组成
6. interceptor:  作用在source或者是sink端, 可以拦截event,进行设置等
7. selector: 作用在source端,用于将event分发到不同的channel中
8. processor:可以进行sink组设置,进行自动容灾,负载均衡

1.4 Flume采集模型

1.4.1 模型分类

1)单一数据模型

在单个 Agent 内由单个 Source, Channel, Sink 建立一个单一的数据流模型,如下图所示,整个数据流为 Web Server --> Source --> Channel --> Sink --> HDFS。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-24jtQqPZ-1648393058452)(ClassNotes.assets/DevGuide_image00.png)]

2) 多数据流模型
  • 多 Agent 串行传输数据流模型

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5hHUPJjf-1648393058452)(ClassNotes.assets/UserGuide_image03.png)]

  • 多 Agent 汇聚数据流模型

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XJwQLn5f-1648393058453)(ClassNotes.assets/UserGuide_image02.png)]

  • 单 Agent 多路数据流模型

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LpS6sDTw-1648393058454)(ClassNotes.assets/UserGuide_image01.png)]

  • Sinkgroups 数据流模型

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mIHjfWKC-1648393058454)(ClassNotes.assets/20150424221424789.jpg)]

1.4.2 设计原则

Source--> Channel
  1.单个Source组件可以和多个Channel组合建立数据流,既可以replicating 和 multiplexing。
  2.多个Sources可以写入同一个 Channel
Channel-->Sink
  1.多个Sinks又可以组合成Sinkgroups从Channel中获取数据,既可以loadbalancing和failover机制。
  2.多个Sinks可以从同一个Channel中取数据。
  3.单个Sink只能从单个Channel中取数据

1.4.3 采集方案模板

参考官网

1.4.4 三大核心组件的常用接口

1)Source

Spooling Directory Source
TailDir Source
Kafka Source
Http Source
Avro Source
Exec Source

2)channel

Memory Channel
File Channel

3)Sink

HDFS Sink
Logger Sink
Kafka Sink
Avro Sink
Hive Sink
Hbase Sink

二、Flume的安装

1)上传,解压,更名,配置环境变量,验证

[root@qianfeng01 ~]# tar -zxvf apache-flume-1.8.0-bin.tar.gz -C /usr/local/
[root@qianfeng01 ~]# cd /usr/local/
[root@qianfeng01 local]# mv apache-flume-1.8.0-bin/ flume
[root@qianfeng01 local]# vim /etc/profile
#FLUME environment
export FLUME_HOME=/usr/local/flume
export PATH=$FLUME_HOME/bin:$PATH

[root@qianfeng01 local]# vim /etc/profile
[root@qianfeng01 local]# source /etc/profile
[root@qianfeng01 local]# flume-ng version

2)配置flume的环境脚本

[root@qianfeng01 local]# cd flume/conf
[root@qianfeng01 conf]# cp flume-env.sh.template flume-env.sh
[root@qianfeng01 conf]# vim flume-env.sh
........省略..........
export JAVA_HOME=/usr/local/jdk
........省略..........

3)集群模式的说明

flume的集群模式指的就是各个节点都安装了flume而已

三、flume采集方案演示

案例1)avro+memory+logger

logger通常用于测试,数据流中的event最终显示在屏幕上

1)采集方案的配置

[root@qianfeng01 ~]# mkdir flumeconf
[root@qianfeng01 ~]# vim ./flumeconf/avro-mem-logger.properties
# 定义三大组件的名称  和关联
a1.sources = r1
a1.channels = c1
a1.sinks = k1
a1.sources.r1.channels = c1
a1.sinks.k1.channel = c1

# 定义Source的相关属性
a1.sources.r1.type = avro
# 绑定本机的ip或者是hostname
a1.sources.r1.bind = qianfeng01 
# 要监听的本机上的某一个端口号,  当程序启动时,该端口号就会被使用
a1.sources.r1.port = 10086

# 定义channel的相关属性
a1.channels.c1.type = memory
#  内存存储容量 event的最大数量
a1.channels.c1.capacity=1000
#  从内存中出来时,一次性提交的event的数量
a1.channels.c1.transactionCapacity=100

#定义Sink的相关属性
a1.sinks.k1.type=logger
a1.sinks.k1.maxBytesToLog = 16

2)启动方案

flume-ng agent -c /usr/local/flume/conf -f ./flumeconf/avro-mem-logger.properties -n a1 -Dflume.root.logger=INFO,console

3)测试:因为用的是avro的source,那么必须使用avro-client进行测试

[root@qianfeng01 ~]# mkdir flumedata
[root@qianfeng01 ~]# echo "hellworld" > flumedata/data.txt
[root@qianfeng01 ~]# flume-ng avro-client -c /usr/local/flume/conf/ -H qianfeng01 -p 10086 -F ./flumedata/data.txt
案例2)exec+memory+logger

注意使用exec源,监听的文件,要提前创建

1)采集方案的编写

[root@qianfeng01 ~]# vim ./flumeconf/exec-mem-logger.properties
# 定义三大组件的名称  和关联
a1.sources = r1
a1.channels = c1
a1.sinks = k1
a1.sources.r1.channels = c1
a1.sinks.k1.channel = c1

# 定义Source的相关属性
a1.sources.r1.type = exec
a1.sources.r1.command = tail -F ./flumedata/data.txt

# 定义channel的相关属性
a1.channels.c1.type = memory
a1.channels.c1.capacity=1000
a1.channels.c1.transactionCapacity=100

#定义Sink的相关属性
a1.sinks.k1.type=logger
a1.sinks.k1.maxBytesToLog = 16

2)启动采集方案

flume-ng agent -f ./flumeconf/exec-mem-logger.properties -n a1 -Dflume.root.logger=INFO,console

3)测试

echo "helloworld" >> ./flumedata/data.txt
案例3)exec+memory+hdfs

1)采集方案的编写

[root@qianfeng01 ~]# vim ./flumeconf/exec-mem-hdfs.conf
# 定义三大组件的名称  和关联
a1.sources = r1
a1.channels = c1
a1.sinks = k1
a1.sources.r1.channels = c1
a1.sinks.k1.channel = c1

# 定义Source的相关属性
a1.sources.r1.type = exec
a1.sources.r1.command = tail -F ./flumedata/data.txt

# 定义channel的相关属性
a1.channels.c1.type = memory
a1.channels.c1.capacity=1000
a1.channels.c1.transactionCapacity=100

#定义Sink的相关属性
a1.sinks.k1.type=hdfs
a1.sinks.k1.hdfs.path = /flume/%Y-%m-%d/%H-%M
a1.sinks.k1.hdfs.filePrefix = wcm
a1.sinks.k1.hdfs.fileSuffix = .wsy
# 下面三个条件满足其一,就会产生新文件
# 新文件产生的时间周期,单位是秒,   如果设置为0表示不会产生新文件。
a1.sinks.k1.hdfs.rollInterval = 60    
# 当前文件达到1000字节,就会产生新文件
a1.sinks.k1.hdfs.rollSize = 1000
# 当前文件的event数量达到10条,就会产生新文件
a1.sinks.k1.hdfs.rollCount = 10
# 如果writeFormat指定了Text,那么fileType必须是DataStream
a1.sinks.k1.hdfs.writeFormat = Text
a1.sinks.k1.hdfs.fileType = DataStream

# round的作用,用于指定是否滚动文件夹  false 表示不滚动文件夹
a1.sinks.k1.hdfs.round = true      
# 设置文件夹滚动的时间单位
a1.sinks.k1.hdfs.roundUnit = minute
# 设置文件夹固定的时间数字大小
a1.sinks.k1.hdfs.roundValue = 2
#  如果目录上设置了时间格式字符串,比如%Y等,那么下面的属性应该设置为true,除非event的head里有一个叫timestamp的消息头
a1.sinks.k1.hdfs.useLocalTimeStamp = true

2)启动方案

flume-ng agent -f ./flumeconf/exec-mem-hdfs.conf -n a1 -Dflume.root.logger=INFO,console

3)测试

[root@qianfeng01 ~]# echo "chenyun " >> flumedata/data.txt
[root@qianfeng01 ~]# echo "chenyun " >> flumedata/data.txt
[root@qianfeng01 ~]# echo "chenyun " >> flumedata/data.txt
[root@qianfeng01 ~]# echo "chenyun " >> flumedata/data.txt
[root@qianfeng01 ~]# echo "chenyun " >> flumedata/data.txt
[root@qianfeng01 ~]# echo "chenyun " >> flumedata/data.txt
[root@qianfeng01 ~]# echo "chenyun " >> flumedata/data.txt
[root@qianfeng01 ~]# echo "chenyun " >> flumedata/data.txt
[root@qianfeng01 ~]# echo "chenyun " >> flumedata/data.txt
[root@qianfeng01 ~]# echo "chenyun " >> flumedata/data.txt
[root@qianfeng01 ~]# echo "chenyun " >> flumedata/data.txt
[root@qianfeng01 ~]# echo "chenyun " >> flumedata/data.txt
[root@qianfeng01 ~]# echo "chenyun " >> flumedata/data.txt
案例4)spool+memory+logger
spool源,是用来监听目录下的新文件的,并通过更名的方式来决定该文件已经采集完。注意,监听的目录必须提前存在。是一个可靠源

exec源不可靠

1)采集方案的编写

[root@qianfeng01 ~]# vim flumeconf/spool-mem-logger.properties
# 列出每个组件的名称
a1.sources=r1
a1.channels=c1
a1.sinks=s1
a1.sources.r1.channels=c1
a1.sinks.s1.channel=c1

#设置source组件的属性
a1.sources.r1.type=spooldir
#要监听的目录必须提前创建
a1.sources.r1.spoolDir=/root/data/subdir
a1.sources.r1.fileSuffix=.gyy
a1.sources.r1.deletePolicy=never
a1.sources.r1.fileHeader=false
a1.sources.r1.fileHeaderKey=file
a1.sources.r1.basenameHeader=false
a1.sources.r1.basenameHeaderKey=basename
a1.sources.r1.batchSize=100
a1.sources.r1.inputCharset=UTF-8
a1.sources.r1.bufferMaxLines=1000

#设置channel组件的属性
a1.channels.c1.type=memory
a1.channels.c1.capacity=1000
a1.channels.c1.transactionCapacity=100

#设置sink组件的属性
a1.sinks.s1.type=logger
a1.sinks.s1.maxBytesToLog=16

2)启动方案

flume-ng agent -f ./flumeconf/spool-mem-logger.properties -n a1 -Dflume.root.logger=INFO,console

3)测试

[root@qianfeng01 ~]# echo "helloworld" >>data/subdir/a.txt
[root@qianfeng01 ~]# cd data/subdir/
[root@qianfeng01 subdir]# ll
总用量 4
-rw-r--r-- 1 root root 11 1223 16:25 a.txt.gyy
[root@qianfeng01 subdir]# echo "helloworld" >>b.txt
[root@qianfeng01 subdir]

你可能感兴趣的:(大数据那些事,大数据分析,大数据开发,flume)