大数据----flume

1.概述:

Flume 是 Cloudera 提供的一个高可用的,高可靠的,分布式的海量日志采集、聚合和传输的软件。

核心是把数据从数据源(source)收集过来,之后缓存一下数据(channel),然后把数据发送到指定目的地(sink),最后删除缓存中的数据。

不仅仅满足一般的数据采集需求,针对特殊的场景也具备良好的自定义扩展能力,所以flume适合大部分数据采集的场景。

Flume有两个大版本,flume0.9X和flume1.X。

2.运行机制:

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

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

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

Channel:agent 内部的数据传输通道,用于从 source 将数据传递到 sink;在整个数据的传输的过程中,流动的是  event,它是 Flume 内部数据传输的最基本单元。event 将传输的数据进行封装。如果是文本文件,通常是一行记录,

event 也是事务的基本单位。event 从 source,流向 channel,再到 sink,本身为一个字节数组,并可携带 headers(头信息)信息。event 代表着一个数据的最小完整单元,从外部数据源来,向外部的目的地去。

一个完整的 event 包括:event headers、event body、event 信息,其中event 信息就是 flume 收集到的日记记录。

3.Flume结构

    3.1简单结构,单个采集

 

    3.2复杂结构,多级串联

4.应用举例:

    4.1采集目录到hdfs:(flume的相关操作都是通过配置配置文件来实现的)

服务器的某特定目录下,会不断产生新的文件,每当有新文件出现,就需要把文件采集到 HDFS 。

先定义三大要素:

l 采集源,即 source——监控文件目录 : spooldir

l 下沉目标,即 sink——HDFS 文件系统 : hdfs sink

l source 和 sink 之间的传递通道——channel,可用 file channel 也可以用内存 channe

配置文件编写:

# Name the components on this agent

a1.sources = r1

a1.sinks = k1

a1.channels = c1

# Describe/configure the source

##注意:不能往监控目中重复丢同名文件

a1.sources.r1.type = spooldir

a1.sources.r1.spoolDir = /root/logs

a1.sources.r1.fileHeader = true

# Describe the sink

a1.sinks.k1.type = hdfs

a1.sinks.k1.hdfs.path = /flume/events/%y-%m-%d/%H%M/

a1.sinks.k1.hdfs.filePrefix = events-

a1.sinks.k1.hdfs.round = true

a1.sinks.k1.hdfs.roundValue = 10

a1.sinks.k1.hdfs.roundUnit = minute

a1.sinks.k1.hdfs.rollInterval = 3

a1.sinks.k1.hdfs.rollSize = 20

a1.sinks.k1.hdfs.rollCount = 5

a1.sinks.k1.hdfs.batchSize = 1

a1.sinks.k1.hdfs.useLocalTimeStamp = true

#生成的文件类型,默认是 Sequencefile,可用 DataStream,则为普通文本

a1.sinks.k1.hdfs.fileType = DataStream

# 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

 

capacity:默认该通道中最大的可以存储的 event 数量

trasactionCapacity:每次最大可以从 source 中拿到或者送到 sink 中的 event数量

 

    4.2 采集文件到hdfs:

比如业务系统使用 j log4j  生成的日志,日志内容不断增加,需要把追加到日志文件中的数据实时采集到

三大要素:

l 采集源,即 source——监控文件内容更新 : exec ‘tail -F file’

l 下沉目标,即 sink——HDFS 文件系统 : hdfs sink

l Source 和 sink 之间的传递通道——channel,可用 file channel 也可以用内存 channel

配置文件编写:

# Name the components on this agent

a1.sources = r1

a1.sinks = k1

a1.channels = c1

# Describe/configure the source

a1.sources.r1.type = exec

a1.sources.r1.command = tail -F /root/logs/test.log

a1.sources.r1.channels = c1

# Describe the sink

a1.sinks.k1.type = hdfs

a1.sinks.k1.hdfs.path = /flume/tailout/%y-%m-%d/%H%M/

a1.sinks.k1.hdfs.filePrefix = events-

a1.sinks.k1.hdfs.round = true

a1.sinks.k1.hdfs.roundValue = 10

a1.sinks.k1.hdfs.roundUnit = minute

a1.sinks.k1.hdfs.rollInterval = 3

a1.sinks.k1.hdfs.rollSize = 20

a1.sinks.k1.hdfs.rollCount = 5

a1.sinks.k1.hdfs.batchSize = 1

a1.sinks.k1.hdfs.useLocalTimeStamp = true

#生成的文件类型,默认是 Sequencefile,可用 DataStream,则为普通文本

a1.sinks.k1.hdfs.fileType = DataStream

# 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

 

 rollInterval

默认值:30

hdfs sink 间隔多长将临时文件滚动成最终目标文件,单位:秒;如果设置成 0,则表示不根据时间来滚动文件;注:滚动(roll)指的是,hdfs sink 将临时文件重命名成最终目标文件,并新打开一个临时文件来写入数据;

rollSize

默认值:1024当临时文件达到该大小(单位:bytes)时,滚动成目标文件;如果设置成 0,则表示不根据临时文件大小来滚动文件;

