Flume日志收集

Apache Flume简介

Flume用于将多种来源的日志以流的方式传输至Hadoop或者其他目的地
一种可靠、可用的高效分布式数据收集服务
Flume拥有基于数据流上的简单灵活架构,支持容错、故障转移与恢复
由Cloudera 2009年捐赠给Apache,现为Apache顶级项目

Flume架构

Client:客户端,数据产生的地方,如Web服务器
Event:事件,指通过Agent传输的单个数据包,如日志数据通常对应一行数据
Agent:代理,一个独立的JVM进程
Flume以一个或多个Agent部署运行
Agent包含三个组件:Source、Channel、Sink

[root@xuxu opt]# mv apache-flume-1.6.0-cdh5.14.2-bin/ soft/flume160
[root@xuxu opt]# cd soft/flume160/conf
[root@xuxu conf]# source /etc/profile
[root@xuxu conf]# cd ../bin
[root@xuxu bin]# flume-ng version
[root@xuxu bin]# mkdir /opt/flumeconf
[root@xuxu bin]# cd /opt/flumeconf/
[root@xuxu flumeconf]# vi conf_0804_simple.properties
[root@xuxu ~]# flume-ng agent -n a1 -c conf -f /opt/flumeconf/conf_0804_simple.properties -Dflume.root.logger=INFO,console
[root@xuxu flumeconf]# nc 192.168.56.100 6666

conf_0804_simple.properties:

# example.conf: A single-node Flume configuration

# Name the components on this agent
a1.sources = r1
a1.sinks = k1
a1.channels = c1
// 设置Source为netcat端口为6666,使用的channnel为c1
# Describe/configure the source
a1.sources.r1.type = netcat
a1.sources.r1.bind = 192.168.56.100
a1.sources.r1.port = 6666
// 设置Sink为logger模式,使用的channel为c1
# Describe the sink
a1.sinks.k1.type = logger
// 设置channel为capacity
# Use a channel which buffers events in memory
a1.channels.c1.type = memory
a1.channels.c1.capacity = 1000
a1.channels.c1.transactionCapacity = 100

# Bind the source and sink to the channel
a1.sources.r1.channels = c1
a1.sinks.k1.channel = c1

在这里插入图片描述

可靠性

Flume的核心是把数据从数据源收集过来,再送到目的地。为了保证输送一定成功,再送到目的地之前,会先缓存数据,待数据真正达到目的地之后,删除自己缓存的数据。
Flume使用事务性的方式保证传送Event整个过程的可靠性。Sink必须在Event被存入Channel后,或者,已经被传达到下一站Agent里,又或者,已经被存入外部数据目的地之后,才能把Event从Channel中remove掉。这样数据流里的Event无论是在一个agent里还是多个agent之间流传,都能保证可靠,因为以上的事务保证了Event会被成功存储起来,比如Flume支持再本地保存一份文件Channel作为备份,而Memory Channel将Event存在内存队列里,速度快,但丢失的话无法恢复。

可恢复性

Events在通道中执行,由该通道管理从失败中恢复。Flume支持由本地文件系统支持的持久文件通道。还有一个内存通道,他只是简单的将事件存储在内存队列中,速度更快,但是当代理进程死亡时,仍然留在内存通道中的任何事件都无法恢复。

Flume原理

主要组件

包括:Source、SourceRunner、Interceptor、Channel、ChannelSelector、ChannelProcessor、Sink、SinkRunner、SinkProcessor、SinkSelector,其中,Source、Channel及Sink为核心组件,各组件作用如下:
Source:用来获取Event并写入Channel
SourceRunner:SourceRunner则负责启动Source,一个SourceRunner包含一个Source对象。
Interceptor:即为拦截器,是简单的插件式组件,设置在Source和Channel之间。Source接收到的事件Event,在写入Channel之前,拦截器都可以进行转换或者删除这些事件。每个拦截器只处理同一个Source接收到的事件。可以自定义拦截器。
Channel:中转Event的一个临时存储,保存有Source组件传递过来的Event,可以认为是一个队列。
ChannelSelector:作用是为Source选择下游的Channel。有两种选择方式,复制和多路复用,所谓复制就是把Source中传递过来的Event复制给所有对应的下游的Channel。多路复用是可以把Source传递过来的Event按照不同的属性传递到不同的下游Channel中去。
ChannelProcessor:通过ChannelSelector获取到Channels后,如何发送Event到Channel。一个Source对象包含一个ChannelProcessor对象,一个ChannelProcessor对象包含多个Interceptor对象和一个ChannelSelector对象。
在这里插入图片描述
在这里插入图片描述
Sink:从Channel中读取并移除Event,将Event传递到Flow Pipeline中的下一个Agent或者其他存储系统。一个SinkRunner对象包含一个SinkProcessor对象,一个SinkProcessor包含多个Sink或者一个SinkSelector。
SinkRunner:负责启动Sink。在Agent启动时,会同时启动Channel、SourceRunner、SinkRunner,如下图所示。

