概述
Flume 的数据流由事件(Event)贯穿始终。事件是 Flume 的基本数据单位,它携带日志数据(字节数组形式)并且携带有头信息,这些 Event 由 Agent 外部的 Source 生成,当 Source 捕获事件后会进行特定的格式化,然后 Source 会把事件推入(单个或多个)Channel 中。你可以把 Channel 看作是一个缓冲区,它将保存事件直到 Sink 处理完该事件。Sink 负责持久化日志或者把事件推向另一个 Source。
Flume 以 agent 为最小的独立运行单位。
一个 agent 就是一个 JVM。
单 agent 由 Source、Sink 和 Channel 三大组件构成。
Flume 三大核心组件
Event
Event 是 Flume 数据传输的基本单元。
Flume 以事件的形式将数据从源头传送到最终的目的地。
Event 由可选的 header 和载有数据的一个 byte array 构成。
载有的数据度 flume 是不透明的。
Header 是容纳了 key-value 字符串对的无序集合,key 在集合内是唯一的。
Header 可以在上下文路由中使用扩展
Client
Client 是一个将原始 log 包装成 events 并且发送他们到一个或多个 agent 的实体 目的是从数据源系统中解耦 Flume 在 Flume 的拓扑结构中不是必须的。
Client 实例 flume log4j Appender 可以使用 Client SDK(org.apache.flume.api)定制特定的 Client
Agent
一个 Agent 包含 source,channel,sink 和其他组件。
它利用这些组件将 events 从一个节点传输到另一个节点或最终目的地 agent 是 flume 流的基础部分。
flume 为这些组件提供了配置,声明周期管理,监控支持。
Source
Source 负责接收 event 或通过特殊机制产生 event,并将 events 批量的放到一个或多个
Channel
包含 event 驱动和轮询两种类型。
不同类型的 Source 与系统集成的 Source:Syslog,Netcat,监测目录池 自动生成事件的 Source:Exec 用于 Agent 和 Agent 之间通信的 IPC source:avro,thrift source 必须至少和一个 channel 关联
Agent 之 Channel
Channel 位于 Source 和 Sink 之间,用于缓存进来的 event 当 sink 成功的将 event 发送到下一个的 channel 或最终目的 event 从 channel 删除 不同的 channel 提供的持久化水平也是不一样的
Memory channel:volatile(不稳定的)
File Channel:基于 WAL(预写式日志 Write-Ahead logging)实现 JDBC channel:基于嵌入式 database 实现 channel 支持事务,提供较弱的顺序保证 可以和任何数量的 source 和 sink 工作
Agent 之 Sink
Sink 负责将 event 传输到吓一跳或最终目的地,成功后将 event 从 channel 移除 不同类型的 sink 存储 event 到最终目的地终端 sink,比如 HDFS,HBase 自动消耗的 sink 比如 null sink
用于 agent 间通信的 IPC:sink:Avro 必须作用于一个确切的 channel
Iterator
作用于 Source,按照预设的顺序在必要地方装饰和过滤 events
Channel Selector
允许 Source 基于预设的标准,从所有 channel 中,选择一个或者多个 channel
Sink Processor
多个 sink 可以构成一个 sink group sink processor 可以通过组中所有 sink 实现负载均衡也可以在一个 sink 失败时转移到另一个
Flume 经典部署方案
单Agent采集数据
多Agent串联
多Agent合并串联
多路复用
Flume安装部署
1、 Flume 的安装非常简单,只需要解压即可,当然,前提是已有 Hadoop 环境上传安装包到数据源所在节点上
然后解压 tar -zxvf apache-flume-1.8.0-bin.tar.gz
然后进入 flume 的目录,修改 conf 下的 flume-env.sh,在里面配置 JAVA_HOME
2、 根据数据采集的需求配置采集方案,描述在配置文件中(文件名可任意自定义)
3、 指定采集方案配置文件,在相应的节点上启动 flume agent
先用一个最简单的例子来测试一下程序环境是否正常
1、 在$FLUME_HOME/agentconf 目录下创建一个数据采集方案,该方案就是从一个网络端口收集数据,也就是创一个任意命名的配置文件如下:netcat-logger.properties 文件内容如下:
2、 启动 agent 去采集数据:
在$FLUME_HOME 下执行如下命令:
bin/flume-ng agent -c conf -f agentconf/netcat-logger.properties -n a1
Dflume.root.logger=INFO,console
-c conf 指定 flume 自身的配置文件所在目录
-f conf/netcat-logger.perproties 指定我们所描述的采集方案
-n a1 指定我们这个 agent 的名字
3、测试
先要往 agent 的 source 所监听的端口上发送数据,让 agent 有数据可采例如在本机节点,使用 telnet localhost 44444 命令就可以如果这个命令的执行过程中发现抛出异常说:command not found 那么请使用:sudo yum -y install telnet 这个命令进行 telnet 的安装输入两行数据:
hello huangbo
1 2 3 4
4、Flume-Agent 接收的结果: