• 日志收集之--将Kafka数据导入elasticsearch


         最近需要搭建一套日志监控平台,结合系统本身的特性总结一句话也就是:需要将Kafka中的数据导入到elasticsearch中。那么如何将Kafka中的数据导入到elasticsearch中去呢,总结起来大概有如下几种方式:

    • Kafka->logstash->elasticsearch->kibana(简单,只需启动一个代理程序)
    • Kafka->kafka-connect-elasticsearch->elasticsearch->kibana(与confluent绑定紧,有些复杂)
    • Kafka->elasticsearch-river-kafka-1.2.1-plugin->elasticsearch->kibana(代码很久没更新,后续支持比较差)

    elasticsearch-river-kafka-1.2.1-plugin插件的安装及配置可以参考:http://hqiang.me/2015/08/将kafka的数据导入至elasticsearch/

     根据以上情况,项目决定采用方案一将Kafka中的数据存入到elasticsearch中去。

    一、拓扑图

        项目拓扑图如下所示:

      此时消息的整体流向为:日志/消息整体流向Flume => kafka => logstash => elasticsearch => kibana

     A.Flume日志收集

    agent.sources = r1
    agent.channels = c1
    agent.sinks = s1
    
    agent.sources.r1.type = exec
    agent.sources.r1.command = tail -F -n 0 /data01/monitorRequst.log
    agent.sources.r1.restart = true  //解决tail -F进程被杀死问题
    
    
    agent.channels.c1.type = memory
    agent.channels.c1.capacity = 1000
    agent.channels.c1.transactionCapacity = 100
    
    agent.sinks.s1.type = avro
    agent.sinks.s1.port = 50001
    agent.sinks.s1.hostname = IP
    agent.sources.r1.channels = c1
    agent.sinks.s1.channel = c1
    

    Flume日志收集过程中踩过的坑可以参考:http://www.digitalsdp.com/Experiencebbs/maintenance/506.jhtml

     B.Kafka Sink

    agent.sources = r1
    agent.channels = c2
    agent.sinks = s2
    
    agent.sources.r1.type = avro
    agent.sources.r1.bind = IP
    agent.sources.r1.port = 50001
    
    agent.channels.c2.type = memory
    agent.channels.c2.capacity = 1000
    agent.channels.c2.transactionCapacity = 100
    
    agent.sinks.s2.type = org.apace.flume.sink.kafka.KafkaSink
    agent.sinks.s2.topic = XXX
    agent.sinks.s2.brokerList = IP:9091,IP:9092
    agent.sinks.s2.batchSize = 20
    
    agent.sources.r1.channels = c2
    agent.sinks.s2.channel = c2
    

    二、环境搭建

     关于Kafka及Flume的搭建在这里不再详细论述,如有需要请参见本文其它说明。在这里重点说明logstash的安装及配置。

      A.下载logstash的安装包; 

      B.新建kafka-logstash-es.conf置于logstash/conf目录下;

      C.配置kafka-logstash-es.conf如下:

    logstash的配置语法如下:

    input {
      ...#读取数据,logstash已提供非常多的插件,可以从file、redis、syslog等读取数据
    }
    
    filter{
      ...#想要从不规则的日志中提取关注的数据,就需要在这里处理。常用的有grok、mutate等
    }
    
    output{
      ...#输出数据,将上面处理后的数据输出到file、elasticsearch等
    }
    

    示例:

    input {
        kafka {
            zk_connect => "c1:2181,c2:2181,c3:2181"
            group_id => "elasticconsumer"   ---随意取
            topic_id => "xxxlog"  ---与flume中的Channel保持一致
            reset_beginning => false 
            consumer_threads => 5  
            decorate_events => true 
            codec => "json"
            }
        }
    output {
        elasticsearch {
            hosts => ["c4:9200","c5:9200"]
            index => "traceid"--与Kafka中json字段无任何关联关系,注意:index必须小写
            index => "log-%{+YYYY-MM-dd}"
            workers => 5
            codec => "json"
    		  }
         }
    

     运行logstash命令为:nohup bin/logstash -f /XXX/logstash/conf/kafka-logstash-es.conf &

    三、调测过程中遇到的一些坑

    A.在集成ELK过程中总以为head插件是必须的,其实head插件为非必需品。elasticsearch仅提供了一个数据存储的煤介,head为了让大家更方便的去查看数据; 

    B.采用以上方案进行布署时,当系统正常运行时,可以在elasticsearch服务器上http://IP:9200/*搜索index是否创建成功

    参考:https://www.slahser.com/2016/04/21/日志监控平台搭建-关于Flume-Kafka-ELK/

              http://www.jayveehe.com/2017/02/01/elk-stack/

              http://wdxtub.com/2016/11/19/babel-log-analysis-platform-1/

  • 相关阅读:
    (转载)Hadoop示例程序WordCount详解
    Eclipse打不开,闪退
    【python】实例-把两个无规则的序列连接成一个序列,并删除重复的元素,新序列按照升序排序
    【python】格式化输出
    【python】序列、元组、集合、字典和range函数
    【python】实例-判断用户输入数字的类型
    【python】文件操作
    python 异常类型----后期需理解调整
    【python】OOP编程----类的定义及封装
    【python】if&&for&&while语句
  • 原文地址:https://www.cnblogs.com/moonandstar08/p/6556899.html
Copyright © 2020-2023  润新知