一. Flume是什么?

Flume是一个分布式,可靠的系统。它能够高效的收集,整合数据,还可以将来自不同源的大量数据移动到数据中心存储。

Flume是Apache下的一个顶级项目。Flume不仅可以收集整合日志数据,因为数据源是可以自定义的,Flume能够用于传输大量日志数据,这些数据包含到不仅限于网络传输数据、社交媒体生成的数据、邮件信息等等。

当前的版本有0.9.x和1.x。新版本具有更加灵活的配置和性能上的改进,推荐使用1.x版本。本文介绍使用的是1.8版本。

二.Flume的数据流模型

简单的讲,Flume Agent(一个JVM进程)将外部产生的事件发送给下一个目标也称成下一跳。

1.相关术语

  • Flume event:它是实际就是数据。是Flume中数据最小传输单位,数据里面除了有效数据,还有一些可选的属性设置。
  • Flume Source:会将收到的event放在一个或多个channel中
  • Flume Channe:保存event知道event被一个Flume sink消费
  • Flume Sink:会将channel中的event放入到一个外部源中,或者将其发送给下一个Flume agent的Flume source中。 __注意 : __ Flume source和sink与channel的交互式异步的。

2.Flume数据流向过程

如上图,外部事件源Web Server 将组织成具体格式的数据发送给Flume source。Flume source有多种,以Avro Flume Source为例,Avro Flume Source会收到来自Avro client或者Flume agent发来的数据(是由Flume sink从Channel中获取的数据)。Flume Source将数据放入Channel中。Flume Sink可将event发送给HDFS,不过此处的Sink要使用HDFS Sink。 注意: Source、Channel、Sink都有不同的实现,对应着不同的功能。

三. 安装Flume

1. 下载安装包

~]# wget http://archive.apache.org/dist/flume/stable/apache-flume-1.8.0-bin.tar.gz ~]# tar xf apache-flume-1.8.0-bin.tar.gz -C /opt ~]# cd /opt ~]# ln -sv apache-flume-1.8.0-bin.tar.gz apache-flume

2. 安装jdk

因为flume java程序,所以依赖jdk jdk的版本要求为1.8.0+ ~]# yum install -y java-1.8.0-openjdk

3. 配置文件

修改配置文件conf/flume-conf.properties.template

(1)单个组件配置

~]# vim conf/flume-conf.properties.template


#对这个flume agent取一个名字,称之为agent01。这个名字可以任意取
agent01.sources = r1     # 在flume agent中source的名字为r1。这个名字可以任意取
agent01.sinks = k1         # 在flume sinks中sinks的名字为k1。这个名字可以任意取
agent01.channels = c1   # 在flume agent中channels的名字为c1。这个名字可以任意取

#设置flume source参数
agent01.sources.r1.type = netcat           #agent01这个flume agent中源r1的类型为netcat,监听在指定的ip+port以接受数据
agent01.sources.r1.bind = localhost       #指明绑定的端口
agent01.sources.r1.port = 44444           #指明监听的端口

#设置flume sink
agent01.sinks.k1.type = logger    #会记录info级别的信息,主要用于调试

#配置flume channel
agent01.channels.c1.type = memory   #使用memory类型的channel,他会将event保存在内存中
agent01.channels.c1.capacity = 1000
a1.channels.c1.transactionCapacity = 100

#指定source和sink绑定的channel
agent01.sources.r1.channels = c1   #r1会将event发给c1 channel
agent01.sinks.k1.channel = c1         #k1会从c1中消费event

(2)多flow agent配置

一个flume agent可以配置多个flow,我们可以有多个sources,channel,sink。这些组件的组合可以形成多个数据流(data flow)。

使用场景:可以同时配置多个flow,这两个流相互干扰。以下面为例, 一条流为 : avro-AppSrv-source1-->mem-channel-1--> mem-channel-1 另一条为 : exec-tail-source2--> file-channel-2 --> file-channel-2

#list the sources, sinks and channels in the agent
agent_foo.sources = avro-AppSrv-source1 exec-tail-source2
agent_foo.sinks = hdfs-Cluster1-sink1 avro-forward-sink2
agent_foo.channels = mem-channel-1 file-channel-2

#flow #1 configuration
agent_foo.sources.avro-AppSrv-source1.channels = mem-channel-1
agent_foo.sinks.hdfs-Cluster1-sink1.channel = mem-channel-1

#flow #2 configuration
agent_foo.sources.exec-tail-source2.channels = file-channel-2
agent_foo.sinks. file-channel-2.channel = file-channel-2

(3)Fan out flow

支持将一个source中的数据发往多个channel中,Fan out 有两种模式

  • replicating : 事件会发往多个channel
  • multiplexing : 事件会发往经由selector过滤符合要求的channel,如果不指明默认是replicating 配置示例:
#list the sources, sinks and channels in the agent
agent_foo.sources = avro-AppSrv-source1
agent_foo.sinks = hdfs-Cluster1-sink1 avro-forward-sink2
agent_foo.channels = mem-channel-1 file-channel-2

#set channels for source
agent_foo.sources.avro-AppSrv-source1.channels = mem-channel-1 file-channel-2

#set channel for sinks
agent_foo.sinks.hdfs-Cluster1-sink1.channel = mem-channel-1
agent_foo.sinks.avro-forward-sink2.channel = file-channel-2

#channel selector configuration
agent_foo.sources.avro-AppSrv-source1.selector.type = multiplexing
agent_foo.sources.avro-AppSrv-source1.selector.header = State
agent_foo.sources.avro-AppSrv-source1.selector.mapping.CA = mem-channel-1
agent_foo.sources.avro-AppSrv-source1.selector.mapping.AZ = file-channel-2
agent_foo.sources.avro-AppSrv-source1.selector.mapping.NY = mem-channel-1 file-channel-2
agent_foo.sources.avro-AppSrv-source1.selector.default = mem-channel-1

selector.header指定检测的头部的名称,上面配置为State。如果值是“CA”event将会发往mem-channel-1,如果值是“AZ”event将会发往file-channel-2,如果是“NY”将会发往 mem-channel-1和file-channel-2。如果都没有匹配到,则会发往默认channel mem-channel-1 需要注意:一旦指定的channel不能消费事件,selector会在所有的channel中重试。

4. 启动flume agent

以__单个组件配置__方式启动flume agent apache-fluem]# bin/flume-ng agent --conf ./conf --conf-file ./conf/flume-conf.properties.template --name agent01

agent:表明运行为flume agent
--conf :指明配置文件目录
--conf-file:指明配置我文件
--name:指明运行agent的名称

可以看到端口已经监听

5. 测试是否正常

连接成功后,输入任意的字符串,如果正常会返回OK

参考

对于不同source,channel以及sink的使用可以参考官方文档 Flume官网文档:http://flume.apache.org/FlumeUserGuide.html