• CentOS7搭建Flume与Kafka整合及基础操作与测试


    前提

    已完成Kafka的搭建,具体步骤参照CentOS7搭建Kafka单机环境及基础操作

    Flume安装

    下载
    wget http://mirrors.tuna.tsinghua.edu.cn/apache/flume/1.6.0/apache-flume-1.6.0-bin.tar.gz
    解压
    tar -zxvf apache-flume-1.6.0-bin.tar.gz
    移动文件夹
    mv apache-flume-1.6.0-bin /usr/local/hadoop/
    配置
    cd /usr/local/hadoop/apache-flume-1.6.0-bin/conf
    vim flume.conf
    agent1.sources=r1
    agent1.channels=c1
    agent1.sinks=k1
    
    agent1.sources.r1.type=exec
    agent1.sources.r1.command=tail -F /usr/words.txt
    agent1.sources.r1.channels=c1
    
    agent1.channels.c1.type=memory
    agent1.channels.c1.capacity=10000
    agent1.channels.c1.transactionCapacity=100
    
    agent1.sinks.k1.type=org.apache.flume.sink.kafka.KafkaSink
    agent1.sinks.k1.topic=test
    agent1.sinks.k1.brokerList=192.168.174.200:9092
    agent1.sinks.k1.requiredAcks=1
    agent1.sinks.k1.batchSize=20
    agent1.sinks.k1.channel=c1
    其中192.168.174.200:9092为kafka监听,test为主题
    启动
    bin/flume-ng agent --conf conf --conf-file conf/flume.conf --name agent1 -Dflume.root.logger=INFO,console

    注意:--name agent1与flume.conf中的agent1一致

    利用python动态生成words.txt中的内容
    #!/usr/bin/python
    # -*- coding: UTF-8 -*-
    import time 
    import random
    # 打开一个文件
    for num in range(1,2000):
        time.sleep(3)
        fo = open("/usr/words.txt", "a+")
        a = random.randint(1, 254)
        if a >= 200:
            fo.write( "out"+'
    ')
        else:
            fo.write( "join"+'
    ')   
        # 关闭打开的文件
        fo.close()

    启动kafka的consumer对数据进行监听
    ./kafka-console-consumer.sh --zookeeper 192.168.174.200:2181,192.168.174.201:2181 --topic test

    概念与名词解释

    1.source 
    flume提供多种source供用户进行选择,尽可能多的满足大部分日志采集的需求,常用的source的类型包括avro、exec、netcat、spooling-directory和syslog等。具体的使用范围和配置方法详见source. 

    2.channel 
    flume中的channel不如source和sink那么重要,但却是不可忽视的组成部分。常用的channel为memory-channel,同时也有其他类型的channel,如JDBC、file-channel、custom-channel等,详情见channel. 

    3.sink 
    flume的sink也有很多种,常用的包括avro、logger、HDFS、hbase以及file-roll等,除此之外还有其他类型的sink,如thrift、IRC、custom等。具体的使用范围和使用方法详见sink. 

    Flume处理日志 
    Flume不止可以采集日志,还可以对日志进行简单的处理,在source处可以通过interceptor对日志正文处的重要内容进行过滤提取,在channel处可以通过header进行分类,将不同类型的日志投入不同的通道中,在sink处可以通过正则序列化来将正文内容进行进一步的过滤和分类。 

    Flume Source Interceptors
     
    Flume可以通过interceptor将重要信息提取出来并且加入到header中,常用的interceptor有时间戳、主机名和UUID等,用户也可以根据个人需求编写正则过滤器,将某些特定格式的日志内容过滤出来,以满足特殊需求。 

    Flume Channel Selectors 
    Flume可以根据需求将不同的日志传输进不同的channel,具体方式有两种:复制和多路传输。复制就是不对日志进行分组,而是将所有日志都传输到每个通道中,对所有通道不做区别对待;多路传输就是根据指定的header将日志进行分类,根据分类规则将不同的日志投入到不同的channel中,从而将日志进行人为的初步分类。 

    Flume Sink Processors 
    Flume在sink处也可以对日志进行处理,常见的sink处理器包括custom、failover、load balancing和default等,和interceptor一样,用户也可以根据特殊需求使用正则过滤处理器,将日志内容过滤出来,但和interceptor不同的是在sink处使用正则序列化过滤出的内容不会加入到header中,从而不会使日志的header显得过于臃肿。 

    附录 

    常见的source 

    avro source 
    avro可以监听和收集指定端口的日志,使用avro的source需要说明被监听的主机ip和端口号,下面给出一个具体的例子: 
    1. a1.sources = r1  
    2.   
    3. a1.channels = c1  
    4.   
    5. a1.sources.r1.type = avro  
    6.   
    7. a1.sources.r1.channels = c1  
    8.   
    9. a1.sources.r1.bind = 0.0.0.0  
    10.   
    11. a1.sources.r1.port = 4141  
    exec source 
    exec可以通过指定的操作对日志进行读取,使用exec时需要指定shell命令,对日志进行读取,下面给出一个具体的例子: 
    1. a1.sources = r1  
    2.   
    3. a1.channels = c1  
    4.   
    5. a1.sources.r1.type = exec  
    6.   
    7. a1.sources.r1.command = tail -F /var/log/secure  
    8.   
    9. a1.sources.r1.channels = c1  
    spooling-directory source 
    spo_dir可以读取文件夹里的日志,使用时指定一个文件夹,可以读取该文件夹中的所有文件,需要注意的是该文件夹中的文件在读取过程中不能修改,同时文件名也不能修改。下面给出一个具体的例子: 
    1. agent-1.channels = ch-1  
    2.   
    3. agent-1.sources = src-1  
    4.   
    5.    
    6.   
    7. agent-1.sources.src-1.type = spooldir  
    8.   
    9. agent-1.sources.src-1.channels = ch-1  
    10.   
    11. agent-1.sources.src-1.spoolDir = /var/log/apache/flumeSpool  
    12.   
    13. agent-1.sources.src-1.fileHeader = true  
    syslog source 
    syslog可以通过syslog协议读取系统日志,分为tcp和udp两种,使用时需指定ip和端口,下面给出一个udp的例子: 
    1. a1.sources = r1  
    2.   
    3. a1.channels = c1  
    4.   
    5. a1.sources.r1.type = syslogudp  
    6.   
    7. a1.sources.r1.port = 5140  
    8.   
    9. a1.sources.r1.host = localhost  
    10.   
    11. a1.sources.r1.channels = c1  

    常见的channel 

    Flume的channel种类并不多,最常用的是memory channel,下面给出例子: 
    1. a1.channels = c1  
    2.   
    3. a1.channels.c1.type = memory  
    4.   
    5. a1.channels.c1.capacity = 10000  
    6.   
    7. a1.channels.c1.transactionCapacity = 10000  
    8.   
    9. a1.channels.c1.byteCapacityBufferPercentage = 20  
    10.   
    11. a1.channels.c1.byteCapacity = 800000  

    常见的sink 

    logger sink 
    logger顾名思义,就是将收集到的日志写到flume的log中,是个十分简单但非常实用的sink 
    avro sink 
    avro可以将接受到的日志发送到指定端口,供级联agent的下一跳收集和接受日志,使用时需要指定目的ip和端口:例子如下: 
    1. a1.channels = c1  
    2.   
    3. a1.sinks = k1  
    4.   
    5. a1.sinks.k1.type = avro  
    6.   
    7. a1.sinks.k1.channel = c1  
    8.   
    9. a1.sinks.k1.hostname = 10.10.10.10  
    10.   
    11. a1.sinks.k1.port = 4545  
    file roll sink 
    file_roll可以将一定时间内收集到的日志写到一个指定的文件中,具体过程为用户指定一个文件夹和一个周期,然后启动agent,这时该文件夹会产生一个文件将该周期内收集到的日志全部写进该文件内,直到下一个周期再次产生一个新文件继续写入,以此类推,周而复始。下面给出一个具体的例子: 
    1. a1.channels = c1  
    2.   
    3. a1.sinks = k1  
    4.   
    5. a1.sinks.k1.type = file_roll  
    6.   
    7. a1.sinks.k1.channel = c1  
    8.   
    9. a1.sinks.k1.sink.directory = /var/log/flume  
    hdfs sink 
    hdfs与file roll有些类似,都是将收集到的日志写入到新创建的文件中保存起来,但区别是file roll的文件存储路径为系统的本地路径,而hdfs的存储路径为分布式的文件系统hdfs的路径,同时hdfs创建新文件的周期可以是时间,也可以是文件的大小,还可以是采集日志的条数。具体实例如下: 
    1. a1.channels = c1  
    2.   
    3. a1.sinks = k1  
    4.   
    5. a1.sinks.k1.type = hdfs  
    6.   
    7. a1.sinks.k1.channel = c1  
    8.   
    9. a1.sinks.k1.hdfs.path = /flume/events/%y-%m-%d/%H%M/%S  
    10.   
    11. a1.sinks.k1.hdfs.filePrefix = events-  
    12.   
    13. a1.sinks.k1.hdfs.round = true  
    14.   
    15. a1.sinks.k1.hdfs.roundValue = 10  
    16.   
    17. a1.sinks.k1.hdfs.roundUnit = minute  
    hbase sink 
    hbase是一种数据库,可以储存日志,使用时需要指定存储日志的表名和列族名,然后agent就可以将收集到的日志逐条插入到数据库中。例子如下: 
    1. a1.channels = c1  
    2.   
    3. a1.sinks = k1  
    4.   
    5. a1.sinks.k1.type = hbase  
    6.   
    7. a1.sinks.k1.table = foo_table  
    8.   
    9. a1.sinks.k1.columnFamily = bar_cf  
    10.   
    11. a1.sinks.k1.serializer = org.apache.flume.sink.hbase.RegexHbaseEventSerializer  
    12.   
    13. a1.sinks.k1.channel = c1  
  • 相关阅读:
    MVCCache2.应用程序缓存(Cache:1.输出缓存[2].应用程序缓存)
    接口和抽象类的区别和作用(功能、用途、好处)
    MVCCache1.输出缓存(Cache:[1].输出缓存2.应用程序缓存)
    JAVA中为什么要使用接口,继承接口不是还要重写方法吗?为什么不直接写那些方法呢?:::接口的最主要的作用是达到统一访问
    枚举的意义,用途,作用,用法,作用场景
    C++ compile multiple cpp and header files via I. cpp1.cpp cpp2.cpp o
    C++retrieve array via returned pointer,traverse the array pointer without the array size
    C++ pass array as pointer and sort in bubble
    C write and read file via FILE and open method in a+ or r mode
    C++ connection mysql and retrieve select sql result
  • 原文地址:https://www.cnblogs.com/gmhappy/p/9472444.html
Copyright © 2020-2023  润新知