Flume + kafka + HDFS构建日志采集系统

Posted 过往记忆大数据

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Flume + kafka + HDFS构建日志采集系统相关的知识,希望对你有一定的参考价值。

本文转载自:http://shift-alt-ctrl.iteye.com/blog/2339981,点击下面阅读原文即可进入。

Flume是一个非常优秀日志采集组件,类似于logstash,我们通常将Flume作为agent部署在application server上,用于收集本地的日志文件,并将日志转存到HDFS、kafka等数据平台中;关于Flume的原理和特性,我们稍后详解,本文只简述如何构建使用Flume + kafka + HDFS构建一套日志采集系统。

  • Flume:作为agent部署在每个application server,指定需要收集的日志文件列表,日志文件通常为application通过logback等生成。(本文基于Flume 1.7.0)

  • kafka:基于Flume,将“准实时”数据发送给kafka;比如“tail”某个文件的实时数据。对于实时数据分析组件或者同类型的数据消费者,可以通过kafka获取实时数据。(kafka 0.9.0)

  • HDFS:基于Flume,将“历史数据”保存在HDFS,“历史数据”比如“每天rotate生成的日志文件”,我们熟悉的catalina.out文件,每天都rotate生成一个新的。当然对于“准实时”数据也可以保存在HDFS中,Flume支持将“tail”的数据每隔?小时生成一个HDFS文件等。通常情况下,我们将“历史数据”保存在HDFS,而不是“实时数据”。(hadoop 2.6.5)

  • 对于历史数据,我们基于Flume的Spooling方式将数据转存在HDFS中;对于“准实时”数据,我们基于Flume的Tail方式将数据转存在kafka中。

HDFS准备

首先,我们需要一个hadoop平台,用于保存历史数据,我们所采集的数据通常为“日志数据”,搭建hadoop平台过程此处不再赘言。

我们规划的5台hadoop,2个namenode基于HA方式部署,3个datanode;其中namenode为4Core、8G、200G配置,datanode为8Core、16G、2T配置,blockSize为128M(日志文件大小普遍为2G左右,每个小时,大概在100M左右),replication个数为2。

Kafka准备

kafka的目的就是接收“准实时”数据,受限于kafka的本身特性,我们尽量不要让kafka存储太多的数据,即消息消费端尽可能的快(尽可能短的中断时间)。我们的集群为4个kafka实例,8Core、16G、2T配置,replication个数为2,数据持久时间为7天。kafka和hadoop都依赖于zookeeper集群,zk的集群是额外搭建的。

比较考验设计的事情,是如何设计Topic;当kafka集群上topic数量过多时,比如一个“tail”的文件分配一个topic,将会对kafka的性能带来巨大挑战,同时Topic太多会导致消息消费端编码复杂度较高;另一个方面,如果Topic过少,比如一个project中所有的“tail”的文件归属一个Topic,那么次topic中的数据来自多个文件,那么数据分拣的难度就会变大。

我个人的设计理念为:一个project中,每个“tail”的文件一个topic,无论这个project部署了多少实力,同一个“tail”文件归为一个topic;比如order-center项目中有一个业务日志pay.log,此project有20台实例,我们的topic名字为order-center-pay,那么这20个实例中的order.log会被收集到此topic中,不过为了便于数据分拣,order.log中每条日志都会携带各自的“local IP”。

kafka的配置样例(server.properties):

broker.id=1  
listeners=PLAINTEXT://10.0.1.100:9092  
port=9092  
#host.name=10.0.1.100  
num.network.threads=3  
num.io.threads=8  
num.io.threads=8  
num.network.threads=8  
num.partitions=1  
socket.send.buffer.bytes=102400  
socket.receive.buffer.bytes=102400  
socket.request.max.bytes=104857600  
log.dirs=/data/kafka  
num.partitions=1  
num.recovery.threads.per.data.dir=1  
default.replication.factor=2  
log.flush.interval.messages=10000  
log.flush.interval.ms=1000  
log.retention.hours=168  
log.segment.bytes=1073741824  
log.retention.check.interval.ms=300000  
zookeeper.connect=10.0.1.10:2181,10.0.1.11:2181,10.0.2.10:2181/kafka  
zookeeper.connection.timeout.ms=6000  
delete.topic.enable=true  
min.insync.replicas=1  
zookeeper.session.timeout.ms=6000

kafka不是本文的介绍重点,所以请你参考本人的其他博文获取更多的资讯。

后来的我们

主演:井柏然 / 周冬雨 / 田壮壮

以上是关于Flume + kafka + HDFS构建日志采集系统的主要内容,如果未能解决你的问题,请参考以下文章

flume + kafka + sparkStreaming + HDFS 构建实时日志分析系统

kafka怎么收集到flume的日志

flume抽取日志为啥没写到hdfs中

Flume消费Kafka数据落盘至HDFS的实践

flume kafka spark读取日志延迟

双层flume,中间件kafka,采集到hdfs并按日期分文件夹