您的位置:首页 > 运维架构

Flume的基本概念

2016-11-18 13:54 141 查看
一:Flume介绍
1.1、在hadoop生态圈中,Flume的位置。



1.2、Flume是什么?
    有Cloudera公司开源
    分布式、可靠、高可用的海量日志采集系统
    数据源可定制,可扩展。
    数据存储系统可定制,可扩展。
    中间件:屏蔽了数据源和数据存储系统的异构性。
1.3、Flume的两个版本?
    Flume OG
        OG:“Original Generation"
        0.9x或cdh3以及更早的版本。
        有agent、collector、master等组件构成。
    Flume NG
        NG:“Next/New Generation"    
        1.x或cdh4以及之后的版本。
        有Agent/client等组件构成。
          为什么要退出NG版本?
            精简代码
            架构简化
1.4、FlumeOG存在的问题
        Flume OG代码工程臃肿
        核心组件设计不合理
        核心配置不标准
        尤其是在Flume OG的最后一个发行版本0.94.0中,日志传输不稳定的现象尤为严重。
        Flume NG的特点
        NG只有一种角色的节点:代理节点(agent)
        没有collector,master节点。这是核心组件最核心的变化。
        去除了physical nodes,local nodes 的概念和相关内容。
        agent节点的组成也发生了变化,脱离了zookeeper。
1.5、Flume流程图





1.6、Flume架构中的几个核心概念
Event
    Event是Flume数据传输的基本单元。
    Flume以事件的形式将数据从源头传送到最终的目的。
    Event由可选的header和载有数据的一个byte array 构成。
        载有的数据度flume是不透明的。
        Header是容纳了key-value字符串对的无序集合,key在集合内是唯一的。
        Header可以在上下文路由中使用扩展
Client
    Client 是一个将原始log包装成events并且发送他们到一个或多个agent的实体
    目的是从数据源系统中解耦Flume
    在flume的拓扑结构中不是必须的。
    Client实例
        flume log4j Appender
        可以使用Client SDK(org.apache.flume.api)定制特定的Client
Agent
    一个Agent包含 source ,channel,sink 和其他组件。
    它利用这些组件将events从一个节点传输到另一个节点或最终目的地
    agent是flume流的基础部分。
    flume为这些组件提供了配置,声明周期管理,监控支持。
Agent之Source
    Source 负责接收event或通过特殊机制产生event,并将events批量的放到一个或多个Channel
    包含event驱动和轮询两种类型。
    不同类型的Source
        与系统集成的Source:Syslog,Netcat,监测目录池
        自动生成事件的Source:Exec
        用于Agent和Agent之间通信的IPC source:avro,thrift
    source 必须至少和一个channel关联
Agent之Channel
    Channel位于Source和Sink之间,用于缓存进来的event
    当sink成功的将event发送到下一个的channel或最终目的 event从channel删除
    不同的channel提供的持久化水平也是不一样的
        Memory channel :volatile (不稳定的)
        File Channel:基于WAL( 预写式日志Write-Ahead logging)实现
        JDBC channel :基于嵌入式database实现
    channel支持事务,提供较弱的顺序保证    
    可以和任何数量的source和sink工作
Agent之Sink
    Silk负责将event传输到吓一跳或最终目的地,成功后将event从channel移除
    不同类型的silk
        存储event到最终目的地终端sink,比如 HDFS,HBase
        自动消耗的sink 比如 null sink
        用于agent间通信的IPC:sink:Avro
        必须作用于一个确切的channel
Iterator
    作用于Source,按照预设的顺序在必要地方装饰和过滤events
channel selector
    允许Source基于预设的标准,从所有channel中,选择一个或者多个channel
sink processor
    多个sink 可以构成一个sink group 
    sink processor 可以通过组中所有sink实现负载均衡
    也可以在一个sink失败时转移到另一个



二:Flume架构
2.1、数据流
    Flume 的核心是把数据从数据源收集过来,再送到目的地。为了保证输送一定成功,在送到目的地之前,会先缓存数据,
待数据真正到达目的地后,删除自己缓存的数据
    Flume传输的数据的基本单位是Event,如果是文件,通常是一行记录,这也是事务的基本单位。Event从Source,流向Channel
