1. 简介
Flume 是 Cloudera 提供的一个高可用高可靠分布式的海量日志采集聚合和传输的系统.
Flume 支持在日志系统中定制各类数据发送方用于收集数据, 同时 Flume 提供对数据进行简单的处理并写到各种数据接受方的能力.
当前 Flume 有两个版本, Flume 0.9X 版本的统称 Flume-og,Flume1.X 版本的统称 Flume-ng(由于 Flume-ng 经过重大重构与 Flume-og 有很大不同, 使用时请注意区分)
两个版本的区别
Flume-og 采用了多 Master 的方式, 为了保证配置数据的一致性, Flume 引入了 ZooKeeper 用于保存配置文件, 在配置文件发生变化时, ZooKeeper 可以通知 Flume Master 节点, Flume Master 间使用 gossip 协议同步数据.
Flume-og 中读入线程同样做写操作, 如果写出慢的话将阻塞 Flume 接收数据的能力.
Flume-ng 最明显的改动就是取消了集中管理配置的 Master 和 Zookeeper, 变为一个纯粹的传输工具.
Flume-ng 读入数据和写出数据现在由不同的工作线程处理(Runner), 这种异步的设计使读入线程可以顺畅的工作而无需关注下游的任何问题.
Flume 的优势
1.Flume 可以将应用产生的数据存储到任何集中存储器中, 比如 HDFS,HBase.
2. 当收集数据的速度超过写入数据的时候, 此时 Flume 会在数据生产者和数据收容器间做出调整, 保证其能够在两者之间提供平稳的数据.
3.Flume 的管道是基于事务的, 保证了数据在传送和接收时的一致性.
Flume 的应用场景
1.Flume 可以高效的将多个网站服务器的日志信息存入 HDFS/HBase 中.
2.. 除了日志信息以外, Flume 也可以用来收集规模宏大的社交网络节点事件数据(比如 facebooktwitter 亚马逊)
* 本文只阐述 Flume-ng 版本的组件及使用.
2.Flume 的结构模型
Flume 由 SourceChannel,Sink 三大组件组成.
Source: 从 Client 上收集数据并对数据进行格式化, 以 Event(事件)的形式传递给单个或多个 Channel.
Flume 的数据流由事件 (Event) 充当, 事件是 Flume 的基本数据单位, 事件携带日志数据(字节数组形式, 包含头信息).
Channel: 短暂的存储容器, 将从 Source 接收到的 Event 进行缓存直到被 Sink 消费掉, Channel 是 Source 和 Sink 之间的桥梁, Channal 是一个完整的事务, 能保证了数据在收发时的一致性, 并且一个 Channel 可以同时和任意数量的 Source 和 Sink 建立连接.
Sink: 从 Channel 中消费数据 (Event) 并传递到存储容器 (HbaseHDFS) 或其他的 Source 中.
Flume 以 Agent 为最小的独立运行单元, Agent 依赖于 JVM, 一个 Agent 的运行就伴随一个 JVM 实例的产生.
* 一台机器可以运行多个 Agent, 一个 Agent 中可以包含多个 SourceSink.
各个组件的实现
*Flume 提供了大量内置的 SourceChannel 和 Sink 类型, 不同类型的 Source,Channel 和 Sink 可以自由组合. 组合方式基于用户设置的配置文件.
Source 组件
Channel 组件
Sink 组件
* 不同类型的 SourceChannelSink 有其特定的属性, 配置时需要根据实际情况去设置.
3.Flume 的使用
1. 安装
Flume 依赖于 JDK6 以上的版本, 因此首先要安装 JDK 并且添加环境变量 JAVA_HOME
从 Flume 官网 http://flume.apache.org/download.html 中下载对应的 tar.gz 安装包 , 将下载后的安装包放到 Linux 中并进行解压(系统软件放到 / usr 目录下)
添加 Flume 的 bin 目录到 PATH 环境变量中以便使用
2. 配置文件
在 flume 的 conf 目录下创建 flume.conf, 在该配置文件中进行组件的配置.
- # 指定 Agent 的组件名称
- agentA.sources = x
- agentA.sinks = z
- agentA.channels = y
- #Source 组件的相关配置
- agentA.sources.x.type = spooldir
- agentA.sources.x.spoolDir = /data
- #Sink 组件的相关配置
- agentA.sinks.z.type = logger
- #Channel 组件的相关配置
- agentA.channels.y.type = memory
- agentA.channels.y.capacity = 1000
- agentA.channels.y.transactionCapacity = 100
- # 绑定 Source 和 Sink 到 Channel 上
- agentA.sources.x.channels = y
- agentA.sinks.z.channel = y
使用 Spooling Directory Source 类型, 监听 / data 目录下的文件.
使用 Memory Channel, 事件存储在内存中.
使用 Logger Sink, 将数据写入 Flume 的 log 中.
* 当 / data 目录新增文件后, Spooling Directory Source 就会读取文件中的数据, 然后将数据以 Event 形式传给 Channel,Logger Sink 再消费 Channel 中的事件将数据写入 Log 中.
3 . 启动
flume-ng agent -c $ 指定 flume 的 conf 目录 -f $ 指定使用的配置文件 --name $ 指定要启动的 agent 名称
来源: https://www.cnblogs.com/funyoung/p/8682057.html