Flume基础学习笔记

一、什么是flume

Flume是一个高可用的,高可靠的,分布式的海量日志采集、聚合和传输的系统,Flume支持在日志系统中定制各类数据发送方,用于收集数据;同时,Flume提供对数据进行简单处理,并写到各种数据接受方(可定制)的能力。

二、flume特点

flume的数据流由事件(Event)贯穿始终。事件是Flume的基本数据单位,它携带日志数据(字节数组形式)并且携带有头信息,这些EventAgent外部的Source生成,当Source捕获事件后会进行特定的格式化,然后Source会把事件推入(单个或多个)Channel中。你可以把Channel看作是一个缓冲区,它将保存事件直到Sink处理完该事件。Sink负责持久化日志或者把事件推向另一个Source

flume的可靠性

当节点出现故障时,日志能够被传送到其他节点上而不会丢失。Flume提供了三种级别的可靠性保障,从强到弱依次分别为:end-to-end(收到数据agent首先将event写到磁盘上,当数据传送成功后,再删除;如果数据发送失败,可以重新发送。),Store on failure(这也是scribe采用的策略,当数据接收方crash时,将数据写到本地,待恢复后,继续发送),Besteffort(数据发送到接收方后,不会进行确认)。

flume的可恢复性:

还是靠Channel。推荐使用FileChannel,事件持久化在本地文件系统里(性能较差)。 

flume的一些核心概念:

Agent使用JVM 运行Flume。每台机器运行一个agent,但是可以在一个agent中包含多个sourcessinks

Client生产数据,运行在一个独立的线程。

SourceClient收集数据,传递给Channel

SinkChannel收集数据,运行在一个独立线程。

Channel连接 sources 和 sinks ,这个有点像一个队列。

Events可以是日志记录、 avro 对象等。

值得注意的是,Flume提供了大量内置的SourceChannelSink类型。不同类型的Source,ChannelSink可以自由组合。组合方式基于用户设置的配置文件,非常灵活。比如:Channel可以把事件暂存在内存里,也可以持久化到本地硬盘上。Sink可以把日志写入HDFS, HBase,甚至是另外一个Source等等。Flume支持用户建立多级流,也就是说,多个agent可以协同工作,并且支持Fan-inFan-outContextual RoutingBackup Routes

三、flume架构

Agent:

Flumeagent为最小的独立运行单位,一个Agent包含多个sourcechannelsink和其他组件

source

flume提供多种source供用户进行选择,尽可能多的满足大部分日志采集的需求,常用的source的类型包括avroexecnetcatspooling-directorysyslog等。具体的使用范围和配置方法详见source.

channel

flume中的channel不如sourcesink那么重要,但却是不可忽视的组成部分。常用的channelmemory-channel,同时也有其他类型的channel,如JDBCfile-channelcustom-channel等,详情见channel.

sink

flumesink也有很多种,常用的包括avrologgerHDFSHbase以及file-roll等,除此之外还有其他类型的sink,如thriftIRCcustom等。具体的使用范围和使用方法详见sink.

四、flume使用

创建配置文件(随意位置)

vi agent.conf

五、配置

常见的source

avro source:avro可以监听和收集指定端口的日志,使用avrosource需要说明被监听的主机ip和端口号

例子:

agent1.sources = r1

#描述source

agent1.sources.r1.type = avro  (类型为avro source)

