大数据-18 Flume HelloWorld 实现Source Channel Sink 控制台流式收集

点一下关注吧!!!非常感谢!!持续更新!!!

🚀 AI篇持续更新中!(长期更新)

目前2025年06月13日更新到: AI炼丹日志-29 - 字节跳动 DeerFlow 深度研究框架 私有部署 测试上手 架构研究,持续打造实用AI工具指南!📐🤖

💻 Java篇正式开启!(300篇)

目前2025年06月11日更新到: Java-44 深入浅出 Nginx - 底层进程机制 Master Worker 机制原理 常用指令 MyBatis 已完结,Spring 已完结,深入浅出助你打牢基础!

📊 大数据板块已完成多项干货更新(300篇):

包括 Hadoop、Hive、Kafka、Flink、ClickHouse、Elasticsearch 等二十余项核心组件,覆盖离线+实时数仓全栈! 目前2025年06月13日更新到: 大数据-278 Spark MLib - 基础介绍 机器学习算法 梯度提升树 GBDT案例 详解

📊 大数据板块已完成多项干货更新(300篇):

包括 Hadoop、Hive、Kafka、Flink、ClickHouse、Elasticsearch 等二十余项核心组件,覆盖离线+实时数仓全栈! 目前2025年06月13日更新到: 大数据-278 Spark MLib - 基础介绍 机器学习算法 梯度提升树 GBDT案例 详解

章节内容

上一节我们完成的内容:

  • Flume 简介
  • Flume 组件的介绍
  • Flume 架构、核心组件
  • Flume 下载、安装、配置

背景介绍

这里是三台公网云服务器,每台 2C4G,搭建一个Hadoop的学习环境,供我学习。

  • 2C4G 编号 h121
  • 2C4G 编号 h122
  • 2C2G 编号 h123

文档推荐

除了官方文档以外,这里有一个写的很好的中文文档: flume.liyifeng.org/

基本介绍

Apache Flume 是一个分布式、可靠、可用性高的系统,主要用于高效采集、聚合和传输日志数据到集中式存储系统(如 HDFS、HBase 等)。它主要应用于 大数据日志采集场景,常与 Hadoop 生态系统一起使用。

核心特性

  • 可扩展性:支持多级代理(Agent),可横向扩展
  • 可靠性:支持事务机制,保证数据不丢失
  • 灵活性:Source/Channel/Sink 可组合
  • 容错机制:支持 failover 与 load balancing
  • 高吞吐量:支持异步批量传输,低延迟高吞吐

核心组件

Flume 的数据流模型中,Source、Channel、Sink 是三个最关键的组成部分,构成了从数据产生 → 缓存中转 → 最终写入 的整个流水线。

Source(数据源)

负责采集数据并将其包装成 Event(包含头部和正文),常见类型有:

  • exec(监听命令行输出)
  • netcat(基于 socket)
  • syslog、http、kafka、avro、spooldir(监控目录)

详细介绍的话有如下的:

  • exec:执行 shell 命令,如 tail -F,采集系统日志、文本输出
  • spooldir:监控目录中的新文件,一次读入且不修改原文件,日志文件转储收集
  • netcat:监听 TCP 端口,简单 socket 数据采集
  • avro:接收其他 Flume agent 发送的 Avro 数据,跨 Flume Agent 转发
  • kafka:从 Kafka 消费数据,实时流式采集
  • http:接收 HTTP 请求,IoT 数据、WebHook 接收
  • syslog:接收 Syslog 协议日志,系统安全与操作日志采集

配置示例如下:

shell 复制代码
agent.sources.r1.type = exec
agent.sources.r1.command = tail -F /var/log/syslog

Channel(通道)

数据的临时存储缓冲区,起到削峰填谷、流控的作用。支持以下几种类型:

  • memory(高性能,适合低丢失容忍)
  • file(数据持久化,适合可靠性要求高)
  • jdbc channel(较少使用)

详细的内容有如下的:

  • memory:存储在 JVM 堆内,速度快,易丢数据,数据可容忍丢失(测试、非核心日志)
  • file:落盘保存,数据持久化,可靠性高,核心日志、不能丢失的数据
  • jdbc:基于数据库的 Channel,不常用,复杂度高
  • kafka(自定义):Kafka 作为中转通道,高并发、高解耦场景

常见的配置如下所示:

shell 复制代码
agent.channels.c1.type = memory
agent.channels.c1.capacity = 1000            # 最大缓存事件数
agent.channels.c1.transactionCapacity = 100  # 每次事务提交最多事件数

Sink(下沉)

负责将 Event 发送到目标系统,如:

  • HDFS、HBase、Kafka、ElasticSearch、Solr、Hive 等

详细的配置如下所示:

  • hdfs:写入 Hadoop HDFS 文件系统,日志归档、数据湖落地
  • kafka:推送到 Kafka topic,实时流处理、接入 Storm/Flink
  • logger:输出到控制台,调试使用
  • avro:向下游 Flume 发送数据,多级传输场景
  • elasticsearch:写入到 ES,日志检索与分析
  • hbase:写入 HBase 表,高并发 NoSQL 存储
  • file_roll:本地滚动文件写入,简单备份、本地存档

示例的配置如下:

shell 复制代码
agent.sinks.s1.type = hdfs
agent.sinks.s1.hdfs.path = hdfs://namenode/flume/logs/%Y/%m/%d/
agent.sinks.s1.hdfs.rollInterval = 60       # 每隔60秒滚动一个新文件
agent.sinks.s1.hdfs.fileType = DataStream

数据流向

