Flume简介
Flume是一个分布式海量数据采集、聚合和传输系统。可以看做一个管道系统,从数据源到数据目的地。数据源可以是文件、日志、传感器等,目的地可以是HDFS、NoSQL等等。
数据流模型:Source → Channel(暂存) → Sink(取数据并交给目的地)。套件组配很灵活,随意组配。
在Channel这块,支持事务,支持重读重写,保证消息传递的可靠性。
支持高可用,Agent(Source+Channel+Sink=Agent)主备切换。
主要用于非关系型数据采集。
原理
基本概念
- 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
组件
Source组件
对接各种外部数据源,将采集到的数据封装成Event,然后写入Channel。
一个Source可向多个Channel发送Event。Flume内置类型丰富的Source,同时用户可自定义Source。
类型 | Type(参数) | 说明 |
---|---|---|
Exec Source | exec | 监听Linux命令的标准输出 |
Spooling Directory Source | spooldir | 监听目录下的新文件,不支持断点续传和嵌套目录 |
Taildir Source | TAILDIR | 监听目录或文件,支持断点续传 |
Avro Source | avro | 启动Avro Server,通过RPC接收Avro数据,可与上一级Agent连接 |
HTTP Source | http | 启动Http Server,通过Http Post接收数据 |
Kafka Source | org.apache.flume.source.kafka.KafkaSource | 从Kafka中读取数据 |
JMS Source | jms | 从JMS源中读取数据 |
Channel组件
Event中转暂存区,存储Source采集但未被Sink读取的Event。
为了平衡Source采集、Sink读取的速度,可视为Flume内部的消息队列。线程安全并具有事务性,支持Source写失败重写和Sink读失败重读。
类型 | Type(参数) | 说明 |
---|---|---|
Memory Channel | memory | 内存作为Channel,读写速度快,但存储容量小,数据易丢失 |
File Channel | file | 本地磁盘文件作为Channel,存储容量大,数据较安全,但读写速度较慢 |
JDBC Channel | jdbc | 关系数据库作为Channel,内置Derby,数据安全可恢复 |
Kafka Channel | org.apache.flume.channel.kafka.KafkaChannel | Kafka作为Channel,读写速度快,存储容量大,容错能力强(生产中常用) |
Sink组件
从Channel读取Event,将其写入外部存储,或传输到下一阶段的Agent。
一个Sink只能从一个Channel中读取Event。Sink成功读取Event后,向Channel提交事务,Event被删除,否则Channel会等待Sink重新读取。
类型 | Type(参数) | 说明 |
---|---|---|
Avro Sink | avro | 常用于对接下一阶段的Avro Source,通过RPC实现端到端的批量压缩数据传输 |
HDFS Sink | hdfs | 将Event写入HDFS,可生成文本文件,支持数据压缩 |
Kafka Sink | org.apache.flume.sink.kafka.KafkaSink | 将Event写入Kafka指定主题 |
File | Roll Sink file_roll | 将Event写入本地文件系统 |
数据流
最基本的数据流:直接落盘
多个Agent相连:
一个source分成多个Channel:
一个Agent分多个Agent:
典型的双层架构,中间架一层做聚合,不会产生那么多小文件:
Flume架构
单层架构
优点:架构简单,使用方便,占用资源较少
缺点:
- 如果采集的数据源或Agent较多,将Event写入到HDFS会产生很多小文件
- 外部存储升级维护或发生故障,需对采集层的所有Agent做处理,人力成本较高,系统稳定性较差
- 系统安全性较差(数据源到目的地直接联系,权限需要在里面直接写明)
- 数据源管理较混乱
多层架构
优点:
- 各类日志数据分层处理,架构清晰,运维高效,降低人工误操作风险
- 避免产生过多小文件,提高系统稳定性和处理能力
- 对外不会暴露系统关键信息,降低攻击风险,显著提升安全性(不直接连,权限分开)
- 各关联系统易于升级维护(更换外部存储时修改很少)
缺点:
部署相对复杂,占用资源较多
使用
安装
需要JDK1.7及以上版本。
安装验证:在Flume安装目录下,运行命令./bin/flume-ng version,查看Flume版本信息
Agent配置
示例:
/* 定义Agent组件名 */
a1.sources = r1
a1.sinks = k1
a1.channels = c1
/* 配置Souce */
a1.sources.r1.type = netcat // Source类型为netcat,监听指定的Socket端口
a1.sources.r1.bind = localhost //主机名
a1.sources.r1.port = 44444
/* 配置Sink */
a1.sinks.k1.type = logger // Sink类型为logger,将Event输出到控制台
/* 配置Channel */
a1.channels.c1.type = memory // Channel类型为memory,Event缓存在内存中
a1.channels.c1.capacity = 1000 //总共允许放1000条
a1.channels.c1.transactionCapacity = 100 //一次写入channel的事务数目
/* 设置Source、Sink和Channel的关系 */
a1.sources.r1.channels = c1
a1.sinks.k1.channel = c1 // 一个Sink只能连接一个Channel
Flume运行
- 编写Agent配置文件(*.conf)
- 在命令行运行Agent、进入Flume安装目录、运行以下命令
bin/flume-ng agent --conf conf --conf-file example.conf
--name a1 -D flume.root.logger = INFO, console
Command Options | Description |
---|---|
–conf | Agent配置文件目录 |
–conf-file | Agent配置文件名(*.conf) |
–name | Agent名称 |
-D | JVM参数 |
参考
课程内容来自:南京大学+星环科技课程,大数据大数据理论与实践课程