前言

本文是基础性文章,针对初次接触flume的朋友,简化了大部分内容,后续有时间会加上相关高级使用

为什么需要flume?

  1. 解耦:对于数据产生者,不关心数据被谁使用,对于数据使用者,不关心数据从哪来。
  2. 安全,稳定:flume 是提供数据安全保证的。
  3. 缓冲:数据生产速度 和 消费速度 可以得到一个平衡,不至于因为生产过快导致程序崩溃。
  4. 简单:内置大量现成组件,使用成本低。
  5. 负载均衡:flume 是分布式,对于大数据收集有天然优势
  6. 对 hdfs 支持友好
  7. 灵活:flume 收集基于单个 agent,扩展方便灵活

flume 有什么优势?

优势都是相对而言,我们简单以 kafka 来对比:

  1. 组件灵活,可定制化高
  2. 数据处理能力相对较强
  3. 对hdfs 有特殊优化

开启一个简单的flume

这里我们先什么都不管,先来玩一下flume,感受一下flume:

这里我们用 flume 1.8.0 来演示,官网地址:http://flume.apache.org/FlumeUserGuide.html

  1. 首先你得安装一下java环境,我这里安装 1.8 版本
  2. 下载 flume :http://flume.apache.org/download.html
  3. 解压,得到如下目录


    flume 入门
    解压目录
  4. 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
  1. flume根目录执行 bin/flume-ng agent --conf conf --conf-file example.conf --name a1 -Dflume.root.logger=INFO,console
  2. 到这里如果一切正常得话,那么flume就已经正式开始运行了。
  3. 为了验证一下效果,我们可以通过任何方式向 localhost:4444 发送数据,flume将会将你发送得数据打印在控制台,这里我们可以简单的使用 telnet localhost 44444 来进行测试
  4. 如果你是新手,到这里可能一头雾水,这都是什么和什么呢?别急,下面我们再来细细分析这个应用程序是怎么跑起来得。

到这里,我们应该可以体验到flume得简洁和易用了,就算你什么都不会,你也可以轻松得来使用它。

flume一般架构

  • 首先我们先来看一下 flume 的整体架构,官网架构图如下


    flume 入门
    flume 架构
  1. webServer作为一个客户端,会产生数据,将数据发送到 一个叫 source 的组件。
  2. source 将收到的数据存到一个叫 channel 的组件。
  3. sink 会从channel里面取出source 储存的数据,并将它放到 hdfs 上。
  4. 其中 source,channel,sink 的组合叫 agent。
  5. 基础架构非常简单,想要使用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 是以 · 来实现递进关系

  1. 启动脚本
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 进行实践一下

相关文章: