大数据理论与实践7 分布式数据采集工具Flume

Apache Flume 是一个分布式系统,用于高效收集、聚合和传输大量日志数据。它由Source、Channel和Sink三部分组成,通过Event进行数据传输。Source负责从各种数据源获取数据,如日志、Kafka等;Channel作为临时存储,确保数据可靠性;Sink则将数据写入目标存储,如HDFS、Kafka。Flume支持多层架构,适用于构建复杂的数据流,提供高可用性和灵活性。在实际应用中,可以根据需求配置不同类型的Source、Channel和Sink来构建适合的数据采集流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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 Sourceexec监听Linux命令的标准输出
Spooling Directory Sourcespooldir监听目录下的新文件,不支持断点续传和嵌套目录
Taildir SourceTAILDIR监听目录或文件,支持断点续传
Avro Sourceavro启动Avro Server,通过RPC接收Avro数据,可与上一级Agent连接
HTTP Sourcehttp启动Http Server,通过Http Post接收数据
Kafka Sourceorg.apache.flume.source.kafka.KafkaSource从Kafka中读取数据
JMS Sourcejms从JMS源中读取数据

Channel组件

Event中转暂存区,存储Source采集但未被Sink读取的Event。
为了平衡Source采集、Sink读取的速度,可视为Flume内部的消息队列。线程安全并具有事务性,支持Source写失败重写和Sink读失败重读。

类型Type(参数)说明
Memory Channelmemory内存作为Channel,读写速度快,但存储容量小,数据易丢失
File Channelfile本地磁盘文件作为Channel,存储容量大,数据较安全,但读写速度较慢
JDBC Channeljdbc关系数据库作为Channel,内置Derby,数据安全可恢复
Kafka Channelorg.apache.flume.channel.kafka.KafkaChannelKafka作为Channel,读写速度快,存储容量大,容错能力强(生产中常用)

Sink组件

从Channel读取Event,将其写入外部存储,或传输到下一阶段的Agent。
一个Sink只能从一个Channel中读取Event。Sink成功读取Event后,向Channel提交事务,Event被删除,否则Channel会等待Sink重新读取。

类型Type(参数)说明
Avro Sinkavro常用于对接下一阶段的Avro Source,通过RPC实现端到端的批量压缩数据传输
HDFS Sinkhdfs将Event写入HDFS,可生成文本文件,支持数据压缩
Kafka Sinkorg.apache.flume.sink.kafka.KafkaSink将Event写入Kafka指定主题
FileRoll 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运行

  1. 编写Agent配置文件(*.conf)
  2. 在命令行运行Agent、进入Flume安装目录、运行以下命令
bin/flume-ng agent --conf conf --conf-file example.conf
--name a1 -D flume.root.logger = INFO, console
Command OptionsDescription
–confAgent配置文件目录
–conf-fileAgent配置文件名(*.conf)
–nameAgent名称
-DJVM参数

参考

课程内容来自:南京大学+星环科技课程,大数据大数据理论与实践课程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值