大数据理论篇 | 分布式数据采集工具Flume
分布式数据采集工具Flume
零、 写在前面
- Flume和Sqoop是Hadoop数据集成和收集系统,两者的定位不一样。
- Flume有集群的概念,是一种分布式,可靠且可用的服务,主要用于高效地收集,汇总和移动大量日志数据。
- 而Sqoop是一种用于在Apache Hadoop和结构化数据存储(如关系数据库)之间高效传输批量数据的工具(没有集群的概念)。Sqoop有助于在hadoop和其他数据库之间移动数据,并且可以并行传输数据以提高性能。
- 两者可以做同样的工作,但是各自擅长的领域有所不同,因此应用场景也不同。
一、 Flume简介
1)什么是Flume
- Flume是一个分布式海量数据采集、聚合和传输系统
- Flume 是一种分布式的日志收集框架,用于高效收集,聚合和移动大量且多数据源的日志数据。
- 可理解为数据管道系统,用来汇聚数据,将同类型的数据汇聚到同一个数据管道中
- 特点:
- 基于事件的海量数据采集
- 数据流模型:Source -> Channel -> Sink
- 事务机制:支持重读重写,保证消息传递的可靠性
- 内置丰富插件:轻松与各种外部系统集成
- 高可用:Agent主备切换
- Java实现:开源,优秀的系统设计
2)应用场景
二、 Flume原理
1)基本概念
- Event:事件,最小数据传输单元,由Header和Body组成
- Agent:代理,JVM进程,最小运行单元,由Source、Channel、Sink三个基本组件构成,负责将外部数据源产生的数据以Event的形式传输到目的地
- Source:负责对接各种外部数据源,将采集到的数据封装成Event,然后写入Channel
- Channel:Event暂存容器,负责保存Source发送的Event,直至被Sink成功读取
- Sink:负责从Channel读取Event,然后将其写入外部存储,或传输给下一阶段的Agent
- 映射关系:1个Source -> 多个Channel,1个Channel -> 多个Sink,1个Sink -> 1个Channel
2)Flume基本组件
- Source组件
- 对接各种外部数据源,将采集到的数据封装成Event,然后写入Channel
- 一个Source可向多个Channel发送Event
- Flume内置类型丰富的Source,同时用户可自定义Source
- Channel组件
- Event中转暂存区,存储Source采集但未被Sink读取的Event
- 为了平衡Source采集、Sink读取的速度,可视为Flume内部的消息队列
- 线程安全并具有事务性,支持Source写失败重写和Sink读失败重读
- Sink组件
- 从Channel读取Event,将其写入外部存储,或传输到下一阶段的Agent
- 一个Sink只能从一个Channel中读取Event
- Sink成功读取Event后,向Channel提交事务,Event被删除,否则Channel会等待Sink重新读取
3)Flume数据流
- Agent 是 Flume 的核心,也就是说 Flume 的最小单位就是 Agent。它有三个核心组件:Source、Channel、Sink。通过这些组件,event 可以从一个地方流向另一个地方。如图:
- Source是数据的收集端,负责把数据捕获到进行特殊的格式化,将数据封装成 event,然后推送到 channel 中。Flume 内置了很多格式:Avro, log4j, syslog, netcat 和 http post等。
注:可以让应用程序同已有的Source直接打交道,如AvroSource,SyslogTcpSource。 如果内置的Source无法满足需要, Flume还支持自定义Source。 - Channel 是连接 Source 和 Sink 的中间通道,可以把它看做数据缓冲(数据队列),它可以将事件(event)暂存在内存中,也可以持久化到文件中,直到 Sink 处理完该事件。 常用:MemoryChannel 和 FileChannel。
- Sink 从 Channel 中取出数据,可以把数据以向文件系统、数据库、 hadoop存数据, 也可以是其他 Agent 的Source。在日志数据较少时,可以将数据存储在文件系统中,并且设定一定的时间间隔保存数据。
- Flume传输的数据的基本单位是event,如果是文本文件,通常是一行记录,这也是事务的基本单位。
- Flume的数据流由事件(Event)贯穿始终。事件是Flume的基本数据单位,它携带日志数据(字节数组形式)并且携带有头信息,这些Event由Agent外部的Source,比如上图中的Web Server生成。当Source捕获事件后会进行特定的格式化,然后Source会把事件推入(单个或多个)Channel中。你可以把Channel看作是一个缓冲区,它将保存事件直到Sink处理完该事件。Sink负责持久化日志或者把事件推向另一个Source。不同类型的Source,Channel和Sink可以自由组合。组合方式基于用户设置的配置文件,非常灵活。比如:Channel可以把事件暂存在内存里,也可以持久化到本地硬盘上。Sink可以把日志写入HDFS, HBase,甚至是另外一个Source等等。
多个 Agent顺序连接:
多个Agent数据汇聚到一个 Agent 里面。
多级流:syslog,java,nginx、tomcat等混合在一起的日志流开始流入一个 agent 后,可以agent中将混杂的日志流分开,然后给每种日志建立一个自己的传输通道:
Load Balance功能:下图中Agent1是一个路由节点,负责将 Channel 暂存的 Event 均衡到对应的多个Sink组件上,而每个Sink组件分别连接到一个独立的Agent上:
4)Flume架构
a. 单层架构
- 优点:架构简单,使用方便,占用资源较少
- 缺点:
- 如果采集的数据源或Agent较多,将Event写入到HDFS会产生很多小文件
- 外部存储升级维护或发生故障,需对采集层的所有Agent做处理,人力成本较高,系统稳定性较差
- 系统安全性较差
- 数据源管理较混乱
b. 多层架构
- 优点
- 各类日志数据分层处理,架构清晰,运维高效,降低人工误操作风险
- 避免产生过多小文件,提高系统稳定性和处理能力
- 对外不会暴露系统关键信息,降低攻击风险,显著提升安全性
- 各关联系统易于升级维护
- 缺点:部署相对复杂,占用资源较多
5)FLume可靠性
- 当节点出现故障时,日志能够被传送到其他节点上而不会丢失。Flume提供了三种级别的可靠性保障,从强到弱依次分别为:
- End-to-End(收到数据agent首先将event写到磁盘上,当数据传送成功后,再删除;如果数据发送失败,可以重新发送。)
- Store on failure(这也是scribe采用的策略,当数据接收方crash时,将数据写到本地,待恢复后,继续发送)
- Best Effort(数据发送到接收方后,不会进行确认)。
6)Flume可扩展性
- Flume采用了三层架构,分别为Agent,Collector和Storage,每一层均可以水平扩展。
- 所有Agent和Collector由Master统一管理,这使得系统容易监控和维护,且Master允许有多个(使用ZooKeeper进行管理和负载均衡),这就避免了单点故障问题。
- 功能可扩展性:
- 用户可以根据需要添加自己的Agent,Collector或者Storage。
- Flume自带了很多组件,包括各种Agent(file, syslog等),Collector和Storage(file,HDFS等)
7)Flume可管理性
- 所有agent和colletor由master统一管理,这使得系统便于维护。
- 多master情况,Flume利用ZooKeeper和gossip,保证动态配置数据的一致性。
- 用户可以在master上查看各个数据源或者数据流执行情况,且可以对各个数据源配置和动态加载。
- Flume提供了web 和shell script command两种形式对数据流进行管理。
8)Flume可恢复性
还是靠Channel。推荐使用FileChannel,事件持久化在本地文件系统里(性能较差)
三、 Flume使用
参考资料:
[1]Flume 原理,分析,架构