Flume-NG是一个分布式,可靠,可用的系统,它能够将不同数据源的海量日志数据进行高效收集,聚合,移动,最后存储到一个中心化数据存储系统中。由原来的Flume OG到现在的Flume NG,进行了架构重构,并且现在NG版本完全不兼容原来的OG版本。经过架构重构后,Flume NG更像是一个轻量的小工具,非常简单,容易适应各种方式日志收集,并支持故障切换和负载均衡。
架构设计要点
水槽的架构主要有一下几个核心概念:
事件:一个数据单元,带有一个可选的消息头
流量:事件从源点到达目的点的迁移的抽象
客户:操作位于源点处的事件,将其发送到Flume Agent
代理:一个独立的水槽进程,包含组件来源,渠道,水槽
来源:用来消费传递到该组件的事件
频道:中转事件的一个临时存储,保存有源组件传递过来的事件
Sink:从Channel中读取并移除事件,将事件传递到Flow Pipeline中的下一个Agent(如果有的话)
任何完整的大数据平台,一般都会包括以下的基本处理过程:
数据采集
数据 ETL
数据存储
数据计算/分析
数据展现
其中,数据采集是所有数据系统必不可少的,随着大数据越来越被重视,数据采集的挑战也
变的尤为突出。这其中包括:
数据源多种多样
数据量大,变化快
如何保证数据采集的可靠性的性能
如何避免重复数据
如何保证数据的质量
Flume 的数据流由事件(Event)贯穿始终。事件是 Flume 的基本数据单位,它携带日志数据(字
节数组形式)并且携带有头信息,这些 Event 由 Agent 外部的 Source 生成,当 Source 捕获事
件后会进行特定的格式化,然后 Source 会把事件推入(单个或多个)Channel 中。你可以把
Channel 看作是一个缓冲区,它将保存事件直到 Sink 处理完该事件。Sink 负责持久化日志或
者把事件推向另一个 Source。
Flume 以 agent 为最小的独立运行单位。一个 agent 就是一个 JVM。单 agent 由 Source、Sink
和 Channel 三大组件构成,如下图:
vent
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
Silk 负责将 event 传输到吓一跳或最终目的地,成功后将 event 从 channel 移除
不同类型的 silk
存储 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 失败时转移到另一个
1、Flume 的安装非常简单,只需要解压即可,当然,前提是已有 Hadoop 环境上传安装包到
数据源所在节点上
然后解压 tar -zxvf apache-flume-1.8.0-bin.tar.gz
然后进入 flume 的目录,修改 conf 下的 flume-env.sh,在里面配置 JAVA_HOME
2、根据数据采集的需求配置采集方案,描述在配置文件中(文件名可任意自定义)
3、指定采集方案配置文件,在相应的节点上启动 flume agent
先用一个最简单的例子来测试一下程序环境是否正常
在$FLUME_HOME/agentconf 目录下创建一个数据采集方案,该方案就是从一个网络端口
收集数据,也就是创一个任意命名的配置文件如下:netcat-logger.properties
五个部分:
1、指定这个agent的各个组件的名称以及agent的名称
2、指定source
3、指定channel
4、指定sink
5、指定这些source,channle, sink之间的关系
a1.sources = r1
a1.sinks = k1
a1.channels = c1
a1.sources.r1.type = netcat
a1.sources.r1.bind = localhost
a1.sources.r1.port = 44444
a1.sinks.k1.type = logger
a1.channels.c1.type = memory
a1.channels.c1.capacity = 1000
a1.channels.c1.transactionCapacity = 100
a1.sources.r1.channels = c1
a1.sinks.k1.channel = c1
在$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.con 指定我们所描述的采集方案
-n a1 指定我们这个 agent 的名字
先要往 agent 的 source 所监听的端口上发送数据,让 agent 有数据可采
例如在本机节点,使用 telnet localhost 44444 命令就可以
输入两行数据:
hello huangbo
1 2 3 4