Flume原理讲解【小二讲堂】

一、flume:日志收集系统

日志收集工具,Flume是Cloudera提供的一个高可靠的、高可用的,分布式的海量日志采集、聚合和传输的系统,Flume支持在日志系统中定制各类的数据发送方,用于收集数据;同时,Flume提供的数据可以做简单的处理,并写到各种接收方的能力。
flume的数据流式有时间(Event)贯穿始终,时间是Flume的基本数据单位,它携带日志数据(字节数组形式)并且携带有头信息,这些Evenet是由Agent外部的source生成,当source捕获事件后会进行特定的格式化,然后Source随着时间推入(单个或多个)Channel中,可以将Channel看做是一个缓冲数组,它将保存时间直到sink处理完该事件,
Sink是负责将持久化日志或者事件推向另一个source.

1.FLume架构

在这里插入图片描述

  • Client:Client生产数据,运行在一个独立的线程。
    Event: 一个数据单元,消息头和消息体组成。(Events可以是日志记录、 avro 对象等。)
  • Flow: Event从源点到达目的点的迁移的抽象。
  • Agent:一个独立的Flume进程,包含组件Source、 Channel、 Sink。(Agent使用JVM 运行Flume。每台机器运行一个agent,但是可以在一个agent中包含多个sources和sinks。)
  • source:从数据库发生器接收数据,并将接收的数据以Flume的event格式传递给一个或者多个通道channel,Flume提供多种数据的接收方式,比如:avro,Thrift,twitter等。
  • Channel:channel是一种短暂的储存容器,他将从source处接收到的event格式的数据缓存起来,直到被sink消费掉。这样channel可以看成是source和sink之间数据传递的桥梁或者管道,channel是一个完整的事务,这样就保证了数据在传递过程中的一致性。并且还可以和任意的source和sink连接。例如:JDBCchannel,FileSystem channel.
  • Sink:sink将数据储存到集中储存器中,比如hdfs,hbase,或者sink还可以将数据继续发送给下一个sink。

2.Flume特性:

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

3.角色功能详解

(1)Agent:flume运行的核心就是agent,agent是flume的最小运行单元。一个agent就是一个jvm,它是一个完整的数据收集工具,包含三个核心组件(source、channel、sink),通过这些组件event可以松一个地方流向另一个地方。
在这里插入图片描述
(2)source:source是数据的收集端,负责将数据收集后进行特殊格式化,将数据封装在event事件中,然后将时间推入channel中,Flume提供了很多内置的source,比如avro,log4j等。
在这里插入图片描述

  • Spool Source 如何使用?
      在实际使用的过程中,可以结合log4j使用,使用log4j的时候,将log4j的文件分割机制设为1分钟一次,将文件拷贝到spool的监控目录。
       log4j有一个TimeRolling的插件,可以把log4j分割的文件到spool目录。基本实现了实时的监控。 Flume在传完文件之后,将会修改文件的后缀,变为.COMPLETED(后缀也可以在配置文件中灵活指定)
      Exec Source 和Spool Source 比较
      1)ExecSource可以实现对日志的实时收集,但是存在Flume不运行或者指令执行出错时,将无法收集到日志数据,无法何证日志数据的完整性。
      2)SpoolSource虽然无法实现实时的收集数据,但是可以使用以分钟的方式分割文件,趋近于实时。
      3)总结:如果应用无法实现以分钟切割日志文件的话,可以两种 收集方式结合使用。
    Source类型:
    在这里插入图片描述
    (3)Channel:是连接source和sink的组件,可以将他看成是一个缓冲区或者数据队列,channel可以将数据放在缓存中也可以持久化到磁盘上,直到sink处理完该事件。常见的channel有:MemoryChannel和FileChannel。
    在这里插入图片描述
    (4)sink:sink负责从channel中获取数据并处理,sink可以将数据进行储存到hdfs,也可以储存到数据块,文件系统、下一个连接的sink需要数据时,也可以发送给下一个sink.在日志数据较少时,可以将日志数据保存在文件系统中,并且可以设置一定的时间间隔保存数据。
    在这里插入图片描述
    Sink类型:
    在这里插入图片描述
    (5)Flume拦截器
    当我们需要对数据进行过滤时,除了我们在source、channel、sink中进行修改代码外,flume也提供了自身的拦截器,拦截器也是chain形式的。拦截器的位置在source和channel之间,当我们为source指定拦截器后,我们会得到被拦截到的event,根据需求可以对event进行数据处理,抛弃还是保留,抛弃的数据不会进入到chanel中。
    在这里插入图片描述
    (6)flume数据流
    a.flume的核心就是将数据收集过来,然后发送到目的地,为保证传输过程的成功,flume会将发送的数据进行缓存一份,当数据发送到达目的地后再删除缓存的数据。如果发送失败flume可以将缓存的数据再进行发送一次。
    b.flume传输的基本单位是event,如果是文本文件,常常是一行记录,这也是事务的基本单位。event本身是以一个字节数组,可携带header信息,Event代表数据流的最小完整单元。
    c.flume提供了大量的内置的source、channel、sink,不同类型的source、channel、sink可以随机组合,组合方式基于用户的配置信息。比如:Channel可以把事件暂存在内存里,也可以持久化到本地硬盘上。Sink可以把日志写入HDFS, HBase,甚至是另外一个Source等等。Flume支持用户建立多级流,
      也就是说,多个agent可以协同工作,并且支持Fan-in、Fan-out、Contextual Routing、Backup Routes,这也正是Flume强大之处。如下图所示:
      在这里插入图片描述
      (7)flume的可靠性:Flume 使用事务性的方式保证传送Event整个过程的可靠性。 Sink 必须在Event 被存入 Channel 后,或者,已经被传达到下一站agent里,又或者,已经被存入外部数据目的地之后,才能把 Event 从 Channel 中 remove 掉。这样数据流里的 event 无论是在一个 agent 里还是多个 agent 之间流转,都能保证可靠,因为以上的事务保证了 event 会被成功存储起来。比如 Flume支持在本地保存一份文件 channel 作为备份,而memory channel 将event存在内存 queue 里,速度快,但丢失的话无法恢复。

