Apache flume+Kafka获取实时日志信息

Flume简介以及安装

  1. Flume是一个分布式的对海量日志进行采集,聚合和传输的系统。Flume系统分为三个组件,分别是source,sink,channel:source表明数据的来源,可能来自文件,Avro等,channel作为source和sink的桥梁,作为数据的临时存储地,channal是一个完整的事务,这一点保证了数据在收发的时候的一致性,支持的类型有: JDBC channel , File System channel , Memort channel等;sink表明数据的去向,可以把数据再次转发到HDFS,或者Kafka等。

  2. 本文使用的版本是1.8.0(目前最新)的版本,可以到官网 进行下载。

  3. 解压、安装、配置

sudo tar -zxvf apache-flume-1.8.0-bin.tar.gz
cd apache-flume-1.8.0-bin
sudo vim conf/kafka.conf #这个文件刚开始并不存在,要新建

kafka.conf的具体内容:

# 分别对应三种基础组件,起的别名 kafka是在启动flume的时候,指定的agent的名字
kafka.sources = src
kafka.sinks = sk
kafka.channels = chl

# 表明需要收集的数据来自avro,此处配置会启动avro server
kafka.sources.src.type = avro
kafka.sources.src.bind = localhost
kafka.sources.src.port = 44446

# Flume 收集的数据转发到Kafka的关键配置
kafka.sinks.sk.type = org.apache.flume.sink.kafka.KafkaSink
kafka.sinks.sk.kafka.bootstrap.servers = localhost:9092  #指定kafka集群的地址
kafka.sinks.sk.partition.key=0
kafka.sinks.sk.partitioner.class=org.apache.flume.plugins.SinglePartition
kafka.sinks.sk.serializer.class=kafka.serializer.StringEncoder
kafka.sinks.sk.request.required.acks=0
kafka.sinks.sk.max.message.size=1000000
kafka.sinks.sk.producer.type=sync
kafka.sinks.sk.topic=log  #指定kafka的topic

# Use a channel which buffers events in memory
kafka.channels.chl.type = memory
kafka.channels.chl.capacity = 1000
kafka.channels.chl.transactionCapacity = 100

# Bind the source and sink to the channel
kafka.sources.src.channels = chl
kafka.sinks.sk.channel = chl

Flume服务启动:

bin/flume-ng agent --conf conf --conf-file conf/kafka.conf --name kafka -Dflume.root.logger=INFO,LOGFILE

ps:上述命令也可以通过nohup方式启动
至此,flume已经启动完成了!
接下来我们请出另一个主角 Kafka
同样是下载,安装,配置的步骤:

wget http://mirrors.shuosc.org/apache/kafka/1.0.0/kafka_2.12-1.0.0.tgz
tar -zxf kafka_2.12-1.0.0.tgz
cd kafka_2.12-1.0.0
vim config/server.properties

下面是config/server.properties的配置和说明:

#指定broker的id,数字,但不能过大
broker.id=0
#指定服务的监听端口,默认是9092
port=9092
#这个地方需要特别注意,在代码中使用的时候,需要完全复制这个地方的配置,如localhost:9092,但是如果是分布式的,localhost显然是不符合要求的,最好写成当前机器的ipv4的地址,这里写localhost方便单机测试和开发
listeners=PLAINTEXT://localhost:9092
#同上,具体含义看官方源文件中的说明
advertised.listeners=PLAINTEXT://localhost:9092
#指定zk的地址
zookeeper.connect=localhost:2181

配置基本上是可以了,然后开始run

bin/kafka-server-start config/server.properties

注意: 在启动kafka之前需要先启动zk,可以从官网专门下载一个zk,或者使用kafka自带的zk,都可以。

Java代码实现日志打印并被Flume采集

接下来就需要在代码实现日志的打印,通过flume的采集,然后发送到kafka,其实flume采集发送到kafka通过上述配置就已经完成了,现在就做第一件事:
我个人采用spring boot进行实现的,在pom中进行如下配置:

<dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter</artifactId>
        <exclusions><!--把logback忽略,使用log4j-->
            <exclusion>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-logging</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-log4j2</artifactId>
    </dependency>
    <!--flume对log4j的支持,使用avro的关键-->
    <dependency>
      <groupId>org.apache.flume.flume-ng-clients</groupId>
      <artifactId>flume-ng-log4jappender</artifactId>
      <version>1.5.0</version>
    </dependency>

然后在src/main/resources下面,加入log配置文件:log4j.properties

# set log levels
log4j.rootLogger=INFO, stdout, file, flume
log4j.logger.per.flume=INFO

#flume#
log4j.appender.flume=org.apache.flume.clients.log4jappender.Log4jAppender
log4j.appender.flume.layout=org.apache.log4j.PatternLayout
##重点在这里!!这个地方就是在flume配置的avro的server地址,程序中产生的log都会通过avro的方式,被flume所采集
log4j.appender.flume.Hostname=localhost
log4j.appender.flume.Port=44446

#stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Threshold=INFO
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %c{1} [%p] %m%n

 #file 
log4j.appender.file=org.apache.log4j.DailyRollingFileAppender
log4j.appender.file.Threshold=INFO
log4j.appender.file.File=/tmp/logs/real-log.log
log4j.appender.file.Append=true
log4j.appender.file.DatePattern='.'yyyy-MM-dd
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %c{1} [%p] %m%n

关于这个项目的简单代码,已经在我的gitee上了,这个demo主要是通过打印日志,flume 收集并publish 到 kafka指定的topic上,然后通过kafka consume接受到,后续会通过storm进行实时计算和处理

猜你喜欢

转载自www.cnblogs.com/jovic/p/10052526.html