Flume概述
Flume是Cloudera提供的一个高可用的,高可靠的,分布式的海量日志采集、聚合和传输的系统。Flume基于流式架构,灵活简单。
版本区别
0.9之前称为flume og
0.9之后为flume ng
目前都使用flume ng!
1.7之前,没有taildirsource,1.7及之后有taildirsource
使用Flume
启动agent: flume-ng agent -n agent的名称 -f agent配置文件 -c 其他配置文件所在的目录 -Dproperty=value
Flume基础架构
图1-1 Flume组成架构
Agent是一个JVM进程,它以事件的形式将数据从源头送至目的。
Agent主要有3个部分组成,Source、Channel、Sink。
1.Source(数据源)
Source是负责接收数据到Flume Agent的组件。Source组件可以处理各种类型、各种格式的日志数据,包括avro、thrift、exec、jms、spooling directory、netcat、sequence generator、syslog、http、legacy。
2.Sink(落地)
Sink不断地轮询Channel中的事件且批量地移除它们,并将这些事件批量写入到存储或索引系统、或者被发送到另一个Flume Agent。
Sink组件目的地包括hdfs、logger、avro、thrift、ipc、file、HBase、solr、自定义。
3.Channel
Channel是位于Source和Sink之间的缓冲区。因此,Channel允许Source和Sink运作在不同的速率上。Channel是线程安全的,可以同时处理几个Source的写入操作和几个Sink的读取操作。
Flume自带两种Channel:Memory Channel和File Channel。
Memory Channel是内存中的队列。Memory Channel在不需要关心数据丢失的情景下适用。如果需要关心数据丢失,那么Memory Channel就不应该使用,因为程序死亡、机器宕机或者重启都会导致数据丢失。
File Channel将所有事件写到磁盘。因此在程序关闭或机器宕机的情况下不会丢失数据。
传输单元,Flume数据传输的基本单元,以Event的形式将数据从源头送至目的地。Event由Header和Body两部分组成,Header用来存放该event的一些属性,为K-V结构,Body用来存放该条数据,形式为字节数组。
在source将event放入到channel之前,调用拦截器对event进行拦截和处理!
在Flume中允许使用拦截器对传输中的event进行拦截和处理!拦截器必须实现org.apache.flume.interceptor.Interceptor接口。拦截器可以根据开发者的设定修改甚至删除event!Flume同时支持拦截器链,即由多个拦截器组合而成!通过指定拦截器链中拦截器的顺序,event将按照顺序依次被拦截器进行处理!
当一个source对接多个channel时,由 Channel Selectors选取channel将event存入!
Channel Selectors用于source组件将event传输给多个channel的场景。常用的有replicating(默认)和multiplexing两种类型。replicating负责将event复制到多个channel,而multiplexing则根据event的属性和配置的参数进行匹配,匹配成功则发送到指定的channel!
当多个sink从一个channel取数据时,为了保证数据的顺序,由sink processor从多个sink中挑选一个sink,由这个sink干活!
用户可以将多个sink组成一个整体(sink组),Sink Processors可用于提供组内的所有sink的负载平衡功能,或在时间故障的情况下实现从一个sink到另一个sink的故障转移。
如何编写agent的配置文件
agent的配置文件的本质是一个Properties文件!格式为 属性名=属性值
在配置文件中需要编写:
①定义当前配置文件中agent的名称,再定义source,sink,channel它们的别名
②指定source和channel和sink等组件的类型
③指定source和channel和sink等组件的配置,配置参数名和值都需要参考flume到官方用户手册
④指定source和channel的对应关系,以及sink和channel的对应关系。连接组件!
监控端口数据官方案例
使用Flume监听一个端口,收集该端口数据,并打印到控制台。
实现步骤:
1.安装netcat工具
sudo yum install -y nc
2.判断44444端口是否被占用
sudo netstat -tunlp | grep 44444
3.创建Flume Agent配置文件flume-netcat-logger.conf
查看flume官方文档:
使用的组件类型
①netcat source: 作用就是监听某个tcp端口手动的数据,将每行数据封装为一个event。
工作原理类似于nc -l 端口
配置:
必须属性:
type – The component type name, needs to be netcat
bind – Host name or IP address to bind to
port – Port # to bind to
②logger sink: 作用使用logger(日志输出器)将event输出到文件或控制台,使用info级别记录event!
必须属性:
type – The component type name, needs to be logger
可选属性:
maxBytesToLog 16 Maximum number of bytes of the Event body to log
③memery channel
必须属性:
type – The component type name, needs to be memory
可选属性:
capacity 100 The maximum number of events stored in the channel
transactionCapacity 100 The maximum number of events the channel will take from a source or give to a sink per transaction
在job文件夹下创建Flume Agent配置文件flume-netcat-logger.conf。
vim flume-netcat-logger.conf
在flume-netcat-logger.conf文件中添加如下内容。
# Name the components on this agent
#r1:表示a1的SOURCE的名称
a1.sources = r1
#k1:表示a1的Sink的名称
a1.sinks = k1
#c1:表示a1的Channel的名称
a1.channels = c1
# Describe/configure the source
#表示a1的输入源类型为netcat端口类型
a1.sources.r1.type = netcat
#表示a1的输入源的监听的主机
a1.sources.r1.bind = kylin3
#表示a1的输入源的监听的端口号
a1.sources.r1.port = 44444
# Describe the sink
#标识a1的输出目的地事控制台logger类型
a1.sinks.k1.type = logger
# Use a channel which buffers events in memory
#表示a1的channel类型是memory
a1.channels.c1.type = memory
#表示a1的channel总容量10000个
a1.channels.c1.capacity = 10000
#表示a1的channel传输时收集到1000条event以后再去提交事务
a1.channels.c1.transactionCapacity = 1000
# Bind the source and sink to the channel
#表示r1和c1连接起来
a1.sources.r1.channels = c1
#表示c1和k1连接起来
a1.sinks.k1.channel = c1
注:配置文件来源于官方手册http://flume.apache.org/FlumeUserGuide.html
先开启flume监听端口
第一种写法:
bin/flume-ng agent --conf conf/ --name a1 --conf-file job/flume-netcat-logger.conf -Dflume.root.logger=INFO,console
第二种写法:
bin/flume-ng agent -c conf/ -n a1 –f job/flume-netcat-logger.conf -Dflume.root.logger=INFO,console
参数说明:
--conf/-c:表示配置文件存储在conf/目录
--name/-n:表示给agent起名为a1
--conf-file/-f:flume本次启动读取的配置文件是在job文件夹下的flume-telnet.conf文件。
-Dflume.root.logger=INFO,console :-D表示flume运行时动态修改flume.root.logger参数属性值,并将控制台日志打印级别设置为INFO级别。日志级别包括:log、info、warn、error。
使用netcat工具向本机的44444端口发送内容
nc kylin3 44444
hello
在Flume监听页面观察接收数据情况