,再到Sink,本身为一个byte数组,并可携带headers信息。Event代表着一个数据流的最小完整单元,从外部数据源过来,向外部的目的地去。
    Flume运行的核心是Agent.它是一个完整的数据收集工具,含有三个核心组件,分别是source,channel,sink。通过这些组件,Event可以从一个地方流向另一个地方。
2.2.1、核心组件之source
    Client端操作数据的来源,Flume支持Avro,log4j,syslog,和http(body为json格式)。可以让应用程序同 已有的source直接打交道,如AvroSource,SysconfigTcpSource.也可以写一个source,以IPC或RPC的方式自己接入自己的应用,Avro和Thrift都可以(分别有NettyAvroRpcClient 和 ThriftRpcClient实现了RpcClient接口),其中Avro是默认的RPC协议。具体代码级别的Client端数据接入,可以参考官方手册
    对现有程序改动最小的使用方式是直接读取程序原来记录的日志文件,基本可以实现无缝接入,不需要对现有的程序进行任何改动。对于直接读取文件Source 有两种方式:
    1,ExecSource:以运行Linux命令的方式,持续的输出最新的数据,如 tail -F 文件名 指令,在这种方式下,取得文件名必须是指定的。ExecSource可以实现对日志的实时收集,但是存在Flume不运行或者指令执行出错时,将无法保证日志数据的完整性
    2,SpoolSource:检测配置的目录下新增的文件,并将文件中的数据读取出来。需要注意两点:拷贝到spool目录下的文件不可以再打开编辑;spool目录下不可包含相应的子目录
    SpoolSource虽然无法实现实时的收集数据,但是可以使用以分钟的方式分割文件,趋于实时。
    如果应用无法实现以分钟切割日志文件的话,可以两种收集方式结合使用。在实际使用的过程中,可以结合log4j使用,使用log4j的文件分割机制设为1分钟一次,将文件拷贝到spool的监控目录
     log4j有一个TimeRolling的插件,可以把log4j分割文件到spool目录。基本实现了实时的监控。Flume在传完文件之后,将会修改文件的后缀,变为.COMPLETED
Flume Source 支持的类型



2.2.2、核心组件之Channel

    当前有几个channel可供选择,分别是Memory Channel,JDBC Channel,File Channel,
Psuedo Transaction Channel。比较常见的是前三种。

    MemoryChannel:可以实现高速的吞入,但是无法保证数据的完整性

    MemoryRecoverChannel:在官方文档的件以上已经建议使用FileChannel来替换

    FileChannel:保证数据的完整性与一致性。再具体配置FileChannel时,建议FileChannel设置的目录和程序日志文件保存的目录设成不同的磁盘,以便提高效率。

File Channel是一个持久化的隧道(Channel),它持久化所有的事件,并将其存储到磁盘中。因此,即使Java虚拟机当掉,或者操作系统崩溃或重启,再或者事件没有在管道中成功的传递到下一个代理(agent),这一切都不会造成数据的丢失。Memory Channel是一个不稳定的隧道,其原因是由于它在内存中存储所有的事件,如果Java进程死掉,任何存储在内存中的数据将会丢失。另外,内存空间受到RAM大小的限制,而File
Channel这方面是它的优势,只要磁盘空间足够大,他就可以将所有事件存储到磁盘。
Flume Channel 支持的类型:



2.2.3、核心组件之Sink
    Sink在设置存储数据时,可以向文件系统,数据库,hadoop存储据,在日志数据较少时,可以将数据存储在文件中,并且设定一定的时间间隔保存数据。在日志数据较多时,可以将相应的数据存储到Hadoop中,便于日后进行相应的数据分析。
    Flume Sink支持的类型



2.3、可靠性
    Flume的核心是吧数据源收集起来,再送到目的地。为了保证输送一定成功,再送到目的地之前,会先缓存数据,带数据真正到达目的地后再删除缓存的数据
    Flume使用事务性的方式保证传送Event整个过程的可靠性。Sink必须在Event被存入Channel后,或者,已经被传达到下一站agent里,又或者,已经被存入外部数据目的地之后,才能把Event从Channel中remove掉。这样数据流里的event无论是在一个agent里还是多个agent之间流转,都能保证可靠,因为以上的事务保证了event成功存储起来。而Channel的多种实现可恢复性上有不同的保证。也保证了event不同程度的可靠性。比如Flume支持在本地保存一份channel作为备份,而memory
channel 将event存在内存queue里,速度快,但丢失的话无法恢复
2.4、配置实例



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息