private void doStart() {
	boolean error = true
	try {
		channel.start();   // 调用Channel.start启动Channel
		sinkRunner.start()   // 调用SinkRunner.start启动SinkRunner
		sourceRunner.start()   // 调用SourceRunner.start启动SourceRunner
		supervisor.supervise(channel,new SupervisorPolicy.AlwaysRestartPolicy(),LifecycleState.START);
		supervisor.supervise(sinkRunner,new SupervisorPolicy.AlwaysRestartPolicy(),LifecycleState.START);
		supervisor.supervise(sourceRunner,new SupervisorPolicy.AlwaysRestartPolicy(),LifecycleState.START);
		error = false;
		...

SinkProcessor:Flume提供FailoverSinkProcessor和LoadBalancingSinkProcessor,顾名思义,一个是失效备援,一个是负载均衡,那么SinkProcessor不同子类的存在就是为了实现不同的分配操作和策略,而sink的start()通常是启动线程去执行消费操作。
SinkSelector:LoadBalancingSinkProcessor包含SinkSelector,会根据SinkSelector在SinkGroup(逻辑上的一组Sink)中选择Sink并启动。从源码中可以看出,其为LoadBalancingSinkProcessor的内部接口。如下图所示。

工作流程

下面从两个阶段分别描述。
1.Source -> Channel
数据由Source写入Channel,主动模式,主要步骤如下:
1)SourceRunner启动Source,Source接受Event;
2)Source调用ChannelProcessor;
3)ChannelProcessor调用Interceptor进行过滤Event操作;
4)ChannelProcessor调用ChannelSelector对象根据配置的策略选择Event对应的Channel(replication和multiplexing两种);
5)Source将Event发送到对应的Channel中。
2.Channel -> Sink
数据由Sink主动从Channel中拉取;
1)SinkRunner启动SinkProcessor(DefaultSinkProcessor,Fail over Sink Processor,LoadBalancingSinkProcessor3种);
2)如果是DefaultSinkProcessor的话,直接启动单个Sink;
3)FailoverSinkProcessor,LoadBalancingSinkProcessor对应的是SinkGroup;
4)FailoverSinkProcessor从SinkGroup中选择出Sink并启动;
5)LoadBalancingSinkProcessor包含SinkSelector,会根据SinkSelector在SinkGroup中选择Sink并启动;
6)Sink从Channel中消费Event信息。
Flume工作流程如下图所示。
在这里插入图片描述

核心常用组件

Source

Exec Source

Exec Source在启动时运行一个给定的Unix命令,并期望该进程不断地在标准输出上产生数据。其属性如下表所示。

属性默认值描述
channels-指定Channels,多个Channel以空格分隔
type-组件类型必须是“exec”
command-指定Shell命令,如:tail -F /var/log/secure
shell-用于运行命令的shell解释器。例如/bin/sh -c
restartThrottle10000尝试重新启动前等待的时间(以毫秒为单位)
restartfalse如果执行的command死亡,是否重新启动
logStdErrfalse是否记录命令的stderr输出信息
batchSize20一次读取并发送到channel的最大行数
batchTimeout3000在数据被下推之前,如果没有达到缓冲区大小,等待的时间(以毫秒为单位)
selector.typereplicatingreplicating(复制)或者multiplexing(多路复用)
interceptors-以空格分隔的拦截器列表

Agent为“a1”的Exec Source示例:

a1.sources=r1
a1.channels=c1
a1.sources.r1.type=exec
a1.sources.r1.command=tail -F /var/log/secure   // 从末尾读取文件中的数据
a1.sources.r1.channels=c1
Spooling Directory Source