二、面试总结

  • 1 你是如何实现Flume数据传输的监控的
    使用第三方框架Ganglia实时监控Flume。
  • 2 Flume的Source,Sink,Channel的作用?你们Source是什么类型?
    1、作用 (1)Source组件是专门用来收集数据的,可以处理各种类型、各种格式的日志数据,包括avro、thrift、exec、jms、spooling directory、netcat、sequence generator、syslog、http、legacy (2)Channel组件对采集到的数据进行缓存,可以存放在Memory或File中。 (3)Sink组件是用于把数据发送到目的地的组件,目的地包括Hdfs、Logger、avro、thrift、ipc、file、Hbase、solr、自定义。
  • 2、我公司采用的Source类型为: (1)监控后台日志:exec (2)监控后台产生日志的端口:netcat
    3 Flume 的 Channel Selectors
    在这里插入图片描述

三、Flume面试总结

1.flume参数调优

1).增加source的个数(使用Tair Dir source 可增加FileGroup的个数),可增大Source的读取数据的能力。例如当一个目录中的文件过多需要将这些将这个目录拆分成多个文件目录,同时配置好多个sorce以保证source有足够的能了获取到新产生的数据。batchsieze参数决定source一次批量运输到channel中的event条数,适当增大这两个参数可以从一定程度上提高Source搬运event到channel的性能。
2).Channel Type选择memory时channel的性能最好,但是Flume进程意外挂掉,可能会丢失数据。Type选择File时channel的容错性更好。但是性能上会比memory channel差,使用file channel时,将datadirs下配置多个不同下的目录,可以适当提高file channle的性能。
Capacity参数决定了channl可容纳最大的event条数。transactionCapacity参数决定每次Source往channel里面写的最大event条数和每次sink从channel里面读取的最大event条数 transactionCapacity需要大于source和batchSize参数。
3).增加sink的个数可以增加sink的消费能力,Sink也不是越多越好,够用就行。过多的sink会占用系统资源,造成系统资源的不必要浪费。batchSize决定了sink从channel中一次读取的条数,适当增加增大这个参数可以提高sink从channel中读取数据的性能。

2.Flume的事务机制

Flume的事务机制类似于数据库的事务机制。
Flume使用两个独立的事务分别负责从Source到channel(put),以及Channel到sink的事件传递(take)。
比如spooling directory source 为文件的每一行创建一个时间,一旦事务中的所有事件全部传递到channel并且提交成功,那么source景该文件标记为完成。同理,事务以类似的方式处理从channel到sink的传递过程。如果由于某种原因导致事件无法记录,那么事务将会回滚。且所有的时间都会保持到channel中,等待重新传递。
4.flume采集数据会丢失吗?
不会,Channel存储可以存储在File中,数据传输自身有事务。

小二讲堂:https://blog.csdn.net/Mirror_w

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值