大数据系列之日志采集Flume(二)Flume的Source到Channel工作流程,Source、Channel、Sink的配置

1.Source到Channel工作流程

如上图所示,Source端接受数据(比如日志信息),并且将数据转换成事件作为传输的基本单位,然后通过ChannelProcessor进入一系列的拦截器interceptor(i1,i2,i3....),此处的拦截器功能如同SpringMVC的拦截器,进行预处理,例如添加头信息(比如选择哪个管道Channel)等信息,经过了一系列拦截器处理之后,ChannelProcessor通过ChannelSelector来选择Channel(c1,c2,c3等等),这样,事件就被暂存到了Channel中等待Sink的调用。注意,Source可以连通多个Channel。而Sink只能连接一个Channel。

2.Source、Channel、Sink的配置

我们先通过一个简单的Hello World来看一下Flume的简单工作过程已经配置,后面Source、Channel、Sink的配置都采用如下框架。

运行Flume的流程:

1.创建配置文件
    [/soft/flume/conf/hello.conf]
    #声明三种组件
    a1.sources = r1
    a1.channels = c1
    a1.sinks = k1

    #定义source信息
    a1.sources.r1.type=netcat(Source假设是netcat)
    a1.sources.r1.bind=localhost
    a1.sources.r1.port=8888

    #定义sink信息
    a1.sinks.k1.type=logger

    #定义channel信息
    a1.channels.c1.type=memory

    #绑定在一起
    a1.sources.r1.channels=c1
    a1.sinks.k1.channel=c1

    2.运行
        a)启动flume agent
            $>bin/flume-ng agent -f ../conf/helloworld.conf -n a1 -Dflume.root.logger=INFO,console(控制台输出,如果不是控制台输出可以省略掉)
        b)启动nc的客户端
            $>nc localhost 8888
            $nc>hello world
        
        c)在flume的终端输出hello world.

flume source
-------------------
    1.netcat
        nc ..

    2.exec
        实时日志收集,实时收集日志。
        a1.sources = r1
        a1.sinks = k1
        a1.channels = c1

        a1.sources.r1.type=exec
        a1.sources.r1.command=tail -F /home/centos/test.txt

        a1.sinks.k1.type=logger

        a1.channels.c1.type=memory

        a1.sources.r1.channels=c1
        a1.sinks.k1.channel=c1

    3.批量收集
        监控一个文件夹,静态文件。
        收集完之后,会重命名文件成新文件。.compeleted.
        a)配置文件
            [spooldir_r.conf]
            a1.sources = r1
            a1.channels = c1
            a1.sinks = k1

            a1.sources.r1.type=spooldir
            a1.sources.r1.spoolDir=/home/centos/spool
            a1.sources.r1.fileHeader=true

            a1.sinks.k1.type=logger

            a1.channels.c1.type=memory

            a1.sources.r1.channels=c1
            a1.sinks.k1.channel=c1

        b)创建目录
            $>mkdir ~/spool

        c)启动flume
            $>bin/flume-ng agent -f ../conf/helloworld.conf -n a1 -Dflume.root.logger=INFO,console
    
    4.序列source
        [seq]
        a1.sources = r1
        a1.channels = c1
        a1.sinks = k1

        a1.sources.r1.type=seq
        a1.sources.r1.totalEvents=1000

        a1.sinks.k1.type=logger

        a1.channels.c1.type=memory

        a1.sources.r1.channels=c1
        a1.sinks.k1.channel=c1

        [运行]
        $>bin/flume-ng agent -f ../conf/helloworld.conf -n a1 -Dflume.root.logger=INFO,console

    5.StressSource
        a1.sources = stresssource-1
        a1.channels = memoryChannel-1
        a1.sources.stresssource-1.type = org.apache.flume.source.StressSource
        a1.sources.stresssource-1.size = 10240
        a1.sources.stresssource-1.maxTotalEvents = 1000000
        a1.sources.stresssource-1.channels = memoryChannel-1


