日志采集系统flume和kafka有什么区别及联系,它们分别在什么时候使用,什么时候又可以结合?
观点一:
简言之:这两个差别很大,使用场景区别也很大。
先说flume:
日志采集。线上数据一般主要是落地文件或者通过socket传输给另外一个系统。这种情况下,你很难推动线上应用或服务去修改接口,直接向kafka里写数据。这时候你可能就需要flume这样的系统帮你去做传输。
对于数量级别,做过单机upd的flume source的配置,100+M/s数据量,10w qps flume就开始大量丢包。因此我们在搭建系统时,抛弃了flume,自己研发了一套传输系统。但flume设计的source-channel-sink模式还是比较好的,我们在开发系统时无耻的也抄袭了这种方式。
Kafka:
我个人觉得kafka更应该定位为中间件系统。开发这个东西目的也是这个初衷。可以理解为一个cache系统。你甚至可以把它理解为一个广义意义的数据库,里面可以存放一定时间的数据。kafka设计使用了硬盘append方式,获得了非常好的效果。
我觉得这是kafka最大的亮点。不同系统之间融合往往数据生产/消费速率不同,这时候你可以在这些系统之间加上kafka。例如线上数据需要入HDFS,线上数据生产快且具有突发性,如果直接上HDFS(kafka-consumer)可能会使得高峰时间hdfs数据写失败,这种情况你可以把数据先写到kafka,然后从kafka导入到hdfs上。印象中LinkedIn公司有这么用。
业界比较典型的一中用法是:
线上数据 -> flume -> kafka -> hdfs -> MR离线计算 或者:
线上数据 -> flume -> kafka -> storm
观点二:
Flume和Kafka本身是很相似的系统,都能无压力传输很大的数据量。
细节上他们当然有很多不同,但是总结下来,如果你纠结到底是用Kafka还是Flume:
1. Kafka是pull based, 如果你有很多下游的Data Consumer,用Kafka;
2. Kafka有Replication,Flume没有,如果要求很高的容错性(Data High Availability),选kafka;
3. 需要更好的Hadoop类产品接口,例如HDFS,HBase等,用Flume。
当然,这两个区别就让人自然而然的想到整合两者,这样既可拥有Kafka的容错能力,和Flume的多种接口,例如:
Events --->Flume ---> Kafka ---> Flume ---> Storage System (Hadoop Cluster)
当然,坏处就是你需要开发维护多个系统...
前一段似乎看到Cloudera提出过一款Flafka的app,说的就是这两款产品的整合,有兴趣可以去搜搜。
观点三:
我偏爱Flume,因为架构简单,依赖少。
但是同样的,功能也简单,但是够灵活。
它的定位是数据通道,不是消息队列。
Flume和Kafka应该结合来使用,Flume作为日志收集端,Kafka作为日志消费端。
flume:日志采集系统
kafka:消息中间件
也用过楼上说的组合:
log->flume->kafka->hdfs(solr)
Flume的Source-Channel-Sink模型,非常适合作为日志收集的模型。你可以想一下,如果你来做一个日志收集的Agent,如果做能尽量保证日志数据的传输成功率,应对服务端的各种异常情况,以及如何灵活的接入各种不同的日志类型。
Kafka就不必多说了,生产者消费者模型,看你怎么去构建日志消费的下游了。有了消息队列作为中间件,消费的下游和上游可以完美的解耦。
概述:
(1)kafka和flume都是日志系统。kafka是分布式消息中间件,自带存储,提供push和pull存取数据功能。flume分为agent(数据采集器),collector(数据简单处理和写入),storage(存储器)三部分,每一部分都是可以定制的。比如agent采用RPC(Thrift-RPC)、text(文件)等,storage指定用hdfs做。
(2)kafka做日志缓存应该是更为合适的,但是 flume的数据采集部分做的很好,可以定制很多数据源,减少开发量。所以比较流行flume+kafka模式,如果为了利用flume写hdfs的能力,也可以采用kafka+flume的方式。
采集层 主要可以使用Flume, Kafka两种技术。
Flume:Flume 是管道流方式,提供了很多的默认实现,让用户通过参数部署,及扩展API.
Kafka:Kafka是一个可持久化的分布式的消息队列。
- Kafka 是一个非常通用的系统。你可以有许多生产者和很多的消费者共享多个主题Topics。相比之下,Flume是一个专用工具被设计为旨在往HDFS,HBase发送数据。它对HDFS有特殊的优化,并且集成了Hadoop的安全特性。所以,Cloudera 建议如果数据被多个系统消费的话,使用kafka;如果数据被设计给Hadoop使用,使用Flume。
- 正如你们所知Flume内置很多的source和sink组件。然而,Kafka明显有一个更小的生产消费者生态系统,并且Kafka的社区支持不好。希望将来这种情况会得到改善,但是目前:使用Kafka意味着你准备好了编写你自己的生产者和消费者代码。如果已经存在的Flume Sources和Sinks满足你的需求,并且你更喜欢不需要任何开发的系统,请使用Flume。
- Flume可以使用拦截器实时处理数据。这些对数据屏蔽或者过量是很有用的。Kafka需要外部的流处理系统才能做到。
- Kafka和Flume都是可靠的系统,通过适当的配置能保证零数据丢失。然而,Flume不支持副本事件。于是,如果Flume代理的一个节点奔溃了,即使使用了可靠的文件管道方式,你也将丢失这些事件直到你恢复这些磁盘。如果你需要一个高可靠行的管道,那么使用Kafka是个更好的选择。
- Flume和Kafka可以很好地结合起来使用。如果你的设计需要从Kafka到Hadoop的流数据,使用Flume代理并配置Kafka的Source读取数据也是可行的:你没有必要实现自己的消费者。你可以直接利用Flume与HDFS及HBase的结合的所有好处。你可以使用Cloudera Manager对消费者的监控,并且你甚至可以添加拦截器进行一些流处理。
Flume和Kafka可以结合起来使用。通常会使用Flume + Kafka的方式。其实如果为了利用Flume已有的写HDFS功能,也可以使用Kafka + Flume的方式。
其他:
今天开会讨论日志处理为什么要同时使用Flume和Kafka,是否可以只用Kafka 不使用Flume?当时想到的就只用Flume的接口多,不管是输入接口(socket 和 文件)以及输出接口(Kafka/HDFS/HBase等)。
考虑单一应用场景,从简化系统的角度考虑,在满足应用需求的情况下可能只使用一个比较好。但是考虑到现有系统业务发展,为了后面的灵活扩展,在先用系统设计时留有一定的扩展性感觉更重要,可能使用Flume+kafka架构相对只使用Kafka会多占用1-2台机器做Flume日志采集,但是为了方便以后日志数据处理方式的扩展,可以采用Flume+kafka架构。
Flume :管道 ----个人认为比较适合有多个生产者场景,或者有写入Hbase、HDFS和kafka需求的场景。
Kafka :消息队列-----由于Kafka是Pull模式,因此适合有多个消费者的场景。
目前应用场景,一台日志转发机负责产生日志。后端需要通过Strom消费日志信息,建议可以设置成log-->Kafka->storm.如果以后有写入Hbase或者HDFS的需求可以,在Kafka后面再接上storm,或者在日志转发机上直接日志落地,由Flume去读取日志消息。
Kafka 与 Flume 很多功能确实是重复的。以下是评估两个系统的一些建议:
- Kafka 是一个通用型系统。你可以有许多的生产者和消费者分享多个主题。相反地,Flume 被设计成特定用途的工作,特定地向 HDFS 和 HBase 发送出去。Flume 为了更好地为 HDFS 服务而做了特定的优化,并且与 Hadoop 的安全体系整合在了一起。基于这样的结论,Hadoop 开发商 Cloudera 推荐如果数据需要被多个应用程序消费的话,推荐使用 Kafka,如果数据只是面向 Hadoop 的,可以使用 Flume。
- Flume 拥有许多配置的来源 (sources) 和存储池 (sinks)。然后,Kafka 拥有的是非常小的生产者和消费者环境体系,Kafka 社区并不是非常支持这样。如果你的数据来源已经确定,不需要额外的编码,那你可以使用 Flume 提供的 sources 和 sinks,反之,如果你需要准备自己的生产者和消费者,那你需要使用 Kafka。
- Flume 可以在拦截器里面实时处理数据。这个特性对于过滤数据非常有用。Kafka 需要一个外部系统帮助处理数据。
- 无论是 Kafka 或是 Flume,两个系统都可以保证不丢失数据。然后,Flume 不会复制事件。相应地,即使我们正在使用一个可以信赖的文件通道,如果 Flume agent 所在的这个节点宕机了,你会失去所有的事件访问能力直到你修复这个受损的节点。使用 Kafka 的管道特性不会有这样的问题。
- Flume 和 Kafka 可以一起工作的。如果你需要把流式数据从 Kafka 转移到 Hadoop,可以使用 Flume 代理 (agent),将 kafka 当作一个来源 (source),这样可以从 Kafka 读取数据到 Hadoop。你不需要去开发自己的消费者,你可以使用 Flume 与 Hadoop、HBase 相结合的特性,使用 Cloudera Manager 平台监控消费者,并且通过增加过滤器的方式处理数据。
参考: https://www.zhihu.com/question/36688175/answer/68692597
https://my.oschina.net/frankwu/blog/355298