text 复制代码
数据源(WebServer、App日志) 
      ↓
   Source(监听)
      ↓
   Channel(缓存)
      ↓
   Sink(写入 HDFS 等)
  • Source:数据采集,支持 exec/http/kafka 等,tail、监听端口、消费 Kafka
  • Channel:中间缓冲,支持 memory/file 等,内存缓存、文件持久
  • Sink:数据下沉,写入外部系统,HDFS、Kafka、ES

使用场景

  • Web 日志采集:采集 Apache/Nginx 等日志到 HDFS
  • 应用系统日志:收集 Java 应用或服务日志到 Kafka
  • IoT 数据采集:与 Kafka 联动,实现高频数据注入
  • 数据湖构建:日志流式写入 HDFS 或 Parquet

类似对比

  • Flume:面向 Hadoop,稳定成熟,批量日志 → HDFS
  • Logstash:插件丰富,支持结构化处理,日志 → ElasticSearch
  • Filebeat:轻量,低资源占用。容器或边缘日志收集
  • Kafka Connect:与 Kafka 深度集成,数据同步

Flume 是面向日志传输领域的老牌工具,尤其适合 Hadoop 系统的数据注入,具备如下优势:

  • 架构清晰,可扩展强
  • 与 Hadoop 原生集成
  • 适合海量、批量日志传输

但在对实时性、结构化、复杂处理有需求的场景中,可以考虑 Logstash、Kafka Connect、Flink 等替代或补充。

HelloWorld

我们要实现一个简单的conf,完成如下的目的: 监听本机 8888 端口,Flume 将监听的数据实时显示在控制台

  • 使用 telnet 工具可以向 8888 端口发送数据
  • 监听端口数据 选择 netcat source
  • Channel 选择 memory
  • 数据实时显示 选择 logger sink

安装工具

如果你已经安装了,可以跳过

shell 复制代码
sudo apt install telnet

检查端口是否被占用,如果占用了,换一个端口,根据你的实际情况。

shell 复制代码
lsof -i:8888

基本示例

text 复制代码
# agent名称
agent.sources = r1
agent.channels = c1
agent.sinks = s1

# source
agent.sources.r1.type = exec
agent.sources.r1.command = tail -F /var/log/nginx/access.log
agent.sources.r1.channels = c1

# channel
agent.channels.c1.type = memory
agent.channels.c1.capacity = 1000
agent.channels.c1.transactionCapacity = 100

# sink
agent.sinks.s1.type = hdfs
agent.sinks.s1.hdfs.path = hdfs://namenode/flume/logs
agent.sinks.s1.channel = c1
agent.sinks.s1.hdfs.fileType = DataStream
agent.sinks.s1.hdfs.writeFormat = Text
agent.sinks.s1.hdfs.rollInterval = 60

配置文件

我的目录都放倒了 flume_test 下,方便我后续的归档。

shell 复制代码
cd /opt/wzk/flume_test
vim flume-netcat-logger.conf

写入如下的内容:

shell 复制代码
# a1是agent的名称。source、channel、sink的名称分别为:r1 c1 k1
a1.sources = r1
a1.channels = c1
a1.sinks = k1

# source
a1.sources.r1.type = netcat
# 注意这里的IP的地址!!!!!!!!!!
a1.sources.r1.bind = h122.wzk.icu
a1.sources.r1.port = 8888

# channel
a1.channels.c1.type = memory
a1.channels.c1.capacity = 10000
a1.channels.c1.transactionCapacity = 100

# sink
a1.sinks.k1.type = logger
# source、channel、sink之间的关系
a1.sources.r1.channels = c1
a1.sinks.k1.channel = c1

这里对上述的内容进行一点点介绍: Memory Channel 是使用内存缓冲 Event 的 Channel 实现。速度比较快速,容量会受到 JVM 内存大小的限制,可靠性不高。 适用于允许丢失数据,但对性能要求较高的日志采集业务。

启动服务

配置完毕后,我们启动服务。

shell 复制代码
$FLUME_HOME/bin/flume-ng agent --name a1 \
--conf-file flume-netcat-logger.conf \
-Dflume.root.logger=INFO,console

上述的参数解释:

  • name 定义Agent的名字,要与参数文件一致
  • conf-file 指定参数文件位置
  • -D 表示 Flume 运行时动态修改 flume.root.logger 参数属性值,并将控制台日志打印级别设置为INFO。

发送数据

连接到 8888 进行数据的发送!

shell 复制代码
telnet h122.wzk.icu 8888

查看结果

Flume收到了消息,可以观察控制台输出 此时!我们的第一个HelloWorld已经完毕!

相关推荐
李明一.10 分钟前
Spark 在小众日常场景中的实战应用:从小店数据到社区活动
大数据·分布式·spark
萌新小码农‍23 分钟前
SpringBoot新闻项目学习day3--后台权限的增删改查以及权限管理分配
spring boot·后端·学习
想用offer打牌1 小时前
一站式了解责任链模式🥹
后端·设计模式·架构
小码编匠1 小时前
面向工业应用的点云相机控制接口库(含C#调用示例)
后端·c#·.net
Luffe船长1 小时前
springboot将文件插入到指定路径文件夹,判断文件是否存在以及根据名称删除
java·spring boot·后端·spring
蓝宗林2 小时前
Spark入门到实践
大数据·分布式·spark
程序员清风3 小时前
RocketMQ发送消息默认是什么策略,主同步成功了就算成功了?异步写?还是要大部分从都同步了?
java·后端·面试
罗政3 小时前
小区物业管理系统源码+SpringBoot + Vue (前后端分离)
vue.js·spring boot·后端
杨同学technotes3 小时前
Spring Kafka进阶:实现多态消息消费
后端·kafka
雨中散步撒哈拉3 小时前
3、做中学 | 二年级上期 Golang数据类型和常量/变量声明使用
开发语言·后端·golang