参考文章:Flume和Kafka的区别与联系

日志采集系统flume和kafka有什么区别及联系,它们分别在什么时候使用,什么时候又可以结合?

一、相同点

  1. 同样是流式数据采集框架,
  2. flume一般用于日志采集,可以定制很多数据源,减少开发量,基本架构是一个flume进程agent(source、拦截器、选择器、channel<Memory Channel、File Channel>、sink),其中传递的是原子性的event数据;使用双层Flume架构可以实现一层数据采集,一层数据集合;
  3. kafka一般用于日志缓存,是一个可持久的分布式消息队列,自带存储,提供push和pull两种存储数据功能;包括producer、kafkaCluster(broker:topic、partition)、consumer,依赖于Zookeeper(brokerid、topic、partition元数据存在ZNode,partition选举leader依赖Zookeeper);
  4. Flume和Kafka都是消息系统,但Flume更趋向于消息采集系统,而Kafka更趋向于消息缓存系统。
  5. flume负责数据采集及保障数据可靠传输,kafka做缓冲,及数据多重,两者结合使用。

二、区别点

区别点一:

flume和kafka的侧重点不同:

  1. kafka追求的是高吞吐,高负载,同一topic下可以有多个partition,由于是pull模式拉取数据,因此适合多个消费者的场景;kafka没有内置的producer和consumer组件,需要自己编写代码。
  2. 而flume追求的是数据和数据源、数据流向的多样性,适合多个生产者的场景;flume有自己内置的多种source和sink组件,具体操作方式是编写source、channel和sink的.conf配置文件,开启flume组件的时候用命令关联读取配置文件实现;
  3. kafka:用来做消息推送中间件,消息的处理完全由业务方自己定义,请求频次单机吞吐量轻轻松松50W+/s,数据在集群不全挂的情况下是不会丢数据,消费也很灵活,可以指定分区和offset,可以当做成一个数据库
  4. flume:用来做数据采集和落地,采用flume-ng,流程:source(kafka)->channel->hdfs, 相比较kafka比较轻量级 ,本质是一个数据的流通管道,当一个flume实例挂了数据会丢失
  1. Kafka是一个更加通用的系统。用户可以构造不同的生产者与消费者共享不同的主题;相反,Flume主要是用于向Hadoop或HBase导入数据,因此它对HDFS/HBase具有更好的优化,同时它也集成了Hadoop安全组件。因此,如果数据需要被多个应用程序处理,建议Kafka;如果数据主要是用于Hadoop,建议Flume。
  2. Flume具有很多内置的源与槽。Kafka相比而言,现成生产者与消费者就比较少了,而且Kafka社区对这些生产者/消费者的支持也比较薄弱。因此如果准备自己编写生产者与消费者,建议Kafka;如果Flume的内置源/槽已经足够满足你的需求而又不想编程,建议Flume。

  3. Flume内置了拦截器,可以对流经Flume的数据进行直接处理,因此比较容易实现数据屏蔽与数据过滤。Kafka则需要额外的流处理系统来对数据进行处理。

  4. Kafka与Flume都可以通过配置保证数据不丢失。但是,Flume不会复制消息,因此即使使用可靠的文件渠道,当Flume进程宕机后,你就无法访问这些消息了(当然Flume进程重启,从磁盘上恢复之前状态后,可以继续对消息进行处理)。因此如果对 HA高可用性具有很高要求,建议Kafka

区别点二:

flume和kafka的定位有所不同:

flume:

  1. cloudera公司研发,适合多个生产者;
  2. 适合下游数据消费者不多的情况;(一个消费者开一个channel)
  3. 适合数据安全性要求不高的操作;(数据没有备份、没有副本)
  4. 适合与Hadoop生态圈对接的操作。(HDFS、Hbase等)
  5. 适合生产和收集数据

kafka: 

  1. linkedin公司研发,适合多个消费者;
  2. 适合数据下游消费众多的情况;(kafka从磁盘读,并且只找Leader读)
  3. 适合数据安全性要求较高的操作,支持replication(多副本)。
  4. Kafka 一般作为Pub-Sub管道,没有抓取功能。
  5. 适合消费数据
  6. Kafka本身也不算消息中间件,中间件一般会有Queue和Topic两种模型,Kafka主要是Topic类的模型。

三、联系 

联系:

  1. Flume和Kafka应该结合来使用,Flume作为日志收集端,Kafka作为日志消费端。
  2. Flume的Source-Channel-Sink模型,非常适合作为日志收集的模型。
  3. Kafka采用生产者消费者模型,采用kafka消息队列作为中间件,消费的下游和上游可以完美的解耦。

工作中常用的一种模型是:

线上数据 --> flume --> kafka --> HDFS --> hive/MR计算
                                              --> SparkStreaming计算
也有kafka与springboot组合,采集数据后交给sparkStreaming进行流式计算

搭建日志系统常用方案:

  1. 日志采集(Logstash/Flume,SDK wrapper)
  2. 实时消费 (Storm, Flink, Spark Streaming)
  3. 离线存储 (HDFS or Object Storage or NoSQL) +  离线分析(Presto,Hive,Hadoop)
  4. 有一些场景可能需要搜索,可以加上ES或ELK
  • flume:日志采集系统
  • kafka:消息中间件
  • 组合:log->flume->kafka->hdfs(solr)
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