rollCount

默认值:10当 events 数据达到该数量时候,将临时文件滚动成目标文件;如果设置成 0,则表示不根据 events 数据来滚动文件;

round

默认值:false是否启用时间上的“舍弃”,这里的“舍弃”,类似于“四舍五入”。

roundValue

默认值:1时间上进行“舍弃”的值;

roundUnit

默认值:seconds时间上进行“舍弃”的单位,包含:second,minute,hour

示例:

a1.sinks.k1.hdfs.path = /flume/events/%y-%m-%d/%H%M/%S

a1.sinks.k1.hdfs.round = true

a1.sinks.k1.hdfs.roundValue = 10

a1.sinks.k1.hdfs.roundUnit = minute

当时间为 2015-10-16 17:38:59 时候,hdfs.path 依然会被解析为:/flume/events/20151016/17:30/00因为设置的是舍弃 10 分钟内的时间,因此,该目录每 10 分钟新生成一个。

5.Flume的load-balance

是flume的一种负载均衡机制,如下图

数据采集的时候为了满足数据采集的压力下采用例如上图的flume架构模式,并配置负载均衡机制如下:

a1.sinkgroups = g1

a1.sinkgroups.g1.sinks = k1 k2 k3

a1.sinkgroups.g1.processor.type = load_balance

a1.sinkgroups.g1.processor.backoff = true #如果开启,则将失败的 sink 放入黑名单

a1.sinkgroups.g1.processor.selector = round_robin # 另外还支持 random

a1.sinkgroups.g1.processor.selector.maxTimeOut=10000 #在黑名单放置的超时时间,超时结束时,若仍然无法接收,则超时时间呈指数增长

为了满足数据的完整性,距离hdfs越近的层级越先启动,上图配置的负载均衡模式是load_balance(轮循),顶级的agent会轮流向下一级agent发送数据。

6.Flume的failover

是flume的容错机制,它的架构和上面负载均衡一样,但是区别是负载均衡是下一级的三个agent都会消费上一级的数据。而容错是同一时间只有一个agent消费数据,当这一个agent发生问题出现故障的时候,下一个会启动并且消费数据,以此类推。注意:这种机制当agent出现问题的时候,会被放入一个类似于冷却池中,反省一下,当一定时间内,如果还不能修复,就会判定是失效的agent。通过优先级来排序,决定谁先消费数据,谁来代替出现故障agent。

a1.sinkgroups = g1

a1.sinkgroups.g1.sinks = k1 k2 k3

a1.sinkgroups.g1.processor.type = failover

a1.sinkgroups.g1.processor.priority.k1 = 5 #优先级值, 绝对值越大表示优先级越高

a1.sinkgroups.g1.processor.priority.k2 = 7

a1.sinkgroups.g1.processor.priority.k3 = 6

a1.sinkgroups.g1.processor.maxpenalty = 20000 #失败的 Sink 的最大回退期(millis)

7.Flume拦截器

Flume  有各种自带的拦截器,比如: TimestampInterceptor 、HostInterceptor 、r RegexExtractorInterceptor  等, 通过使用不同的拦截器,实现不同的功能。但是以上的这些拦截器,不能改变原有日志数据的内容或者对日志信息添加一定的处理逻辑,当一条日志信息有几十个甚至上百个字段的时候,在传统的 Flume 处理下,收集到的日志还是会有对应这么多的字段,也不能对你想要的字段进行对应的处理。

所以出现了自定义拦截器,自定义拦截器可以满足数据在应用层的处理,通过自定义Flume 拦截器,过滤掉不需要的字段,并对指定字段加密处理,将源数据进行预处理。减少了数据的传输量,降低了存储的开销。这里也是对数据的一种简单清洗。

自定义拦截器的实现步骤:核心是编写java代码,自定义拦截器编写flume配置文件

    7.1. 定义一个类 CustomParameterInterceptor 实现 Interceptor 接口。

    7.2. 在 CustomParameterInterceptor 类中定义变量,这些变量是需要到Flume 的配置文件中进行配置使用的。每一行字段间的分隔符(fields_separator)、通过分隔符分隔后,所需要列字段的下标(indexs)、多个下标使用的分隔符(indexs_separator)、多个下标使用的分隔符(indexs_separator)。

    7.3. 添加 CustomParameterInterceptor 的有参构造方法。并对相应的变量进行处理。将配置文件中传过来的 unicode 编码进行转换为字符串。

    7.4. 写具体的要处理的逻辑 intercept()方法,一个是单个处理的,一个是批量处理。

    7.5. 接口中定义了一个内部接口 Builder,在 configure 方法中,进行一些参数配置。并给出,在 flume 的 conf 中没配置一些参数时,给出其默认值。通过其 builder 方法,返回一个 CustomParameterInterceptor 对象。

    7.6. 定义一个静态类,类中封装 MD5 加密方法

    7.7. 通过以上步骤,自定义拦截器的代码开发已完成,然后打包成 jar, 放到Flume 的根目录下的 lib 中

猜你喜欢

转载自blog.csdn.net/jinyusheng_1991/article/details/82802142
今日推荐