flume sink
------------------
    1.hdfs
        a1.sources = r1
        a1.channels = c1
        a1.sinks = k1

        a1.sources.r1.type = netcat
        a1.sources.r1.bind = localhost
        a1.sources.r1.port = 8888

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

        #是否是产生新目录,每十分钟产生一个新目录,一般控制的目录方面。
        #2017-12-12 -->
        #2017-12-12 -->%H%M%S

        a1.sinks.k1.hdfs.round = true            
        a1.sinks.k1.hdfs.roundValue = 10
        a1.sinks.k1.hdfs.roundUnit = second
        
        a1.sinks.k1.hdfs.useLocalTimeStamp=true

        #是否产生新文件。
        a1.sinks.k1.hdfs.rollInterval=10
        a1.sinks.k1.hdfs.rollSize=10
        a1.sinks.k1.hdfs.rollCount=3

        a1.channels.c1.type=memory

        a1.sources.r1.channels = c1
        a1.sinks.k1.channel = c1

    2.hive
        略

    3.hbase
        a1.sources = r1
        a1.channels = c1
        a1.sinks = k1

        a1.sources.r1.type = netcat
        a1.sources.r1.bind = localhost
        a1.sources.r1.port = 8888

        a1.sinks.k1.type = hbase
        a1.sinks.k1.table = ns1:t12
        a1.sinks.k1.columnFamily = f1
        a1.sinks.k1.serializer = org.apache.flume.sink.hbase.RegexHbaseEventSerializer

        a1.channels.c1.type=memory

        a1.sources.r1.channels = c1
        a1.sinks.k1.channel = c1

    4.kafka(后面再说)


使用avroSource和AvroSink实现跃点agent处理
-----------------

所谓跃点就是一个Agent的Sink输出作为下一个Agent的Source输入源(r,c,k分别代表Source,Channel,Sink)。试想一种情形,如果有好多的小文件同时在向hdfs上写出,是不是负载,资源的浪费比较大,是不是不如将这些小文件全部归结在一起再输出来的好。


    1.创建配置文件
        [avro_hop.conf]
        #a1
        a1.sources = r1
        a1.sinks= k1
        a1.channels = c1

        a1.sources.r1.type=netcat
        a1.sources.r1.bind=localhost
        a1.sources.r1.port=8888

        a1.sinks.k1.type = avro
        a1.sinks.k1.hostname=localhost
        a1.sinks.k1.port=9999

        a1.channels.c1.type=memory

        a1.sources.r1.channels = c1
        a1.sinks.k1.channel = c1

        #a2
        a2.sources = r2
        a2.sinks= k2
        a2.channels = c2

        a2.sources.r2.type=avro
        a2.sources.r2.bind=localhost
        a2.sources.r2.port=9999

        a2.sinks.k2.type = logger

        a2.channels.c2.type=memory

        a2.sources.r2.channels = c2
        a2.sinks.k2.channel = c2

    2.启动a2
        $>flume-ng agent -f /soft/flume/conf/avro_hop.conf -n a2 -Dflume.root.logger=INFO,console

    3.验证a2
        $>netstat -anop | grep 9999
        
    
    4.启动a1
        $>flume-ng agent -f /soft/flume/conf/avro_hop.conf -n a1
        
    5.验证a1
        $>netstat -anop | grep 8888
    

channel
-----------------
    1.MemoryChannel
        略
    2.FileChannel
a1.sources = r1
a1.sinks= k1
a1.channels = c1

a1.sources.r1.type=netcat
a1.sources.r1.bind=localhost
a1.sources.r1.port=8888

a1.sinks.k1.type=logger

        a1.channels.c1.type = file
        a1.channels.c1.checkpointDir = /home/centos/flume/fc_check
        a1.channels.c1.dataDirs = /home/centos/flume/fc_data

a1.sources.r1.channels=c1
a1.sinks.k1.channel=c1


可溢出文件通道
------------------
a1.channels = c1
a1.channels.c1.type = SPILLABLEMEMORY
#0表示禁用内存通道,等价于文件通道
a1.channels.c1.memoryCapacity = 0
#0,禁用文件通道,等价内存通道。
a1.channels.c1.overflowCapacity = 2000

a1.channels.c1.byteCapacity = 800000
a1.channels.c1.checkpointDir = /user/centos/flume/fc_check
a1.channels.c1.dataDirs = /user/centos/flume/fc_data、

Flume官网:

http://flume.apache.org/

猜你喜欢

转载自blog.csdn.net/u011444062/article/details/81196868