agent1.sources.r1.bind = 0.0.0.0 (指定监听的主机ip.本机是0.0.0.0.

agent1.sources.r1.port = 16667 (指定监听的端口号)

 

exec source:可以通过指定的操作对日志进行读取,使用exec时需要指定shell命令,对日志进行读取

例子:

agent1.source = r2

#描述source

agent1.sources.r2.type = exec 

agent1.sources.r2.command =tail -F /root/flume/log/event.txt (监听的文件的路径)

 

Spooling-directory source:可以读取文件夹里的日志,使用时指定一个文件夹,可以读取该文件夹中的所有文件,当出现新文件时会读取该文件并获取数据.需要注意的是该文件夹中的文件在读取过程中不能修改,同时文件名也不能修改。

1、spoolDirectory是监控目录,不能为空,没有默认值。这个source不具有监控子目录的功能,也就是不能递归监控。如果需要,这需要自己去实现,http://blog.csdn.net/yangbutao/article/details/8835563 这里有递归检测的实现;

2completedSuffix是文件读取完毕后给完成文件添加的标记后缀,默认是".COMPLETED"

3deletePolicy这是是否删除读取完毕的文件,默认是"never",就是不删除,目前只支持"never"和“IMMEDIATE”;

4fileHeader是否在eventHeader中添加文件名,boolean类型默认false

5fileHeaderKey这是eventHeader中的key,value是文件名

6batchSize这个是一次处理的记录数,默认是100

7inputCharset编码方式,默认是"UTF-8"

8ignorePattern忽略符合条件的文件名

9trackerDirPath被处理文件元数据的存储目录,默认".flumespool"

10deserializerType将文件中的数据序列化成event的方式,默认是“LINE---org.apache.flume.serialization.LineDeserializer

11deserializerContext这个主要用在Deserializer中设置编码方式outputCharset和文件每行最大长度maxLineLength

 

例子:

agent1.sources = r3

#描述source

agent1.sources.r3.type = spooldir

agent1.sources.r3.spoolDir = /root/flume/log  (监听的文件目录)

agent1.sources.r3.fileHeader = true

    

NetCat source:用来监听一个指定端口,并将接收到的数据的每一行转换为一个事件。

例子:

agent1.sources = r4 

#描述source

agent1.sources.r4.type = netcat  (source类型)

agent1.sources.r4.bind = 0.0.0.0 (指定绑定的ip或主机名)

agent1.sources.r4.port = 16668   (指定绑定的端口号)

 

HTTP source:接受HTTPGETPOST请求作为Flume的事件,其中GET方式应该只用于试验。

type    类型,必须为"HTTP"

port–   监听的端口

bind   0.0.0.0    监听的主机名或ip

handler      org.apache.flume.source.http.JSONHandler处理器类,需要实现HTTPSourceHandler接口

handler.*  –   处理器的配置参数

Selector.type

selector.*   

interceptors  –  

interceptors.*        

enableSSL  false  是否开启SSL,如果需要设置为true。注意,HTTP不支持SSLv3

excludeProtocols  SSLv3  空格分隔的要排除的SSL/TLS协议。SSLv3总是被排除的。

keystore      密钥库文件所在位置

keystorePassword Keystore 密钥库密码

例子:

agent1.sources.r1.type  = http

agent1.sources.r1.port  = 66666

 

常见的channel

memory channel:内存

例子:

agent1.channels = c1

agent1.channels.c1.type = memory

agent1.channels.c1.capacity = 100000

agent1.channels.c1.transactionCapacity = 100000

 

常见的sink

logger sink:将收集到的日志写到flumelog

例子:

agent1.sinks = k1

agent2.sinks.k1.type = logger

 

avro sink:可以将接受到的日志发送到指定端口,供级联agent的下一跳收集和接受日志,使用时需要指定目的ip和端口

例子:

agent1.sinks=k1

agent1.sinks.k2.type = avro

agent1.sinks.k2.channel = c2

agent1.sinks.k2.hostname = hadoop03 (指定的主机名或ip)

agent1.sinks.k2.port = 16666  (指定的端口号)

 

file_roll sink:可以将一定时间内收集到的日志写到一个指定的文件中,具体过程为用户指定一个文件夹和一个周期,然后启动agent,这时该文件夹会产生一个文件将该周期内收集到的日志全部写进该文件内,直到下一个周期再次产生一个新文件继续写入,以此类推,周而复始。

例子:

agent1.sinks=k1

agent1.sinks.k1.type = file_roll

agent1.sinks.k1.channel = c1

agent1.sinks.k1.sink.directory=/root/flumelog (指定文件所在目录的路径)

 

hdfs sink:将收集到的日志写入到新创建的文件中保存起来,存储路径为分布式的文件系统hdfs的路径,同时hdfs创建新文件的周期可以是时间,也可以是文件的大小,还可以是采集日志的条数

猜你喜欢

转载自blog.csdn.net/cp_panda_5/article/details/79557601