Flume

Flume
    概述:
        Flume最早是Cloudera提供的日志收集系统,后贡献给Apache。所以目前是Apache下的项目,Flume支持在日志系统中定制各类数据发送方,用于收集数据。
        海量日志采集、聚合和传输的系统,支持在日志系统中定制各类数据发送方,用于收集数据(source);同时,Flume提供对数据进行简单处理,并写到各种数据接受方(可定制)的能力(sink)。
    特点
        高可用
        高可靠
            事务型的数据传递,保证数据的可靠性
            一个日志交给flume来处理,不会出现此日志丢失或未被处理的情况。
        鲁棒性(robust 健壮性)
        分布式
        可恢复性
            通道可以以内存或文件的方式实现,内存更快,但不可恢复。文件较慢但提供了可恢复性。
    版本
        Flume 0.9X版本的统称Flume-og
            此版本的flume需要引入zookeeper集群管理,性能也较低(单线程工作)。
        Flume1.X版本的统称Flume-ng。
            新版本需要引入zookeerper。
            由于Flume-ng经过重大重构,与Flume-og有很大不同,使用时请注意区分。
    系统要求
        jdk1.6以上。推荐1.7或1.8
    总体架构
        Flume

 


        flume是分布式的日志收集系统,它将各个服务器中的数据收集起来并送到指定的地方去,比如说送到图中的HDFS,简单来说flume就是收集日志的。
    Event事件
        为了保证输送的过程一定成功,在送到目的地(sink)之前,会先缓存数据(channel),待数据真正到达目的地(sink)后,flume在删除自己缓存的数据。
        event将传输的数据进行封装,是flume传输数据的基本单位
        event也是事务的基本单位本身为一个字节数组,并可携带headers(头信息)信息。
        event代表着一个数据的最小完整单元,从外部数据源来,向外部的目的地去。
        一个完整的event包括:event headers、event body、event信息(即文本文件中的单行记录)
    运行机制
        flume运行的核心就是agent,agent本身是一个Java进程
        agent里面包含3个核心的组件:source—->channel—–>sink,类似生产者、仓库、消费者的架构
        source:source组件是专门用来收集数据的,可以处理各种类型、各种格式的日志数据,包括avro、thrift、exec、jms、spooling directory、netcat、sequence generator、syslog、http、legacy、自定义。
        channel:source组件把数据收集来以后,临时存放在channel中,即channel组件在agent中是专门用来存放临时数据的——对采集到的数据进行简单的缓存可以存放在memory、jdbc、file等等
        sink:sink组件是用于把数据发送到目的地的组件,目的地包括hdfs、logger、avro、thrift、ipc、file、null、hbase、solr、自定义。
    完整流程
        Flume

 


        source不断的接收数据,将数据封装成一个一个的event,然后将event发送给channel,chanel作为一个缓冲区会临时存放这些event数据,随后sink会将channel中的event数据发送到指定的地方—-例如HDFS等。
    用法
        flume可以支持多级flume的agent,即flume可以前后相继形成多级的复杂流动,例如sink可以将数据写到下一个agent的source中,这样的话就可以连成串了,可以整体处理了。
        扇入(fan-in)数据流合并
            扇入就是source可以接受多个输入
        扇出(fan-out)数据流复用
            所谓扇出就是sink可以将数据输出多个目的地中。
        写法
            #配置Agent a1 的组件
            a1.sources=r1
            a1.channels=c1  (可以配置多个,以空格隔开,名字自己定)
            a1.sinks=s1  (可以配置多个,以空格隔开,名字自己定)
            #描述/配置a1的r1
            a1.sources.r1.type=netcat  (netcat表示通过指定端口来访问)
            a1.sources.r1.bind=0.0.0.0  (表示本机)
            a1.sources.r1.port=44444  (指定的端口,此端口不固定,但是不要起冲突)
            #描述a1的s1
            a1.sinks.s1.type=logger    (表示数据汇聚点的类型是logger日志)
            #描述a1的c1
            a1.channels.c1.type=memory
            a1.channels.c1.capacity=1000
            a1.channels.c1.transactionCapacity=100
            #位channel 绑定 source和sink
            a1.sources.r1.channels=c1  (一个source是可以对应多个通道的)
            a1.sinks.s1.channel=c1  (一个sink,只能对应一个通道)
        特殊组件
            Selector
                复制模式
                    选择器可以工作在复制、多路复用(路由) 模式下    Selector 默认是复制模式(replicating),即把source复制,然后分发给多个sink
                多路复用模式
                    在这种模式下,用户可以指定转发的规则。selector根据规则进行数据的分发
            Interceptors
                概述
                    Flume有能力在运行阶段修改/删除Event,这是通过拦截器(Interceptors)来实现的。
                    拦截器需要实现org.apache.flume.interceptor.Interceptor接口。
                    拦截器可以修改或删除事件基于开发者在选择器中选择的任何条件。
                    拦截器采用了责任链模式,多个拦截器可以按指定顺序拦截。
                    一个拦截器返回的事件列表被传递给链中的下一个拦截器。
                    如果一个拦截器需要删除事件,它只需要在返回的事件集中不包含要删除的事件即可。
                    如果要删除所有事件,只需返回一个空列表。
                Timestamp Interceptor
                    这个拦截器在事件头中插入以毫秒为单位的当前处理时间。头的名字为timestamp,值为当前处理的时间戳。如果在之前已经有这个时间戳,则保留原有的时间戳。
                Host Interceptor
                    这个拦截器插入当前处理Agent的主机名或ip,头的名字为host或配置的名称值是主机名或ip地址,基于配置。
                Static Interceptor
                    此拦截器允许用户增加静态头信息使用静态的值到所有事件。目前的实现中不允许一次指定多个头。如果需要增加多个静态头可以指定多个Static interceptors
                UUID Interceptor
                    这个拦截器在所有事件头中增加一个全局一致性标志。
                Search and Replace Interceptor
                    这个拦截器提供了简单的基于字符串的正则搜索和替换功能
                Regex Filtering Interceptor
                    此拦截器通过解析事件体去匹配给定正则表达式来筛选事件。所提供的正则表达式即可以用来包含或刨除事件。
                Regex Extractor Interceptor
                    使用指定正则表达式匹配事件,并将匹配到的组作为头加入到事件中。它也支持插件化的序列化器用来格式化匹配到的组在加入他们作为头之前
            Process
                概述
                    Sink Group允许用户将多个Sink组合成一个实体。
                    Flume Sink Processor 可以通过切换组内Sink用来实现负载均衡的效果,或在一个Sink故障时切换到另一个Sin
                格式要求
                    sinks    –    用空格分隔的Sink集合
                    processor.type    default    类型名称,必须是 default、failover 或 load_balance
                Default Sink Processor
                    Default Sink Processor 只接受一个 Sink。这是默认的策略。即如果不配置Processor,用的是这个策略。
                Failover Sink Processor
                    Failover Sink Processor 维护一个sink们的优先表。确保只要一个是可用的就事件就可以被处理。
                    失败处理原理是,为失效的sink指定一个冷却时间,在冷却时间到达后再重新使用。
                    sink们可以被配置一个优先级,数字越大优先级越高。
                    如果sink发送事件失败,则下一个最高优先级的sink将会尝试接着发送事件。
                    如果没有指定优先级,则优先级顺序取决于sink们的配置顺序,先配置的默认优先级高于后配置的。
                    在配置的过程中,设置一个group processor ,并且为每个sink都指定一个优先级。
                    优先级必须是唯一的。
                    另外可以设置maxpenalty属性指定限定失败时间。
                Load balancing Sink Processor
                    Load balancing Sink processor 提供了在多个sink之间实现负载均衡的能力。
                    它维护了一个活动sink的索引列表。
                    它支持轮询 或 随机方式的负载均衡,默认值是轮询方式,可以通过配置指定。
                    也可以通过实现AbstractSinkSelector接口实现自定义的选择机制。
    事务机制
        概述
            Flume的事务机制与可靠性保证的实现,最核心的组件是Channel(通道)。如果没有Channel组件,而紧靠Source与Sink组件是无从谈起的。
        文件通道(File Channel)
            文件通道指的是将事件存储到代理(Agent)本地文件系统中的通道。虽然要比内存通道慢一些,不过它却提供了持久化的存储路径,可以应对大多数情况,它应该用在数据流中不允许出现缺口的场合。
        内存通道
            File channel虽然提供了持久化,但是其性能较差,吞吐量会受到一定的限制。
            memory channel则牺牲可靠性换取吞吐量
            如果机器断电重启,则无法恢复
            大多数企业都是选择内存通道,因为在通过flume收集海量数据场景下,使用FileChannel所带来的性能下降是很大的甚至是无法忍受的。
            Flume内存通道事务机制
                编程模型图

Flume

 


                Put事务流程
                    Put事务可以分为以下阶段:
                    doPut:将批数据先写入临时缓冲区putList(Linkedblockingdequeue)
                    doCommit:检查channel内存队列是否足够合并。
                    doRollback:channel内存队列空间不足,回滚,等待内存通道的容量满足合并
                    putList就是一个临时的缓冲区,数据会先put到putList,最后由commit方法会检查channel是否有足够的缓冲区,有则合并到channel的队列。
                Take事务
                    Take事务分为以下阶段:
                    doTake:先将数据取到临时缓冲区takeList(linkedBlockingDequeue)
                    将数据发送到下一个节点
                    doCommit:如果数据全部发送成功,则清除临时缓冲区takeList
                    doRollback:数据发送过程中如果出现异常,rollback将临时缓冲区takeList中的数据归还给channel内存队列。
                    编程模型图

Flume

 

上一篇:无线传感网中常见路由协议2


下一篇:Flume 组件介绍