Flume不会丢失数据,根据Flume的架构原理,其内部有完善的事务机制,Source到Channel是事务性的,Channel到Sink也是事务性的,所以这两个环节不会出现数据的丢失;
惟一可能丢失数据的状况是Channel采用memoryChannel,agent宕机致使数据丢失,或者Channel存储数据已满,致使Source再也不写入,未写入的数据丢失。web
可是有可能形成数据的重复,例如数据已经成功由Sink发出,可是没有接收到响应,Sink会再次发送数据,此时可能会致使数据的重复。数据库
采集层主要可使用 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 的结合的全部好处。你可使用ClouderaManager 对消费者的监控,而且你甚至能够添加拦截器进行一些流处理。分布式
使用官方提供的 flumeKafka 插件,插件的实现方式是自定义了 flume 的 sink,将数据从channle 中取出,经过 kafka 的producer 写入到 kafka 中,能够自定义分区等。工具
1)Flume 的 channel 分为不少种,能够将数据写入到文件。oop
2)防止非首个 agent 宕机的方法数能够作集群或者主备
Flume 采集日志是经过流的方式直接将日志收集到存储层,而 kafka 是将缓存在 kafka集群,待后期能够采集到存储层。
Flume 采集中间停了,能够采用文件的方式记录以前的日志,而 kafka 是采用 offset 的方式记录以前的日志。
1)source:用于采集数据,Source 是产生数据流的地方,同时 Source 会将产生的数据
流传输到 Channel,这个有点相似于 Java IO 部分的 Channel。
2)channel:用于桥接 Sources 和 Sinks,相似于一个队列。
3)sink:从 Channel 收集数据,将数据写到目标源(能够是下一个 Source,也能够是 HDFS
或者 HBase)。
它是数据流的基本单元,由一个装载数据的字节数组(byte payload)和一系列可选的字符串属性来组成(可选头部).
Flume source 消耗从相似于 web 服务器这样的外部源传来的 events.
Flume source 组件能够处理各类类型、各类格式的日志数据,包括 avro、thrift、exec、jms、spooling directory、netcat、sequence generator、syslog、http、legacy.
Flume channel
Channel 是链接Source和Sink的组件, 是位于 Source 和 Sink 之间的数据缓冲区。
Flume channel 使用被动存储机制. 它存储的数据的写入是靠 Flume source 来完成的, 数据的读取是靠后面的组件 Flume sink 来完成的.
Channel 是线程安全的,能够同时处理几个 Source 的写入操做和几个 Sink 的读取操做。
Flume 自带两种 Channel:
Memory Channel是内存中的队列。
Memory Channel在不须要关心数据丢失的情景下适用。
若是须要关心数据丢失,那么Memory Channel就不该该使用,由于程序死亡、机器宕机或者重启都会致使数据丢失。
File Channel。
File Channel将全部事件写到磁盘。所以在程序关闭或机器宕机的状况下不会丢失数据。
还能够有其余的 channel: 好比 JDBC channel.
Sink 不断地轮询 Channel 中的事件且批量地移除它们,并将这些事件批量写入到存储或索引系统、或者发送到另外一个Flume Agent。
Sink 是彻底事务性的。
在从 Channel 批量删除数据以前,每一个 Sink 用 Channel 启动一个事务。批量事件一旦成功写出到存储系统或下一个Flume Agent,Sink 就利用 Channel 提交事务。事务一旦被提交,该 Channel 从本身的内部缓冲区删除事件。若是写入失败,将缓冲区takeList中的数据归还给Channel。
Sink组件目的地包括hdfs、logger、avro、thrift、ipc、file、null、HBase、solr、自定义。
Flume的事务机制(相似数据库的事务机制):Flume使用两个独立的事务分别负责从Soucrce到Channel,以及从Channel到Sink的事件传递。好比spooling directory source 为文件的每一行建立一个事件,一旦事务中全部的事件所有传递到Channel且提交成功,那么Soucrce就将该文件标记为完成。同理,事务以相似的方式处理从Channel到Sink的传递过程,若是由于某种缘由使得事件没法记录,那么事务将会回滚。且全部的事件都会保持到Channel中,等待从新传递。