Flume学习---(part-2)

一. Flume事务

请添加图片描述

注:Channel --> Sink过程是Sink主动Channel拉取数据的!
Put事务流程:
(1)doPut: 把批数据写入临时缓冲区putList
(2)doCommit: 检查channel内存队列是否足够合并
(3)doRollback: channel内存队列空间不足,则回滚数据到缓冲区

Take事务流程:
(1)doTake: 把数据拉取到临时缓冲区takeList,并把数据发送HDFS
(2)doCommit: 如果数据全部发送成功,则清除临时缓冲区takeList
(3)doRollback: 数据发送过程中若出现异常,rollback将临时缓冲区takeList中的数据还给channel队列

二. Flume Agent内部原理

请添加图片描述

注:一个Sink只能拉取一个Channel中的数据,而一个Channel却可以被多个Sink同时拉取!

重要组件:

1)ChannelSelector

ChannelSelector 的作用就是选出 Event 将要被发往哪个 Channel。其共有两种类型,
分别是 Replicating(复制)Multiplexing(多路复用)

ReplicatingSelector 会将同一个 Event 发往所有的 Channel,Multiplexing 会根据相 应的原则,将不同的 Event 发往不同的 Channel

2)SinkProcessor

SinkProcessor共有三种类型,分 别 是 DefaultSinkProcessorLoadBalancingSinkProcessor和FailoverSinkProcessor

DefaultSinkProcessor 对 应 的 是 单 个 的 Sink(一个Channel只绑定一个Sink) , LoadBalancingSinkProcessor和FailoverSinkProcessor 对应的是 Sink Group,LoadBalancingSinkProcessor 可以实现负载均衡的功能,FailoverSinkProcessor 可以错误恢复的功能。

三. Flume拓扑结构

3.1 简单串联

请添加图片描述

这种模式是将多个 flume 顺序连接起来了,从最初的 source 开始到最终 sink 传送的
目的存储系统。此模式不建议桥接过多的 flume 数量, flume 数量过多不仅会影响传输速率,而且一旦传输过程中某个节点 flume 宕机,会影响整个传输系统

3.2 复制和多路复用

请添加图片描述

Flume 支持将事件流向一个或者多个目的地。这种模式可以将相同数据复制多个 channel 中,或者将不同数据分发到不同的 channel 中,sink 可以选择传送到不同的目的地

3.3 负载均衡和故障转移

请添加图片描述

Flume支持使用将多个sink逻辑上分到一个sink组,sink组配合不同的SinkProcessor 可以实现负载均衡和错误恢复的功能。

3.4 聚合

请添加图片描述

这种模式是我们最常见的,也非常实用,日常 web 应用通常分布在上百个服务器,大者甚至上千个、上万个服务器。产生的日志,处理起来也非常麻烦。用 flume 的这种组合方式能很好的解决这一问题,每台服务器部署一个 flume 采集日志,传送到一个集中收集日志的flume,再由此 flume 上传到 hdfs、hive、hbase 等,进行日志分析。

四. Flume企业开发案例

4.1 复制和多路复用

1)案例需求

使用 Flume-1 监控文件变动,Flume-1 将变动内容传递给 Flume-2,Flume-2 负责存储到 HDFS。同时 Flume-1 将变动内容传递给 Flume-3,Flume-3 负责输出到 Local
FileSystem。

2)需求分析:

请添加图片描述

3)实现步骤:

(1)准备工作

/opt/module/flume/job 目录下创建 group1 文件夹

请添加图片描述

/opt/module/data/目录下创建 flume3 文件夹

请添加图片描述

(2)创建 flume-file-flume.conf

配置 1 个接收日志文件source两个 channel两个 sink,分别输送给 flume-flume-hdfs flume-flume-dir

编辑配置文件

请添加图片描述

# Name the components on this agent
a1.sources = r1
a1.sinks = k1 k2
a1.channels = c1 c2

# 将数据流复制给所有 channel
a1.sources.r1.selector.type = replicating

# Describe/configure the source
a1.sources.r1.type = exec
a1.sources.r1.command = tail -F /tmp/root/hive.log
a1.sources.r1.shell = /bin/bash -c

# Describe the sink
# sink 端的 avro 是一个数据发送者
a1.sinks.k1.type = avro
a1.sinks.k1.hostname = hadoop102
a1.sinks.k1.port = 4141
a1.sinks.k2.type = avro
a1.sinks.k2.hostname = hadoop102
a1.sinks.k2.port = 4142

