flume 入门系列
2018-09-29 本文已影响3人
code_solve
前言
本文是基础性文章,针对初次接触flume的朋友,简化了大部分内容,后续有时间会加上相关高级使用
为什么需要flume?
- 解耦:对于数据产生者,不关心数据被谁使用,对于数据使用者,不关心数据从哪来。
- 安全,稳定:flume 是提供数据安全保证的。
- 缓冲:数据生产速度 和 消费速度 可以得到一个平衡,不至于因为生产过快导致程序崩溃。
- 简单:内置大量现成组件,使用成本低。
- 负载均衡:flume 是分布式,对于大数据收集有天然优势
- 对 hdfs 支持友好
- 灵活:flume 收集基于单个 agent,扩展方便灵活
flume 有什么优势?
优势都是相对而言,我们简单以 kafka 来对比:
- 组件灵活,可定制化高
- 数据处理能力相对较强
- 对hdfs 有特殊优化
开启一个简单的flume
这里我们先什么都不管,先来玩一下flume,感受一下flume:
这里我们用 flume 1.8.0 来演示,官网地址:http://flume.apache.org/FlumeUserGuide.html
- 首先你得安装一下java环境,我这里安装 1.8 版本
- 下载 flume :http://flume.apache.org/download.html
-
解压,得到如下目录
解压目录 - flume根目录 vim example.conf ,并输入一下内容:
# example.conf: A single-node Flume configuration
# Name the components on this agent
a1.sources = r1
a1.sinks = k1
a1.channels = c1
# Describe/configure the source
a1.sources.r1.type = netcat
a1.sources.r1.bind = localhost
a1.sources.r1.port = 44444
# Describe the sink
a1.sinks.k1.type = logger
# Use a channel which buffers events in memory
a1.channels.c1.type = memory
a1.channels.c1.capacity = 1000
a1.channels.c1.transactionCapacity = 100
# Bind the source and sink to the channel
a1.sources.r1.channels = c1
a1.sinks.k1.channel = c1
- flume根目录执行 bin/flume-ng agent --conf conf --conf-file example.conf --name a1 -Dflume.root.logger=INFO,console
- 到这里如果一切正常得话,那么flume就已经正式开始运行了。
- 为了验证一下效果,我们可以通过任何方式向 localhost:4444 发送数据,flume将会将你发送得数据打印在控制台,这里我们可以简单的使用
telnet localhost 44444
来进行测试 - 如果你是新手,到这里可能一头雾水,这都是什么和什么呢?别急,下面我们再来细细分析这个应用程序是怎么跑起来得。
到这里,我们应该可以体验到flume得简洁和易用了,就算你什么都不会,你也可以轻松得来使用它。
flume一般架构
-
首先我们先来看一下 flume 的整体架构,官网架构图如下
flume 架构
- webServer作为一个客户端,会产生数据,将数据发送到 一个叫 source 的组件。
- source 将收到的数据存到一个叫 channel 的组件。
- sink 会从channel里面取出source 储存的数据,并将它放到 hdfs 上。
- 其中 source,channel,sink 的组合叫 agent。
- 基础架构非常简单,想要使用flume,我们只要通过一个配置文件定义好 source,channel,sink,那么flume就可以开始工作了。
- 从上面的架构我们知道,只要配置好 flume 三大组件: source,channel,sink 就可以使用了,那么现在我们来解析下 上面
example.conf
文件把
1.配置文件解析
# a1:这是我们agent的别名,随便取
a1.sources = r1 #给 a1 的source 取名叫 r1
a1.sinks = k1 #给 a1 的sink 取名叫k1
a1.channels = c1 #给 a1 的channel 取名叫 c1
# 配置source
# “a1.sources.r1” 表示 “a1 里面的 soource r1”
# “a1.sources.r1.type“ 配置了 “a1.sources.r1” 的类型
# “a1.sources.r1.bind“ = localhost 配置了 “a1.sources.r1” 绑定的ip地址
# “a1.sources.r1.port“ 配置了 “a1.sources.r1” 绑定的端口号
a1.sources.r1.type = netcat
a1.sources.r1.bind = localhost
a1.sources.r1.port = 44444
# 配置 sink
# “a1.sinks.k1.” 表示 “a1 里面的 sink k1”
# “a1.sinks.k1.type“ 配置了 “a1.sinks.k1” 类型是 logger(将收集的数据当日志打印)
a1.sinks.k1.type = logger
# 配置 channels
# “a1.channels.c1” 表示 “a1 里面的 channel c1”
a1.channels.c1.type = memory
a1.channels.c1.capacity = 1000
a1.channels.c1.transactionCapacity = 100
# 配置完三大组件之后
# 我们需要配置一下他们的关系
a1.sources.r1.channels = c1 # r1 的输出 channel 是c1
a1.sinks.k1.channel = c1 # k1 取数据的 channel 是 c1
看上去复杂的配置,其实很简单:
(1)声明相关组件
(2)配置组件的详细信息
(3)描述组件之间的关联关系
配置文件是以 kv 形式来声明的,并且 k 是以·
来实现递进关系
- 启动脚本
bin/flume-ng agent --conf conf --conf-file example.conf --name a1 -Dflume.root.logger=INFO,console
--conf conf
声明一个配置文件的目录,是当前目录下的 conf 文件夹
--conf-file example.conf
指定启动的该 agent 的配置文件是当前目录下的 example.conf
--name a1
指定该 agent 的别名是 a1
-Dflume.root.logger=INFO,console
-D表示配置一个kv格式的参数,
flume.root.logger是flume日志打印的方式和级别,
INFO,console表示 级别是 info ,打印位置是 控制台 console,
因为我们的收集过来的数据是当日志打印的,所以会在控制台打印出来咯
flume 的基本使用基本都是这样,配置三大组件就可以了,针对不一样的日志产生渠道和储存方式,可以选择不同的 source 和 sink ,并且官方有大量不同类型的 source 和 sink 可以供我们选择和参考,这也就使得flume的入门和使用成本非常低廉,如果你感兴趣,可以尝试下官方不同的source 和 sink 进行实践一下