手记

flume 入门系列

前言

本文是基础性文章,针对初次接触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. 解压,得到如下目录


    解压目录

  4. 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
  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 架构

  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 取名叫 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 是以 · 来实现递进关系

  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 进行实践一下



作者:code_solve
链接:https://www.jianshu.com/p/7b73c5b80946


1人推荐
随时随地看视频
慕课网APP

热门评论

第一眼看成了flutter

查看全部评论