前言
本文是基础性文章,针对初次接触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 agenta1.sources = r1 a1.sinks = k1 a1.channels = c1# Describe/configure the sourcea1.sources.r1.type = netcat a1.sources.r1.bind = localhost a1.sources.r1.port = 44444# Describe the sinka1.sinks.k1.type = logger# Use a channel which buffers events in memorya1.channels.c1.type = memory a1.channels.c1.capacity = 1000 a1.channels.c1.transactionCapacity = 100# Bind the source and sink to the channela1.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 取名叫 r1a1.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 是c1a1.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 进行实践一下
作者:code_solve
链接:https://www.jianshu.com/p/7b73c5b80946
共同学习,写下你的评论
评论加载中...
作者其他优质文章