该Source将监视指定目录的新文件,一旦有新文件产生立即解析它们。将给定的文件完全读入Channel后,默认情况下通过重命名该文件来表示完成,或者可以删除该文件,或者使用trackerDir跟踪已处理的文件。其属性如下表所示。

属性默认值描述
Channels-指定Channels,多个Channel以空格分隔
type-组件类型必须是“spooldir”
spoolDir-指定要从中读取文件的目录
fileSuffix.COMPLETED附加到已读取文件的后缀
deletePolicynever何时删除已完成的文件:never / immediate(立即)
fileHeaderfalse是否要添加一个header存储绝对路径的文件名
fileHeaderKeyfile当将绝对路径文件名附加到事件header时使用的header键
basenameHeaderfalse是否添加一个header存储文件基名
basenameHeaderKeybasename文件基名的header键
includePattern^.*$指定要包含哪些文件的正则表达式。它可以与ignorePattern一起使用。如果一个文件同时匹配ignorePattern和includePattern regex,则该文件将被忽略。
ignorePattern^$指定要忽略哪些文件的正则表达式
trackerDirflumespool指定来存储与文件处理相关的元数据 的目录。如果此路径不是绝对路径, 则将其解释为相对于 spoolDir。 trackingPolicy
consumeOrderoldest处理文件的先后顺序,可选项有: oldest、youngest、random 。当为 oldest 和 youngest 时,使用文件 的最后修改时间来比较文件,在出现 并列的情况时,字典顺序最小的文件 将首先被使用。在 random 情况下,任何文件都会被随机挑选。
pollDelay500轮询新文件时使用的延迟(毫秒)。 recursiveDirectorySearch
maxBackoff4000如果 Channel 已满,在连续尝试写入通 道之间等待的最大时间(以毫秒为单位。Source 将从一个较低的回退开始, 并在每次通道抛出 ChannelException 时以指数方式增加它,直到该参数指 定的值为止。
batchSize100批量传输到 Channel 的粒度
inputCharsetUTF-8反序列化器(把输入文件反序列化为 文本)所使用的字符集。
decodeErrorPolicyFAIL当我们在输入文件中看到一个不可解 码的字符时该怎么做。FAIL:抛出异 常,解析文件失败。REPLACE:用替换字符替换不可解析字符,通常是 Unicode U+FFFD。IGNORE:删除不可解析的字符序列。
deserializerLINE指定用于将文件解析为事件的反序列化器。默认将每一行解析为一个事件。 可选:LINE
selector.typereplicatingreplicating(复制) 或者 multiplexing (多路复用)
interceptors-以空格分隔的拦截器列表

示例:

a1.channels=ch-1
a1.sources=src-1
a1.sources.src-1.type=spooldir
a1.sources.src-1.channels=ch-1
a1.sources.src-1.spoolDir=/var/log/apache/flumeSpool
a1.sources.src-1.fileHeader=true
Avro Source

监听Avro端口并从外部Avro客户端流接收事件。当与另一个(前一跳)Flume Agent上的Avro Sink一起使用时,它可以创建分层收集拓扑。其属性如下表所示。

属性默认值描述
channels-指定Channels,多个Channel以空格分格
type-组件类型名必须是”avro“
bind-监听主机IP地址
port-监听端口
threads-工作线程的最大数目
selector.typereplicatingreplicating(复制)或者multiplexing(多路复用)
interceptors-以空格分隔的拦截器列表
compression-typenone压缩类型,必须与匹配源的压缩类型匹配。可选:none / deflate
sslfalse设置为true以启用SSL加密。如果启用了SSL,还必须指定”keystore“和”keystore-password“
keystore-Java密钥库文件的路径。如果这里没有指定,那么将使用全局密钥存储库。
keystore-password-Java密钥库的密码。如果这里没有指定,那么 将使用全局密钥库密码
keystore-type-JKS
exclude-p’rotocolsSSLv3要排除的SSL / TLS协议的空格分隔列表。除了指定的协议外,SSLv3总是被排除在外。
include-protocols-要包含的SSL / TLS协议的空格分隔列表。所启用的协议将是包含的协议,不包含被排除的协议。如果包含的协议是空的,那么它包含所有支持的协议。
exclude-cipher-suites-要排除的密码套件的空格分隔列表。 include-cipher-suites
ipFilterfalse如果需要为 netty 开启 ip 过滤,将此项设置为 true。 ipFilterRules

示例:

a1.channels=c1
a1.sources=r1

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值