前言: 本文是flume学习系列的开篇,主要介绍了flume的各种组件及相关配置。但是本篇文章并不打算从环境搭建开始,因为比较简单而且网上资料也很详尽:
![5679451-79430b44f607d87c.jpg](https://i-blog.csdnimg.cn/blog_migrate/4958e70e1dd8eba52b2e1759046d85e3.jpeg)
So,研读了一下官方文档,特此把Flume的一些重要知识点总结一下。能力有限,如有错误,提前感谢各位大佬提出。
我还是前言:我不是人造革,是真皮。开车之前我们起码要知道Flume是个什么鬼吧?Flume是一个高可用的,高可靠的,分布式的海量日志采集、聚合和传输的系统,Flume支持在日志系统中定制各类数据发送方,用于收集数据;同时,Flume提供对数据进行简单处理,并写到各种数据接受方(可定制)的能力。好,开始飙车。
一、Architecture
首先,介绍一下。。。wait,wait,
![5679451-8118c4ee62a0ecbc.jpg](https://i-blog.csdnimg.cn/blog_migrate/fae28a5ad5ebf49a5099d2db0d672e08.jpeg)
![5679451-90dc831176cc2aad.png](https://i-blog.csdnimg.cn/blog_migrate/3c3297b420b4b4cb671354bb5812565c.png)
分析一下这个图,箭头的指向代表数据的流向。数据从Web 服务器 --> Source --> Channel-->Sink-->HDFS。我们需要关注的是中间被矩形框起来的部分(Agent),它就是Flume的核心。从名字上我们就能直观的想到,Source(源)是用来收集数据的,Channel(管道)是用来传输数据的,Sink(沉槽)是用来存储数据的。
很简单,Flume以Agent为最小的独立运行单位。一个Agent就是一个JVM进程。单Agent由Source、Sink和Channel三大组件构成。上面这种单Agent结构已经可以完成很多任务了,但是,实际中有各种花式需求。
![5679451-d127a766f3ee44f3.jpg](https://i-blog.csdnimg.cn/blog_migrate/f938928754265cc71960350b83bba7b1.jpeg)
比如:一个电商公司,每天产生很多的交易记录,这些记录需要被存储,同时公司也可能会对这些记录进行分析,给用户实时推荐,那就需要把这些产生的数据流向不同的目的地。这要怎么办呢?
![5679451-9a35759a452b7148.jpg](https://i-blog.csdnimg.cn/blog_migrate/bb41e837140576bcf1d3885b8b4764b2.jpeg)
不慌,大牛早就想到这些情况了,Flume中有multi-hop(多跳)、Consolidation(合并)、Multiplexing the flow(多路数据流)来解决各种花式问题。
我认为,multi-hop(多跳)一般用来做缓冲,防止源产生数据太快处理不过来,
![5679451-3d3d548ab5fd3ba1.png](https://i-blog.csdnimg.cn/blog_migrate/28d8c8d3c32e4c7fea0706347703c248.png)
Consolidation(合并)用来把多个源合并到一个目的地。
![5679451-6d069b0f1a99b221.png](https://i-blog.csdnimg.cn/blog_migrate/e227c7d07f857bab1b622d72daaa90ec.png)
Multiplexing the flow(多路数据流)用来把单个源分发给多个目的地。
![5679451-ddaf791846f53a6f.png](https://i-blog.csdnimg.cn/blog_migrate/b01d066f7c92ac1272545b0c39959f7e.png)
二、Configuration
这部分就是如何去使用flume了,flume的配置文件在安装目录下的conf/flume.conf。注意:安装完flume后,这个文件是.template后缀的。我们需要把它拷贝一份。下面我们通过一个小案例简单介绍一下flume的配置。netcat通过localhost的44444端口给source发消息,最终以日志的形式打印出来。
# Name the components on this agent
# a1是agent名,r1,k1,c1是a1的三个组件
a1.sources = r1
a1.sinks = k1
a1.channels = c1
# Describe/configure the source
#设置source的一些属性,这些属性的key可以从User Guide中查到,value是flume已经为我们写好的一些常用source。
#后面我们可以自定义source
a1.sources.r1.type = netcat
a1.sources.r1.bind = localhost
a1.sources.r1.port = 44444
# Describe the sink
#设置sink的一些属性
a1.sinks.k1.type = logger
# Use a channel which buffers events in memory
#设置channel的一些属性
a1.channels.c1.type = memory
a1.channels.c1.capacity = 1000
a1.channels.c1.transactionCapacity = 100
# Bind the source and sink to the channel
#把source和sink通过channel链接起来
a1.sources.r1.channels = c1
a1.sinks.k1.channel = c1
这就完成了一个最基本的flume配置。然后就是启动flume。$ bin/flume-ng agent --conf ../conf --conf-file ../conf/flume.conf --name a1 -Dflume.root.logger=DEBUG,console
这里有几个参数,--conf后面跟配置文件目录,--conf-file后面跟配置文件, --name后面跟要启动的Agent。 -D后面跟一些其他的启动参数,比如日志相关的。
三、Source,Channel,Sink
下面这个表格是Flume为我们提供的现成的Source,Channel,Sink。已经可以满足很多需求了,如果我们想根据自己的业务需求去定制,可以模仿这些现成的类去写,准备后面的文章去动手实现一下。
![5679451-a0f04808acfab335.png](https://i-blog.csdnimg.cn/blog_migrate/f47ce41af49815cd40859db052d1e99a.png)
More important,官方文档十分详细:准备好起飞了么?
![5679451-2808c801a42930c6.jpg](https://i-blog.csdnimg.cn/blog_migrate/5eaa6d26bc53dfb5f746552d541b3e0f.jpeg)
官网中的User Guide对这些组件的各种配置描述的十分详细,炒鸡友好。举个栗子:比较常用的HTTP Source,(通过HTTP get或post请求接收事件)文档中是这样的:
![5679451-e9ec92a9fa64eb96.png](https://i-blog.csdnimg.cn/blog_migrate/6d8e13ade65d0ddc3eac3ecec7c7076a.png)
![5679451-51028e12b77b1d21.gif](https://i-blog.csdnimg.cn/blog_migrate/ac384acc50c1161ac8ee7897f2c51713.gif)
相应的 Channel、Sink也都一样。如果需要查询如何配置,直接去官网看。
四、总结
我觉得理解和使用flume并不难,但是要实现一些自定义的功能,就需要研读一下flume的源码,然后进行模仿。还有就是没有一整套的处理流程去学习(从收集数据到传递到沉槽)。所以后面决定写一些Demo,以便于更好的掌握flume。