一、Flume概述
1.1 Flume定义
Flume是Cloudera提供的一个高可用、高可靠的分布式的海量日志采集、聚合和传输的系统。
1.2 Flume基础机构
-
Agent
Agent是一个JVM进程,它以事件的形式将数据从源头送至目的。
Agent主要由三个部分组成:Source、Channel、Sink
-
Source
Source是负责接收数据到Flume Agent的组件。Source组件可以处理各种类型、各种格式的日志数据,包括avro、thrift、exec、jms、spooling directory、netcat、sequence generator、syslog、http、legacy。
-
Channel
Channel是位于Source和Sink之间的缓冲区。因此,Channel允许Source和Sink运作在不同的速率上。Channel是线程安全的,可以同时处理几个Source的写入操作和几个Sink的读取操作。
Flume自带两种Channel:Memory Channel和File Channel 以及 Kafka Channel。
-
Memory Channel是内存中的队列。
Memory Channel在不需要关系数据丢失的情景下适用。如果需要关心数据丢失,那么Memory Channel就不应该使用,程序死亡、机器宕机或者重启都会导致数据丢失。
-
File Channel
File Channel将所有事件写到磁盘。所以在程序关闭或机器宕机的情况下不会丢失数据。
-
-
Sink
Sink不断地轮询Channel中的事件且批量地移除它们,并将这些事件批量写入到存储或索引系统、或者被发送到另一个Flume Agent。
Sink组件目的地包括:hdfs、logger、avro、thrift、ipc、file、HBase、solr、自定义组件
-
-
Event
传输单元,Flume数据传输的基本单元,以Event的形式将数据从源头送至目的地。
Event由Header和Body两部分组成,Header用来存放该event的一些属性,为K-V结构,Body用来存放该条数据,形式为字节数组。
二、Flume快速入门
2.1 安装部署
-
官网
-
安装部署
-
将下载文件解压到
opt/software
目录下 -
将
$FLUME_HOME/conf
下的flume-env.sh.template
文件修改为flume-env.sh
,并配置其中的JAVA_HOME属性
-
2.2 入门案例
2.2.1 监控端口数据官方案例:netcat-flume-logger.conf
可以参考如下官方案例说明:
-
需求
使用Flume监听一个端口,收集该端口数据,并打印到控制台
-
配置文件
-
安装netcat工具:
sudo yum install nc -y
-
检查44444端口是否被占用:
netstat -unltp | grep 44444
-
创建Flume Agent配置文件 netcat-flume-logger.conf
-
在$FLUME_HOME创建job文件夹:
mkdir $FLUME_HOME/job
-
在job文件夹下创建Flume Agent配置文件
netcat-flume-logger.conf
# Name the components of this agent # a1:表示agent的名称 a1.sources=r1 # r1:表示a1的source名称 a1.sinks=k1 # k1:表示a1的sink名称 a1.channels=c1 # c1:表示c1的channel名称 #Discribe/Configure the source a1.sources.r1.type=netcat # 表示a1的输入源类型为netcat类型 a1.sources.r1.bind=localhost # 表示a1的监听主机 a1.sources.r1.port=44444 # 表示a1的监听端口号 #Discribe the sink a1.sinks.k1.type=logger # 表示a1的输出目的地是控制台logger类型 #Use a channel which buffers events in memory a1.channels.c1.type=memory # 表示a1的channel类型是memory内存型 a1.channels.c1.capacity=1000 # 表示a1的channel总容量为1000个event a1.channels.c1.transactionCapacity=100 # 表示a1的channel传输时收集到了100条event以后再去提交事务 #Bind the source and sink to the channel a1.sources.r1.channels=c1 # 表示将source和channel关联 # 注意a1.sinks.k1.channel环节的channel,不能写成channels,应为channel与sink的关系是一对多(即 1:n) a1.sinks.k1.channel=c1 # 表示将sink和channel关联
-
-
-
测试
-
开启服务端
# 方式一 [nuochengze@pc001 job]$ flume-ng agent --conf conf --conf-file $FLUME_HOME/job/netcat-flume-logger.conf --name a1 -Dflume.root.logger=INFO,console # 方式二(简写) [nuochengze@pc001 job]$ flume-ng agent -c conf -f $FLUME_HOME/jobs/netcat-flume-logger.conf -n a1 -Dflume.root.logger=INFO,console
- --conf/-c:表示配置文件存储在
$FLUME_HOME/conf
目录中 - --name/-n:表示给agent起的名称
- --conf -file/-f :flume本次启动读取的配置文件是在
$FLUME_HOME/job
文件下的netcat-flume-logger.conf
文件 - -Dflume.root.logger=INFO,console:-D表示flume运行时动态修改flume.root.logger参数属性值,并将控制台日志打印级别设置为INFO级别。日志级别包括:log、info、warn、error
- --conf/-c:表示配置文件存储在
-
开启客户端
nc localhost 44444
-
在客户端发送数据
-
-