Flume概念和启动过程分析

203 阅读5分钟

一、概念

flume是一个分布式、可靠、和高可用的海量日志采集、聚合和传输的系统。

Flume系统中核心的角色是agent,agent本身是一个Java进程,一般运行在日志收集节点。

一个agent内部有三个组件:

Source:采集源,用于跟数据源对接,以获取数据

Channel:agent内部的数据传输通道,用于从source将数据传递到sink

Sink:下沉地,采集数据的传送目的,用于往下一级agent传递数据或者往最终存储系统传递数据

event:Flume内部数据传输的最基本单元,event将传输的数据进行封装。如果是文本文件,通常是一行记录,event也是事务的基本单位。

  event从source,流向channel,再到sink,本身为一个字节数组,并可携带headers(头信息)信息。

  event代表着一个数据的最小完整单元,从外部数据源来,向外部的目的地去。

二、数据传输

2.1 flume传输数据时会使用事务

  source推送数据到channel以及sink从channel拉取数据时都是以事务方式进行的。

  比如sink输出数据完毕后应该将channel中缓存的数据删除,sink输出数据和channel删除数据是一个事务里面的,要么都成功要么都失败

2.2 常见source和sink

类别  类型描述
sourceAvro SourceAvro Source监听Avro端口,接收从外部Avro客户端发送来的数据流
sourceExec Source这个source在启动时运行给定的Unix命令,并期望该进程在标准输出上连续生成数据
sourceSpooling Directory Source监控指定目录内的数据变更
sourceNetcat Source监控某个端口,将流经端口的每一个文本行数据作为event输入
sourceHttp Source基于Http Post或者Get方式的数据源,支持JSON,BLOB表示形式
ChannelMemory ChanneEvent数据存储在内存中
ChannelFile ChannelEvent数据存储在磁盘文件中
Sinkkafkakafka
Sinkhdfshdfs
Sinkhive等技术hive等技术

2.3 简单配置参考

# 首先先给agent起一个名字 叫a1
# 分别给source channel sink取名字
a1.sources = r1
a1.channels = c1
a1.sinks = k1

# 分别对source、channel、sink进行配置
# 配置source
a1.sources.r1.type = spooldir
a1.sources.r1.spoolDir = /usr/local/data/test
a1.sources.r1.fileSuffix = .ok
a1.sources.r1.fileHeader = true

# 配置sink
# 使用logger作为sink组件,可以将收集到数据直接打印到控制台
a1.sinks.k1.type = logger

# 配置channel
# 将channel的类型设置为memory,表示将event缓存在内存中
a1.channels.c1.type = memory

# 组装
a1.sources.r1.channels = c1
a1.sinks.k1.channel = c1

2.4 启动

flume-ng agent -n a1 -f spoolTolog.conf 

-n 的含义是agent的名字,与上面conf文件里面的agent名字保持一致
-f 的含义是conf文件位置,这里的spoolTolog.conf 就是我上面编写的conf文件名称

flume1.9 中文文档:flume.liyifeng.org/

2.5 新建文件写入些内容,看flume内容

a1.sources.r1.spoolDir = /usr/local/data/test
到这个目录下面创建一个 a.txt 文件,在里面随便写一些数据,然后再来看flume这边

回到a.txt 文件所在的目录下面

上图中消息内容以Event传递,event里面分为两个部分,分别是 header 和 body
header信息,event的头信息,这里显示的内容是file路径,是因为conf文件里面加上了a1.sources.r1.fileHeader = true参数
body信息,body信息又分为两个部分,后半部分的123是 a.txt 文件里面的内容,而前面的31,32,33则分别是 1,2,3的十六进制ASCII码值

2.6 拦截器

flume监听指定目录下的文件数据变更信息,对于这些信息可以全盘保留,然后以指定的sink方式输出。但是也可以通过拦截器的方式,根据需要过滤或者保留一些信息,然后只会把拦截器拦截过后的这一部分信息传输到sink

# 首先先给agent起一个名字 叫a1
# 分别给source channel sink取名字
a1.sources = r1
a1.channels = c1
a1.sinks = k1

# 分别对source、channel、sink进行配置
# 配置source
a1.sources.r1.type = spooldir
a1.sources.r1.spoolDir = /usr/local/data/test
a1.sources.r1.fileSuffix = .ok
a1.sources.r1.fileHeader = true

# 给r1这个souces配置一个拦截器并取名为 i1
a1.sources.r1.interceptors = i1
# 将拦截器i1的类型设置为regex_filter 会根据正则表达式过滤数据
a1.sources.r1.interceptors.i1.type = regex_filter
# 配置正则表达式
a1.sources.r1.interceptors.i1.regex = \d{3,6}
# excludeEvents = true 表示将匹配到的过滤,未匹配到的放行
# excludeEvents = false 表示只传输匹配成功的
a1.sources.r1.interceptors.i1.excludeEvents = true

# 配置sink
# 使用logger作为sink组件,可以将收集到数据直接打印到控制台
a1.sinks.k1.type = logger

# 配置channel
a1.channels.c1.type = memory

# 组装
a1.sources.r1.channels = c1
a1.sinks.k1.channel = c1

2.7 测试拦截器

12
123
123456
12345678
ab
abcde
123abc

这里只输出了 12,ab,abcde,以及最后的一个空行

a1.sources.r1.interceptors.i1.excludeEvents = true,true表明匹配正则表达式成功则被拦截,不会放行

 

2.8 hbase输出日志到hdfs 

# 起名字
a.sources = r1
a.sinks = k1 
a.channels = c1

# 配置source,这次选用 exec source
a.sources.r1.type = exec 
# 指定exec source通过执行什么命令来获取信息
a.sources.r1.command = tail -f /usr/local/soft/hbase-1.4.6/logs/hbase-root-master-master.log

#配置sink
a.sinks.k1.type = hdfs
a.sinks.k1.hdfs.path = /flume/data/dir2
a.sinks.k1.hdfs.filePrefix = hbaselog
a.sinks.k1.hdfs.rollSize = 102400
a.sinks.k1.hdfs.rollCount = 1000
a.sinks.k1.hdfs.fileType = DataStream
a.sinks.k1.hdfs.writeFormat = text
a.sinks.k1.hdfs.fileSuffix = .txt

#配置channel
a.channels.c1.type = memory 
a.channels.c1.capacity = 1000
a.channels.c1.transactionCapacity = 100

# 组装
a.sources.r1.channels = c1 
a.sinks.k1.channel = c1

 

2.9 监听端口输出到控制台

# 起名字
a.sources = r1
a.sinks = k1 
a.channels = c1

# 配置source
a.sources.r1.type = netcat 
# 0.0.0.0表示接收任意ip的用户提交的信息
a.sources.r1.bind = 0.0.0.0 
# 设置监听端口
a.sources.r1.port = 8888 

#配置sink
a.sinks.k1.type = logger

# 配置channel
a.channels.c1.type = memory 
a.channels.c1.capacity = 1000
a.channels.c1.transactionCapacity = 100

# 组装
a.sources.r1.channels = c1 
a.sinks.k1.channel = c1

如果a.sources.r1.bind = 0.0.0.0 这里设置的bind是127.0.0.1表示,只接受这个ip发来的信息,其余ip的信息不会被被flume接收。而设置为0.0.0.0则是任意ip的信息都会被flume监听接收

先启动flume,然后通过telnet在8888端口发送信息

 

参考链接:blog.csdn.net/qq_44823756…