Flume 日志收集系统介绍及安装
本文及后续所有文章都以 1.8.0 做为版本讲解和入门学习
# 什么是 Flume
Flume 是由 Cloudera 软件公司提供的一个高可用的,高可靠的,分布式的海量日志采集、聚合和传输的系统,后与 2009 年被捐赠了 apache 软件基金会,为 hadoop 相关组件之一。尤其近几年随着 flume 的不断被完善以及升级版本的逐一推出,特别是 flume-ng; 同时 flume 内部的各种组件不断丰富,用户在开发的过程中使用的便利性得到很大的改善,现已成为 apache top 项目之一。
apache Flume 是一个从可以收集例如日志,事件等数据资源,并将这些数量庞大的数据从各项数据资源中集中起来存储的工具 / 服务。flume 具有高可用,分布式,配置工具,其设计的原理也是基于将数据流,如日志数据从各种网站服务器上汇集起来存储到 HDFS,HBase 等集中存储器中。
# Flume 特点
1、可靠性:当节点出现故障时,日志能够被传送到其他节点上而不会丢失。Flume 提供了三种级别的可靠性保障,所有的数据以 event 为单位传输,从强到弱依次分别为:end-to-end(收到数据 agent 首先将 event 写到磁盘上,当数据传送成功后,再删除;如果数据发送失败,可以重新发送。),Store on failure(这也是 scribe 采用的策略,当数据接收方 crash 时,将数据写到本地,待恢复后,继续发送),Best effort(数据发送到接收方后,不会进行确认)。
2、可扩展性:Flume 采用了三层架构,分别为 agent,collector 和 storage,每一层均可以水平扩展。其中,所有 agent 和 collector 由 master 统一管理,这使得系统容易监控和维护,且 master 允许有多个(使用 ZooKeeper 进行管理和负载均衡),这就避免了单点故障问题。
3、可管理性:所有 agent 和 colletor 由 master 统一管理,这使得系统便于维护。多 master 情况,Flume 利用 ZooKeeper 和 gossip,保证动态配置数据的一致性。用户可以在 master 上查看各个数据源或者数据流执行情况,且可以对各个数据源配置和动态加载。Flume 提供了 web 和 shell script command 两种形式对数据流进行管理。
4、功能可扩展性:用户可以根据需要添加自己的 agent,collector 或者 storage。此外,Flume 自带了很多组件,包括各种 agent(file, syslog 等),collector 和 storage(file,HDFS 等)。
5、文档丰富,社区活跃:Flume 已经成为 Hadoop 生态系统的标配,它的文档比较丰富,社区比较活跃,方便我们学习。
# 基本概念
# Event
- Event 是 Flume 数据传输的基本单元,是数据,如果输入的是文本文件,event 是一行记录。
- Flume 以事件 (Event) 的形式将数据从源头传输到最终的目的。
- Event 由可选的 header 和载有数据的一个 byte array 构成。
载有的数据对 Flume 是不透明的。
Header 是容纳了 key-value 字符串对的无序集合,key 在集合内是唯一的。
Header 可以在上下文路由中使用扩展。
# source
- Source 负责接收 event 或通过特殊机制产生 event,并将 events 批量的放到一个或多个 Channel。
- Source 包含 event 驱动和轮询两种类型。
- Source 有不同的类型。
与系统集成的 Source:Syslog,NetCat。
自动生成事件的 Source:Exec 用于 Agent 和 Agent 之间的通信的 IPC Source:Avro、Thrift。 - Source 必须至少和一个 Channel 关联。
# channel
- Channel 位于 Source 和 Sink 之间,用于缓存进来的 event。
- 当 Sink 成功的将 event 发送到下一跳的 Channel 或最终目的地,event 才 Channel 中移除。
- 不同的 Channel 提供的持久化水平也是不一样的:
Memory Channel:volatile。
File Channel:基于 WAL 实现。
JDBC Channel:基于嵌入 Database 实现。 - Channel 支持事物,提供较弱的顺序保证。
- Channel 可以和任何数量的 Source 和 Sink 工作。
# Sink
- Sink 负责将 event 传输到下一跳或最终目的,成功完成后将 event 从 Channel 移除。
- 有不同类型的 Sink:
存储 event 到最终目的的终端 Sink。比如 HDFS,HBase。
自动消耗的 Sink。比如:Null Sink。
用于 Agent 间通信的 IPC sink:Avro。
# 安装
wget http://archive.apache.org/dist/flume/1.8.0/apache-flume-1.8.0-bin.tar.gz
# 部署视图
# 文件修改
在 /opt/software/flume-1.8.0/conf/source-netcat.conf 添加该文件,并添加如下内容
# a1 代表一个flume 给每个组件匿名
a1.sources=r1
a1.channels=c1
a1.sinks=s1
# 指定source 的数据来源以及堆外开放的端口
a1.sources.r1.type=netcat
a1.sources.r1.bind=node113
a1.sources.r1.port=8888
# 指定a1的channels基于内存
a1.channels.c1.type=memory
# 指定a1的sinks 输出到控制台
a1.sinks.s1.type=logger
# 绑定a1 sources和channle 的关系
a1.sources.r1.channels=c1
# 绑定a1 sinks 和 channel 的关系
a1.sinks.s1.channel=c1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 把 flume 添加到环境变量
export FLUME_HOME=/opt/software/flume-1.8.0
export PATH=$PATH:$FLUME_HOME/bin
export FLUME_HOME
2
3
# 启动
flume-ng agent -n a1 -c /opt/software/flume-1.8.0/conf -f /opt/software/flume-1.8.0/conf/source-netcat.conf -Dflume.root.logger=INFO,console
- agent 运行一个 flume
- - n a1 的名称,要和配置文件里面的一样
- -c 代表配置文件在那个目录
- - f 代表具体的配置文件路径
- -Dflume.root.logger 设置一个 JAVA 系统属性值,常见的 -Dflume.root.logger=INFO,console
# 测试
node103 发送消息
[root@node103 ~]# nc node113 8888
hello world
OK
2
3
node113 收到
2021-05-17 16:40:18,381 (SinkRunner-PollingRunner-DefaultSinkProcessor) [INFO - org.apache.flume.sink.LoggerSink.process(LoggerSink.java:95)] Event: { headers:{} body: 68 65 6C 6C 6F 20 77 6F 72 6C 64 hello world }