Flume 简介
Apache Flume 是一个分布式、高可靠、高可用的用来收集、聚合、转移不同来源的大量日志数据到中央数据仓库的工具。Apache Flume 是 Apache 软件基金会(ASF)的顶级项目。
系统要求
- Java 运行环境:Java 1.8 或更高版本
- 内存:足够的内存 用来配置 Souuces、Channels 和 Sinks
- 硬盘空间:足够的硬盘用来配置 Channels 和 Sinks
- 目录权限:Agent 用来读写目录的权限
Flume 版本 | 依赖的 JRE 版本 |
---|---|
Flume 1.9.0 | Java1.8 或更高版本 |
Flume 1.8.0 | Java1.8 或更高版本 |
Flume 1.7.0 | Java1.7 或更高版本 |
Flume 1.4.0、1.5.0、1.5.2、1.6.0 | Java1.6 或更高版本(建议使用 1.7) |
体系结构
数据流模型
Event 是 Flume 定义的一个数据流传输的最小单元。Agent 就是一个 Flume 的实例,本质是一个 JVM 进程,该 JVM 进程控制 Event 数据流从外部日志生产者那里传输到目的地(或者是下一个 Agent)。
Event 英文直译是事件,但是在 Flume 里表示数据传输的一个最小单位(被 Flume 收集的一条条日志又或者一个个的二进制文件,不管你在外面叫什么,进入 Flume 之后它就叫 event)。参照下图可以看得出 Agent 就是 Flume 的一个部署实例, 一个完整的 Agent 中包含了必须的三个组件 Source、Channel 和 Sink,Source 是指数据的来源和方式,Channel 是一个数据的缓冲池,Sink 定义了数据输出的方式和目的地(这三个组件是必须有的,另外还有很多可选的组件 interceptor、channel selector、sink processor 等后面会介绍)。
Source 消耗由外部(如 Web 服务器)传递给它的 Event。外部以 Flume Source 识别的格式向 Flume 发送 Event。例如,Avro Source 可接收从 Avro 客户端(或其他 FlumeSink)接收 Avro Event。用 Thrift Source 也可以实现类似的流程,接收的 Event 数据可以是任何语言编写的只要符合 Thrift 协议即可。
当 Source 接收 Event 时,它将其存储到一个或多个 channel。该 channel 是一个被动存储器(或者说叫存储池),可以存储 Event 直到它被 Sink 消耗。『文件 channel』就是一个例子 - 它由本地文件系统支持。sink 从 channel 中移除 Event 并将其放入外部存储库(如 HDFS,通过 Flume 的 HDFS Sink 实现)或将其转发到流中下一个 Flume Agent(下一跳)的 Flume Source。
Agent 中的 source 和 sink 与 channel 存取 Event 是异步的。
Flume 的 Source 负责消费外部传递给它的数据(比如 web 服务器的日志)。外部的数据生产方以 Flume Source 识别的格式向 Flume 发送 Event。
提示:Source 消耗由外部传递给它的 Event,这句话听起来好像 Flume 只能被动接收 Event,实际上 Flume 也有 Source 是主动收集 Event 的,比如:Spooling Directory Source 、Taildir Source 。
复杂流
Flume 可以设置多级 Agent 连接的方式传输 Event 数据。也支持扇入和扇出的部署方式,类似于负载均衡方式或多点同时备份的方式。
提示:这里必须解释一下,第一句的意思是可以部署多个 Agent 组成一个数据流的传输链。第二句要知道扇入(多对一)和扇出(一对多)的概念,就是说 Agent 可以将数据流发到多个下级 Agent,也可以从多个 Agent 发到一个 Agent 中。
其实他们就是想告诉你,你可以根据自己的业务需求来任意组合传输日志的 Agent 流,引用一张后面章节的图,这就是一个扇入方式的 Flume 部署方式,前三个 Agent 的数据都汇总到一个 Agent4 上,最后由 Agent4 统一存储到 HDFS。
可靠性
Event 会在每个 Agent 的 Channel 上进行缓存,随后 Event 将会传递到流中的下一个 Agent 或目的地(比如 HDFS)。只有成功地发送到下一个 Agent 或目的地后 Event 才会从 Channel 中删除。这一步保证了 Event 数据流在 Flume Agent 中传输时端到端的可靠性。
Flume 使用事务来保证 Event 的可靠传输。Source 和 Sink 对 Channel 提供的每个 Event 数据分别封装一个事务用于存储和恢复,这样就保证了数据流的集合在点对点之间的可靠传输。在多层架构的情况下,来自前一层的 sink 和来自下一层的 Source 都会有事务在运行以确保数据安全地传输到下一层的 Channel 中。
可恢复性
Event 数据会缓存在 Channel 中用来在失败的时候恢复出来。Flume 支持保存在本地文件系统中的『文件 channel』,也支持保存在内存中的『内存 Channel』,『内存 Channel』显然速度会更快,缺点是万一 Agent 挂掉『内存 Channel』中缓存的数据也就丢失了。
Flume 的应用
假设电子商务 Web 应用程序要分析特定区域的客户行为。为此,他们需要将可用的日志数据移入 Hadoop 进行分析。Apache Flume 在这里为我们提供了帮助。
Flume 用于将应用程序服务器生成的日志数据以更高的速度移入 HDFS。
Flume 的优点
这是使用 Flume 的优点:
- 使用 Apache Flume,我们可以将数据存储到任何集中存储(HBase,HDFS)中。
- 当传入数据的速率超过可以将数据写入目的地的速率时,Flume 充当数据生产者和集中存储之间的中介,并在它们之间提供稳定的数据流。
- Flume 提供了上下文路由功能。
- Flume 中的事务是基于通道的,其中为每个消息维护两个事务(一个发送者和一个接收者)。它保证了可靠的消息传递。
- Flume 是可靠的,容错的,可扩展的,可管理的和可定制的。
Flume 的特点
Flume 的一些显着功能如下:
- Flume 有效地将来自多个 Web 服务器的日志数据提取到集中存储(HDFS,HBase)中。
- 使用 Flume,我们可以将来自多个服务器的数据立即放入 Hadoop。
- 除日志文件外,Flume 还用于导入由社交网站(如 Facebook 和 Twitter)以及电子商务网站(如 Amazon 和 Flipkart)生成的大量事件数据。
- Flume 支持大量的源和目标类型。
- Flume 支持多跳流,扇入扇出流,上下文路由等。
- Flume 可以水平缩放。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论