文章目录
- 关于 Apache Flume
- 数据流模型
- Event
- Agent
- Source
- Channel
- Sink
关于 Apache Flume
- 官网:https://flume.apache.org
- Flume User Guide : https://flume.apache.org/releases/content/1.11.0/FlumeUserGuide.html
- Flume Developer Guide : https://flume.apache.org/releases/content/1.11.0/FlumeDeveloperGuide.html
Flume是的一个分布式、高可用、高可靠的海量日志采集、聚合和传输的系统,支持在日志系统中定制各类数据发送方,用于收集数据,同时提供了对数据进行简单处理并写到各种数据接收方的能力。
Flume的设计原理是基于数据流的,能够将不同数据源的海量日志数据进行高效收集、聚合、移动,最后存储到一个中心化数据存储系统中。 Flume能够做到近似实时的推送,并且可以满足数据量是持续且量级很大的情况。比如它可以收集社交网站日志,并将这些数量庞大的日志数据从网站服务器上汇集起来,存储到HDFS或 HBase分布式数据库中。
Flume的应用场景: 比如一个电商网站,想从网站访问者中访问一些特定的节点区域来分析消费者的购物意图和行为。为了实现这一点,需要收集到消费者访问的页面以及点击的产品等日志信息,并移交到大数据 Hadoop平台上去分析,可以利用 Flume做到这一点。现在流行的内容推送,比如广告定点投放以及新闻私人定制也是基于这个道理。
数据流模型
过程简要说明如下:
(1)外部数据源(Web Server)将Flume可识别的 Event发送到 Source
(2) Source收到 Event事件后存储到一个或多个Channel通道中。
(3)Channel保留 Event直到Sink将其处理完毕。
(4)Sink从 Channel中取出数据,并将其传输至外部存储(HDFS)。
可靠性
事件在每个代理的通道中上演。然后,事件将被传递到流程中的下一个代理或终端存储库(例如 HDFS)。仅当事件存储在下一个代理的通道或终端存储库中后,事件才会从通道中删除。这就是 Flume 中的单跳消息传递语义如何提供流的端到端可靠性。
Flume 使用事务方法来保证事件的可靠传递。源和接收器分别将放置在通道提供的事务中或由通道提供的事务提供的事件的存储/检索封装在事务中。这确保了事件集在流中可靠地从一个点传递到另一个点。在多跳流的情况下,前一跳的接收器和下一跳的源都运行事务,以确保数据安全地存储在下一跳的通道中。
可恢复性
事件在通道中暂存,通道管理故障恢复。 Flume 支持由本地文件系统支持的持久文件通道。还有一个内存通道,它只是将事件存储在内存队列中,速度更快,但当代理进程终止时,仍然留在内存通道中的任何事件都无法恢复。
Flume 的KafkaChannel使用 Apache Kafka 来暂存事件。使用复制的 Kafka 主题作为通道有助于避免磁盘故障时事件丢失。
Event
事件是Flume内部数据传输的最基本单元,将传输的数据进行封装。
事件本身是由一个载有数据的字节数组和可选的headers头部信息构成,如下图所示。
Flume以事件的形式将数据从源头传输到最终的目的地。
Agent
Flume Agent 是一个JVM进程,通过三个组件(source、channel、sink)将事件流从一个外部数据源收集并发送给下一个目的地。
Source
从数据发生器接收数据,并将数据以Flume的Event格式传递给一个或多个通道(Channel)
支持Source:
- Avro Source
- Thrift Source
- Exec Source
- JMS Source
- Spooling Directory Source
- Taildir Source
- Twitter 1% firehose Source (experimental)
- Kafka Source
- NetCat TCP Source
- NetCat UDP Source
- Sequence Generator Source
- Syslog Sources
- HTTP Source
- Stress Source
- Legacy Sources
- Custom Source
Channel
一种短暂的存储容器,位于 Source和Sink之间,起着桥梁的作用。 Channel将从Source处接收到的 Event格式的数据缓存起来,当Sink成功地将 Events发送到下一跳的Channel或最终目的地后, Events从 Channel移除。Channel是一个完整的事务,这一点保证了数据在收发的时候的一致性。可以把 Channel看成一个FIFO(先进先出)队列,当数据的获取速率超过流出速率时,将Event保存到队列中,再从队中一个个出来。
有以下几种Channel:
- Memory Channel 事件存储在可配置容量的内存队列中,队列容量即为可存储最大事件数量,适用于高吞吐量场景,在agent出现错误时有可能会丢失部分数据
- File Channel 基于文件系统的持久化存储
- Spillable Memory Channel 内存和文件混合Channel,当内存队列满了之后,新的事件会存储在文件系统,目前处于实验阶段,不建议在生产环境中使用
- JDBC Channe 事件存储在持久化的数据库中,目前只支持Derby
- Kafka Channel 事件存储在Kafka集群中
- Pseudo Transaction Channel 伪事务Channel,仅用于测试,不能在生产环境使用
- Custom Channel 自定义Channel
Sink
获取Channel暂时保存的数据并进行处理。sink从channel中移除事件,并将其发送到下一个agent(简称下一跳)或者事件的最终目的地,比如HDFS。
Sink分类:
- HDFS Sink
- Hive Sink
- Logger Sink
- Avro Sink
- Thrift Sink
- IRC Sink
- File Roll Sink 将Events保存在本地文件系统
- Null Sink 抛弃从Channel接收的所有事件
- HBaseSinks
- MorphlineSolrSink
- ElasticSearchSink
- Kite Dataset Sink
- Kafka Sink
- HTTP Sink
- Custom Sink
2024-04-25(四)