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参数 |
参考
课程内容来自:南京大学+星环科技课程,大数据大数据理论与实践课程
Apache Flume 是一个分布式系统,用于高效收集、聚合和传输大量日志数据。它由Source、Channel和Sink三部分组成,通过Event进行数据传输。Source负责从各种数据源获取数据,如日志、Kafka等;Channel作为临时存储,确保数据可靠性;Sink则将数据写入目标存储,如HDFS、Kafka。Flume支持多层架构,适用于构建复杂的数据流,提供高可用性和灵活性。在实际应用中,可以根据需求配置不同类型的Source、Channel和Sink来构建适合的数据采集流程。
2428

被折叠的 条评论
为什么被折叠?