# Describe the channel
a1.channels.c1.type = memory
a1.channels.c1.capacity = 1000
a1.channels.c1.transactionCapacity = 100
a1.channels.c2.type = memory
a1.channels.c2.capacity = 1000
a1.channels.c2.transactionCapacity = 100

# Bind the source and sink to the channel
a1.sources.r1.channels = c1 c2
a1.sinks.k1.channel = c1
a1.sinks.k2.channel = c2

(3)创建 flume-flume-hdfs.conf

配置上级 Flume 输出的 Source输出HDFSSink

编辑配置文件

请添加图片描述

# Name the components on this agent
a2.sources = r1
a2.sinks = k1
a2.channels = c1

# Describe/configure the source
# source 端的 avro 是一个数据接收服务
a2.sources.r1.type = avro
a2.sources.r1.bind = hadoop102
a2.sources.r1.port = 4141

# Describe the sink
a2.sinks.k1.type = hdfs
a2.sinks.k1.hdfs.path = hdfs://hadoop102:8020/flume2/%Y%m%d/%H

#上传文件的前缀
a2.sinks.k1.hdfs.filePrefix = flume2-

#是否按照时间滚动文件夹
a2.sinks.k1.hdfs.round = true

#多少时间单位创建一个新的文件夹
a2.sinks.k1.hdfs.roundValue = 1

#重新定义时间单位
a2.sinks.k1.hdfs.roundUnit = hour

#是否使用本地时间戳
a2.sinks.k1.hdfs.useLocalTimeStamp = true

#积攒多少个 Event 才 flush 到 HDFS 一次
a2.sinks.k1.hdfs.batchSize = 100

#设置文件类型,可支持压缩
a2.sinks.k1.hdfs.fileType = DataStream

#多久生成一个新的文件
a2.sinks.k1.hdfs.rollInterval = 30

#设置每个文件的滚动大小大概是 128M
a2.sinks.k1.hdfs.rollSize = 134217700

#文件的滚动与 Event 数量无关
a2.sinks.k1.hdfs.rollCount = 0

# Describe the channel
a2.channels.c1.type = memory
a2.channels.c1.capacity = 1000
a2.channels.c1.transactionCapacity = 100

# Bind the source and sink to the channel
a2.sources.r1.channels = c1
a2.sinks.k1.channel = c1

(4)创建 flume-flume-dir.conf

配置上级 Flume 输出的 Source输出本地目录 Sink

编辑配置文件

请添加图片描述

# Name the components on this agent
a3.sources = r1
a3.sinks = k1
a3.channels = c2

# Describe/configure the source
a3.sources.r1.type = avro
a3.sources.r1.bind = hadoop102
a3.sources.r1.port = 4142

# Describe the sink
a3.sinks.k1.type = file_roll
a3.sinks.k1.sink.directory = /opt/module/data/flume3

# Describe the channel
a3.channels.c2.type = memory
a3.channels.c2.capacity = 1000
a3.channels.c2.transactionCapacity = 100

# Bind the source and sink to the channel
a3.sources.r1.channels = c2
a3.sinks.k1.channel = c2

注:此处输出的本地目录必须是已经存在的目录,如果该目录不存在,并不会创建新的目录。

(5)执行配置文件

分别启动对应的 flume 进程:flume-flume-dirflume-flume-hdfsflume-file-flume

正常情况下,我们需要先开启服务端后,在开启客户端,方可正常运行。此处我们先尝试错误的做法,即先开启客户端进程(flume-file-flume),并同时监控运行状态:

首先在开启一台连接hadoop102并通过tail -F命令实时监控Flume日志的变动,之后同样再开一台连接hadoop102并在/opt/module/flume目录下执行:

bin/flume-ng agent --conf conf/ --name a1 --conf-file job/group1/flume-file-flume.conf

随后查看Flume日志变化,发现不断的出现拒绝连接的异常,再次验证了服务端必须先开启的原则。

在这里插入图片描述

下面我们进行正常的操作,那么就需要先运行服务端flume-flume-dirflume-flume-hdfs进程,之后再运行客户端flume-file-flume进程,然后启动Hive:

在这里插入图片描述

注: Hive是基于Hadoop的,所以在运行任何进程前必须先打开Hadoop集群,否则报错!

(6)检查 HDFS 上数据

请添加图片描述

(7)检查/opt/module/datas/flume3 目录中数据

请添加图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

丷江南南

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

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

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

打赏作者

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

抵扣说明:

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

余额充值